सबक्वेरी एक टेबल परत करते
आणि शेवटी, तिसरा पर्याय म्हणजे जेव्हा सबक्वेरी संपूर्ण टेबल परत करते. हा सर्वात सामान्य पर्याय आहे.
बर्याचदा अशी परिस्थिती असते जेव्हा आपल्याला विशिष्ट टेबलमध्ये थोडासा बदल करायचा असतो. आणि त्यानंतरच दुरुस्त केलेल्या टेबलमध्ये सामील व्हा (जॉइन ऑन ऑपरेटर वापरून).
चला सर्वात सोप्या केसपासून सुरुवात करूया, जिथे आम्ही दोन टेबल जोडून जोडले:
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
आणि तुम्हाला कदाचित आठवत असेल, टास्क टेबलमध्ये अशी कार्ये आहेत जी कोणालाही नियुक्त केलेली नाहीत: employee_id NULL आहे .
चला एक दुरुस्त केलेले टेबल तयार करू , जिथे आम्ही सर्व हँगिंग टास्क डायरेक्टरला देऊ (त्याचा आयडी = 4).
हे करण्यासाठी, आम्ही IFNULL() फंक्शन वापरतो :
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task
आणि या क्वेरीचा परिणाम:
आयडी | कर्मचारी_आयडी | नाव | अंतिम मुदत |
---|---|---|---|
१ | १ | फ्रंटएंडवरील बगचे निराकरण करा | 2022-06-01 |
2 | 2 | बॅकएंडवरील बगचे निराकरण करा | 2022-06-15 |
3 | ५ | कॉफी विकत घ्या | 2022-07-01 |
4 | ५ | कॉफी विकत घ्या | 2022-08-01 |
५ | ५ | कॉफी विकत घ्या | 2022-09-01 |
6 | 4 | ऑफिसची साफसफाई करा | (निरर्थक) |
७ | 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
टास्क या शब्दाऐवजी , आम्ही कंस लिहिला आणि त्यामध्ये विनंती मुख्य भाग ठेवला.
तसे, नेस्टेड क्वेरीसाठी उपनाव t (उर्फ) खूप उपयुक्त होता. नेस्टेड क्वेरी, सारणीच्या विपरीत, त्याचे स्वतःचे नाव नसते, म्हणून उपनाव अगदी स्थानाबाहेर आहे.
आणि अशा क्वेरीचा परिणाम येथे आहे:
आयडी | नाव | व्यवसाय | पगार | वय | रुजू दिनांक | आयडी | कर्मचारी_आयडी | नाव |
---|---|---|---|---|---|---|---|---|
१ | इव्हानोव्ह इव्हान | प्रोग्रामर | 100000 | २५ | 2012-06-30 | १ | १ | फ्रंटएंडवरील बगचे निराकरण करा |
2 | पेट्रोव्ह पेत्र | प्रोग्रामर | 80000 | 23 | 2013-08-12 | 2 | 2 | बॅकएंडवरील बगचे निराकरण करा |
4 | राबिनोविच मोइशा | दिग्दर्शक | 200000 | 35 | 2015-05-12 | 6 | 4 | ऑफिसची साफसफाई करा |
4 | राबिनोविच मोइशा | दिग्दर्शक | 200000 | 35 | 2015-05-12 | ७ | 4 | जीवनाचा आनंद घे |
५ | किरिएन्को अनास्तासिया | कार्यालय व्यवस्थापक | 40000 | २५ | 2015-10-10 | 4 | ५ | कॉफी विकत घ्या |
५ | किरिएन्को अनास्तासिया | कार्यालय व्यवस्थापक | 40000 | २५ | 2015-10-10 | ५ | ५ | कॉफी विकत घ्या |
५ | किरिएन्को अनास्तासिया | कार्यालय व्यवस्थापक | 40000 | २५ | 2015-10-10 | 3 | ५ | कॉफी विकत घ्या |
6 | वास्का | मांजर | 1000 | 3 | 2018-11-11 | 8 | 6 | जीवनाचा आनंद घे |
आमच्या डायरेक्टरकडे "ऑफिस साफ करण्याचे" काम आहे, मला वाटते की ते त्वरीत कोणीतरी त्याला सोपवेल :) विथ ऑपरेटर वापरून
तसे, MySQL च्या आवृत्ती 8 पासून प्रारंभ करून, तुम्हाला यापुढे तुमच्या सर्व उपक्वेरी अंतिम क्वेरीमध्ये ठेवण्याची गरज नाही. ते स्वतंत्रपणे सादर केले जाऊ शकतात. यासाठी WITH स्टेटमेंट वापरले जाते .
हे तुम्हाला व्हर्च्युअल टेबल (नावाची क्वेरी) तयार करण्यास अनुमती देते आणि त्याचे स्वरूप टेम्पलेटद्वारे दिले जाते:
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 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