सबक्वायरी एक टेबल देता है
और अंत में, तीसरा विकल्प तब होता है जब सबक्वायरी पूरी तालिका लौटाती है। यह सबसे आम विकल्प है।
बहुत बार ऐसे हालात होते हैं जब हम किसी तालिका को थोड़ा छोटा करना चाहते हैं। और उसके बाद ही दूसरे के साथ सही तालिका में शामिल हों (JOIN ON ऑपरेटर का उपयोग करके)।
आइए सबसे सरल मामले से शुरू करें, जहाँ हम दो तालिकाओं को एक JOIN के साथ जोड़ते हैं:
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
और जैसा कि आप शायद याद करते हैं, कार्य तालिका में ऐसे कार्य हैं जो किसी को नहीं सौंपे गए हैं: कर्मचारी_आईडी NULL है ।
चलिए एक सही टेबल बनाते हैं , जहाँ हम सभी हैंगिंग टास्क डायरेक्टर को असाइन करते हैं (उनकी आईडी = 4)।
ऐसा करने के लिए, हम IFNULL() फ़ंक्शन का उपयोग करते हैं :
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline 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 | 4 | कार्यालय की सफाई करें | (व्यर्थ) |
7 | 4 | जीवन का आनंद लें | (व्यर्थ) |
8 | 6 | जीवन का आनंद लें | (व्यर्थ) |
सही किए गए सेल को लाल रंग से चिह्नित किया गया है।
अब अपनी संशोधित तालिका को क्वेरी में प्रतिस्थापित करते हैं:
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
कार्य तालिका के बजाय ।
ऐसा अनुरोध कुछ ऐसा दिखाई देगा:
SELECT * FROM employee e JOIN (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline
FROM task
) t ON e.id = t.emploee_id
कार्य शब्द के बजाय , हमने कोष्ठक लिखे और उनमें अनुरोध निकाय रखा।
वैसे, नेस्टेड क्वेरी के लिए उपनाम टी (उपनाम) बहुत उपयोगी था। नेस्टेड क्वेरी, तालिका के विपरीत, इसका अपना नाम नहीं है, इसलिए उपनाम बहुत जगह से बाहर है।
और यहाँ ऐसी क्वेरी का परिणाम है:
पहचान | नाम | पेशा | वेतन | आयु | शामिल होने की तारीख | पहचान | कर्मचारी आयडी | नाम |
---|---|---|---|---|---|---|---|---|
1 | इवानोव इवान | प्रोग्रामर | 100000 | 25 | 2012-06-30 | 1 | 1 | दृश्यपटल पर एक बग ठीक करें |
2 | पेट्रोव पेट्र | प्रोग्रामर | 80000 | 23 | 2013-08-12 | 2 | 2 | बैकएंड पर एक बग ठीक करें |
4 | राबिनोविच मोइशा | निदेशक | 200000 | 35 | 2015-05-12 | 6 | 4 | कार्यालय की सफाई करें |
4 | राबिनोविच मोइशा | निदेशक | 200000 | 35 | 2015-05-12 | 7 | 4 | जीवन का आनंद लें |
5 | किरिंको अनास्तासिया | कार्यालय प्रबंधक | 40000 | 25 | 2015-10-10 | 4 | 5 | कॉफी खरीदें |
5 | किरिंको अनास्तासिया | कार्यालय प्रबंधक | 40000 | 25 | 2015-10-10 | 5 | 5 | कॉफी खरीदें |
5 | किरिंको अनास्तासिया | कार्यालय प्रबंधक | 40000 | 25 | 2015-10-10 | 3 | 5 | कॉफी खरीदें |
6 | वास्का | बिल्ली | 1000 | 3 | 2018-11-11 | 8 | 6 | जीवन का आनंद लें |
हमारे निदेशक के पास "कार्यालय की सफाई" का कार्य है, मुझे लगता है कि वह जल्दी से किसी को इसे सौंपने के लिए ढूंढ लेंगे :) ऑपरेटर के साथ का उपयोग करना
वैसे, MySQL के संस्करण 8 से शुरू होकर, अब आपको अपनी सभी उपश्रेणियों को अंतिम क्वेरी के ठीक अंदर नहीं रखना है। उन्हें अलग से किया जा सकता है। इसके लिए with Statement का प्रयोग किया जाता है ।
यह आपको एक आभासी तालिका (क्वेरी नामित) बनाने की अनुमति देता है और इसका स्वरूप एक टेम्पलेट द्वारा दिया जाता है:
WITH Name AS (request)
कई बार ऐसा होता है जब आपकी सबक्वेरी में बिना नाम वाले कॉलम होते हैं, जैसे कि COUNT(*), जिन्हें आपने कोई अद्वितीय नाम निर्दिष्ट नहीं किया है। इस स्थिति में, with स्टेटमेंट में सबक्वेरी के लिए नए कॉलम नाम निर्दिष्ट करने का विकल्प होता है।
इसका दूसरा रूप साँचे द्वारा दिया गया है:
WITH Name(column1, column2, …) AS (request)
आप जितने चाहें उतने वर्चुअल टेबल (नामित क्वेरी) का उपयोग कर सकते हैं और उनमें एक दूसरे को संदर्भित कर सकते हैं। आपके अनुरोध के सामान्य रूप में कुछ ऐसा होगा:
WITH name1 AS (request1),
name2 AS (request2),
name3 AS (request3)
SELECT * FROM name1 JOIN name2 ON …
अब चलिए हमारी डरावनी क्वेरी लेते हैं:
SELECT * FROM employee e JOIN (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline
FROM task
) t ON e.id = t.emploee_id
और इसे with कथन का उपयोग करके फिर से लिखें:
WITH task2(id, employee_id, name, deadline)
AS (SELECT id, IFNULL(employee_id, 4), name, deadline FROM task)
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id
या आप कॉलम नामों के बिना कर सकते हैं, लेकिन फिर आपको IFNULL() फ़ंक्शन के लिए उपनाम निर्दिष्ट करना होगा:
WITH task2 AS (
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task
)
SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id
GO TO FULL VERSION