SQL मध्ये नेस्टेड क्वेरी
SQL भाषा तुम्हाला एक क्वेरी दुसऱ्या क्वेरीमध्ये नेस्ट करण्याची परवानगी देते. यामुळे कोडची वाचनीयता मोठ्या प्रमाणात कमी झाली असली तरीही एक खूप मोठी क्वेरी लिहिणे शक्य होते जे काहीतरी मोठे आणि जटिल करेल.
सबक्वेरींद्वारे किती मूल्ये परत केली जातात यावर अवलंबून, ते लागू केले जाऊ शकतात ते क्षेत्र बदलते. एकूण तीन पर्याय आहेत:
- सबक्वेरी एक एकल मूल्य (एक स्तंभ आणि एक पंक्ती) मिळवते.
- सबक्वेरी मूल्यांची सूची मिळवते (एक स्तंभ असलेली सारणी).
- सबक्वेरी एक टेबल (अनेक स्तंभ, कितीही पंक्ती) मिळवते.
चला प्रत्येक केससाठी एक उदाहरण पाहू.
स्केलर परिणामासह सबक्वेरी
कर्मचारी टेबलवरून आमच्या सर्व कर्मचाऱ्यांची यादी शोधू ज्यांचे पगार कंपनीच्या सरासरीपेक्षा जास्त आहेत. आपण ते कसे करू शकतो?
आम्हाला आधीच माहित असल्यास आम्ही कर्मचार्यांना त्यांच्या पगाराची सरासरीशी तुलना करून सहजपणे फिल्टर करू शकतो. त्याच वेळी, आम्ही आधीच एक क्वेरी लिहिली आहे जी आम्हाला कंपनीच्या कर्मचार्यांच्या सरासरी पगाराची गणना करण्यास अनुमती देते. चला ते लक्षात ठेवूया:
SELECT AVG(salary) FROM employee
नंतर MySQL ने आम्हाला मूल्य परत केले: 76833.3333 .
ज्यांचे वेतन सरासरीपेक्षा जास्त आहे अशा सर्व कर्मचाऱ्यांची यादी आता कशी शोधायची? हे देखील खूप सोपे आहे:
SELECT * FROM employee
WHERE salary > 76833.3333
या क्वेरीचा परिणाम असेल:
आयडी | नाव | व्यवसाय | पगार |
---|---|---|---|
१ | इव्हानोव्ह इव्हान | प्रोग्रामर | 100000 |
2 | पेट्रोव्ह पेत्र | प्रोग्रामर | 80000 |
4 | राबिनोविच मोइशा | दिग्दर्शक | 200000 |
आणि आता आम्ही 76833 मूल्याऐवजी पहिली विनंती बदलून दोन्ही विनंत्या एकत्र करतो:
SELECT * FROM employee
WHERE salary > (SELECT AVG(salary) FROM employee)
या क्वेरीचा परिणाम समान असेल:
आयडी | नाव | व्यवसाय | पगार |
---|---|---|---|
१ | इव्हानोव्ह इव्हान | प्रोग्रामर | 100000 |
2 | पेट्रोव्ह पेत्र | प्रोग्रामर | 80000 |
4 | राबिनोविच मोइशा | दिग्दर्शक | 200000 |
मूल्यांच्या सूचीसह सबक्वेरी
तुम्हाला आठवत आहे का की एकेकाळी आमच्याकडे एक कार्य होते - एका टेबलवरून सर्व रेकॉर्ड शोधणे ज्यासाठी दुसर्याकडून कोणतेही संबंधित रेकॉर्ड नाहीत?
हे चित्र देखील होते:
माझी चूक नसल्यास, कार्य खालीलप्रमाणे आहे: कर्मचारी टेबलमधील सर्व कर्मचार्यांची सूची प्रदर्शित करा ज्यासाठी कार्य सारणीमध्ये कोणतीही कार्ये नाहीत .
दोन टप्प्यांत उपायही शोधूया.
प्रथम, एक क्वेरी लिहूया जी टास्क टेबलमध्ये टास्क असलेल्या सर्व कर्मचाऱ्यांचे आयडी परत करेल. फक्त दोन गोष्टी लक्षात ठेवा:
- डुप्लिकेट काढा - DISTINCT कीवर्ड वापरा.
- निकालातून NULL मूल्ये काढून टाका.
SELECT DISTINCT employee_id FROM task
WHERE employee_id IS NOT NULL
आणि येथे आम्हाला अशा विनंतीचा एक सुंदर परिणाम मिळाला:
कर्मचारी_आयडी |
---|
१ |
2 |
५ |
4 |
6 |
चला तात्पुरते क्रम म्हणून सोयीसाठी लिहू: 1,2,5,4,6. आता दुसरी क्वेरी लिहूया - कर्मचार्यांच्या टेबलवर, जी पहिल्या यादीमध्ये ज्यांचा आयडी नाही अशा कर्मचाऱ्यांची यादी परत करेल:
SELECT * FROM employee
WHERE id NOT IN (1,2,5,4,6)
आणि या क्वेरीचा परिणाम:
आयडी | नाव | व्यवसाय | पगार | वय | रुजू दिनांक |
---|---|---|---|---|---|
3 | इव्हानोव्ह सेर्गे | परीक्षक | 40000 | तीस | 2014-01-01 |
आणि आता, मागील उदाहरणाप्रमाणे, तुम्ही आयडी सूचीऐवजी पहिल्या विनंतीचा मुख्य भाग बदलून दोन्ही विनंत्या एकत्र करू शकता.
SELECT * FROM employee
WHERE id NOT IN (
SELECT DISTINCT employee_id FROM task
WHERE employee_id IS NOT NULL
)
GO TO FULL VERSION