आश्रित तालिका
अब हम अपने प्रश्नों को थोड़ा जटिल करते हैं। आइए हमारे डेटाबेस में हमारे कर्मचारियों के लिए कार्यों के साथ एक नई कार्य तालिका जोड़ें। और आइए देखें कि इसमें कौन सी प्रविष्टियाँ हैं:
SELECT * FROM task
ऐसे अनुरोध का परिणाम:
पहचान | कर्मचारी_आईडी | नाम | अंतिम तारीख |
---|---|---|---|
1 | 1 | दृश्यपटल पर एक बग ठीक करें | 2022-06-01 |
2 | 2 | बैकएंड पर एक बग ठीक करें | 2022-06-15 |
3 | 5 | कॉफी खरीदें | 2022-07-01 |
4 | 5 | कॉफी खरीदें | 2022-08-01 |
5 | 5 | कॉफी खरीद लेंगे | 2022-09-01 |
6 | (व्यर्थ) | कार्यालय की सफाई करें | (व्यर्थ) |
7 | 4 | जीवन का आनंद लें | (व्यर्थ) |
8 | 6 | जीवन का आनंद लें | (व्यर्थ) |
इस तालिका में केवल 4 स्तंभ हैं:
- आईडी - अद्वितीय कार्य संख्या (और तालिका में पंक्तियाँ);
- कर्मचारी_आईडी - कर्मचारी तालिका से कर्मचारी की आईडी जिसे कार्य सौंपा गया है;
- नाम - कार्य का नाम और विवरण;
- समय सीमा - वह समय जिसके द्वारा कार्य पूरा किया जाना चाहिए।
कुछ बारीकियों पर ध्यान दें। कार्य N6 में कर्मचारी_आईडी नहीं है, हमारे पास क्लीनर नहीं है। कार्य है, लेकिन कर्ता नहीं है। ऐसा होता है।
साथ ही, कार्य 6-9 की कोई निर्धारित समय सीमा नहीं है। ऐसा तब होता है जब किसी कार्य को नियमित और लगातार किया जाना चाहिए। उदाहरण के लिए, कार्यालय को हर दिन साफ करने की जरूरत है, लेकिन आपको हर दिन जीवन का आनंद लेने की भी जरूरत है :)
यदि एक तालिका दूसरी तालिका से आईडी का उपयोग करती है, तो ऐसी तालिका को आश्रित कहा जाता है ।
एकाधिक तालिकाओं के विरुद्ध क्वेरी
यहाँ हम टास्क टेबल में देखते हैं कि “जीवन का आनंद लेना” दो कार्य हैं। हमें कैसे पता चलेगा कि ये भाग्यशाली कौन हैं?
ऐसा करने के लिए, SQL में, आप एक बार में दो टेबल पर एक क्वेरी निष्पादित कर सकते हैं। सामान्य तौर पर, SQL में, आप एक ही समय में किसी भी तालिका को क्वेरी कर सकते हैं। ऐसे अनुरोध का सामान्य प्रारूप है:
SELECT columns
FROM Table 1, table 2, tableN
महत्वपूर्ण! यदि आप एक ही समय में कई तालिकाओं के लिए एक प्रश्न लिखते हैं, तो परिणामस्वरूप आपको तालिका पंक्तियों का तथाकथित कार्टेशियन उत्पाद मिलेगा। पहली तालिका की प्रत्येक पंक्ति को दूसरी तालिका की प्रत्येक पंक्ति से चिपका दिया जाएगा, और इसी तरह आगे भी।
अर्थात्, यदि आपके पास पहली तालिका में 5 पंक्तियाँ हैं और दूसरी में 10 पंक्तियाँ हैं, तो आपके पास कुल 50 पंक्तियाँ होंगी। जावा में, यह क्वेरी कुछ इस तरह दिखाई देगी:
for (String row1 : table1)
{
for (String row2 : table2)
{
System.out.println(row1 + row2);
}
}
आइए अपनी क्वेरी को एक साथ दो टेबल पर लिखें और देखें कि क्या होता है:
SELECT * FROM employee, task
और इस प्रश्न का परिणाम:
पहचान | नाम | पेशा | वेतन | आयु | पहचान | कर्मचारी | _पहचान | नाम | अंतिम तारीख |
---|---|---|---|---|---|---|---|---|---|
1 | इवानोव इवान | प्रोग्रामर | 100000 | 25 | 1 | 1 | दृश्यपटल पर एक बग ठीक करें | 2022-06-01 | |
2 | पेट्रोव पेट्र | प्रोग्रामर | 80000 | 23 | 1 | 1 | दृश्यपटल पर एक बग ठीक करें | 2022-06-01 | |
3 | इवानोव सर्गेई | टेस्टर | 40000 | तीस | 1 | 1 | दृश्यपटल पर एक बग ठीक करें | 2022-06-01 | |
4 | राबिनोविच मोइशा | निदेशक | 200000 | 35 | 1 | 1 | दृश्यपटल पर एक बग ठीक करें | 2022-06-01 | |
5 | किरिंको अनास्तासिया | कार्यालय प्रबंधक | 40000 | 25 | 1 | 1 | दृश्यपटल पर एक बग ठीक करें | 2022-06-01 | |
6 | वास्का | बिल्ली | 1000 | 3 | 1 | 1 | दृश्यपटल पर एक बग ठीक करें | 2022-06-01 | |
1 | इवानोव इवान | प्रोग्रामर | 100000 | 25 | 2 | 2 | बैकएंड पर एक बग ठीक करें | 2022-06-15 | |
2 | पेट्रोव पेट्र | प्रोग्रामर | 80000 | 23 | 2 | 2 | बैकएंड पर एक बग ठीक करें | 2022-06-15 | |
3 | इवानोव सर्गेई | टेस्टर | 40000 | तीस | 2 | 2 | बैकएंड पर एक बग ठीक करें | 2022-06-15 | |
4 | राबिनोविच मोइशा | निदेशक | 200000 | 35 | 2 | 2 | बैकएंड पर एक बग ठीक करें | 2022-06-15 | |
5 | किरिंको अनास्तासिया | कार्यालय प्रबंधक | 40000 | 25 | 2 | 2 | बैकएंड पर एक बग ठीक करें | 2022-06-15 |
हमारे पास कुल 48 परिणाम रेखाएँ हैं, लेकिन यहाँ मैंने केवल 11 दी हैं। अन्यथा, वहाँ बस पर्याप्त जगह नहीं होगी।
तीन बातों पर ध्यान दें:
- समान नाम वाले कॉलम: आईडी । यह आईडी कर्मचारी तालिका से और आईडी कार्य तालिका से है ।
- प्रत्येक तालिका की पंक्तियों को दोहराया जाता है। बाएँ स्तंभ में, ID 6 के बाद फिर से ID = 1 आता है।
- हमारे पास निरर्थक पंक्तियाँ हैं, उदाहरण के लिए, आईडी (कर्मचारी तालिका से) 6 है और उसी पंक्ति में कर्मचारी_आईडी 1 है।
अर्थहीन पंक्तियों को हटाना
हमारी परिणामी तालिका में बहुत अधिक पंक्तियाँ हैं , जो दो तालिकाओं के कर्मचारी और कार्य की सभी पंक्तियों का कार्टेशियन उत्पाद है।
तार्किक रूप से, यदि पंक्ति कर्मचारी_आईडी 3 है, तो उसे केवल कर्मचारी तालिका की पंक्ति से चिपकना चाहिए जहां आईडी 3 है। आइए इस गलतफहमी को दूर करने का प्रयास करें।
आइए इस तरह से एक प्रश्न लिखें:
SELECT * FROM employee, task
WHERE emploee.id = task.emploee_id
और इस प्रश्न का परिणाम:
पहचान | नाम | पेशा | वेतन | आयु | पहचान | कर्मचारी_आईडी | नाम | अंतिम तारीख |
---|---|---|---|---|---|---|---|---|
1 | इवानोव इवान | प्रोग्रामर | 100000 | 25 | 1 | 1 | दृश्यपटल पर एक बग ठीक करें | 2022-06-01 |
2 | पेट्रोव पेट्र | प्रोग्रामर | 80000 | 23 | 2 | 2 | बैकएंड पर एक बग ठीक करें | 2022-06-15 |
4 | राबिनोविच मोइशा | निदेशक | 200000 | 35 | 7 | 4 | जीवन का आनंद लें | (व्यर्थ) |
5 | किरिंको अनास्तासिया | कार्यालय प्रबंधक | 40000 | 25 | 3 | 5 | कॉफी खरीदें | 2022-07-01 |
5 | किरिंको अनास्तासिया | कार्यालय प्रबंधक | 40000 | 25 | 4 | 5 | कॉफी खरीदें | 2022-08-01 |
5 | किरिंको अनास्तासिया | कार्यालय प्रबंधक | 40000 | 25 | 5 | 5 | कॉफी खरीद लेंगे | 2022-09-01 |
6 | वास्का | बिल्ली | 1000 | 3 | 8 | 6 | जीवन का आनंद लें | (व्यर्थ) |
अच्छी खबर यह है कि अर्थहीन रेखाएं गायब हो गई हैं: पहले कॉलम से आईडी हमेशा कर्मचारी_आईडी के बराबर होती है।
बुरी खबर यह है कि जो कार्य किसी को नहीं सौंपे गए हैं, जैसे कि कार्यालय की सफाई, वे चले गए हैं। उनका कर्मचारी_आईडी NULL था, इसलिए WHERE किए जाने के बाद उन्हें छोड़ दिया गया।
GO TO FULL VERSION