मुख्य सामग्री पर जाएं
मॉड्यूल 4 · पाठ 4 का 4पाठ्यक्रम में 16/57~12 min
मॉड्यूल पाठ (4/4)

दूसरे के अंदर एक क्वेरी: सबक्वेरीज़

आपने सीखा है कि कैसे निकालना, फ़िल्टर करना, समूह बनाना, जुड़ना और रूपांतरित करना है। वहाँ एक अंतिम मौलिक विचार है: एक प्रश्न को दूसरे के अंदर डालना। ये हैं सबक्वेरीज़ कहलाते हैं और ये वह चरण हैं जो आपको प्रश्नों का उत्तर देने देते हैं जैसे "कौन औसत से अधिक कमाता है?" या "किस विभाग में कोई है एक प्रोजेक्ट सौंपा गया?"।

मूल वाक्यविन्यास

एक सबक्वेरी कोष्ठक में लिपटी एक SELECT होती है, जिसका उपयोग एकल के स्थान पर किया जाता है मान या किसी अन्य क्वेरी में मानों की सूची:

SQL
-- Find who earns MORE THAN THE COMPANY AVERAGE:
SELECT first_name, last_name, salary
FROM   employees
WHERE  salary > (SELECT AVG(salary) FROM employees);

इंजन सबसे पहले सबक्वेरी चलाता है - SELECT AVG(salary) FROM employees एकल संख्या लौटाता है - और फिर उस संख्या का उपयोग बाहरी WHERE में करता है मानो आपने इसे हाथ से लिखा हो। वास्तव में यही फायदा है: आप ऐसा करते हैं पहले से औसत जानने की आवश्यकता नहीं है, SQL आपके लिए इसकी गणना करता है।

तीन सबसे आम "प्रकार"

1. सबक्वेरी एकल मान लौटा रही है

उपरोक्त उदाहरण: सबक्वेरी एक पंक्ति, एक कॉलम उत्पन्न करती है (जिसे कहा जाता है)। अदिश). आप इसका उपयोग =, >, < इत्यादि के साथ करते हैं।

SQL
-- Employee with the highest salary:
SELECT first_name, last_name
FROM   employees
WHERE  salary = (SELECT MAX(salary) FROM employees);

2. सबक्वेरी एक सूची लौटा रही है

सबक्वेरी एक कॉलम, कई पंक्तियाँ उत्पन्न करती है। आप इसके साथ प्रयोग करें IN (...):

SQL
-- Departments that have at least one employee:
SELECT name
FROM   departments
WHERE  id IN (SELECT DISTINCT department_id
              FROM employees
              WHERE department_id IS NOT NULL);

3. "तालिका" के रूप में सबक्वेरी (FROM)

एक सबक्वेरी FROM में एक तालिका का स्थान भी ले सकती है। यह उपयोगी है समुच्चय की पूर्व-गणना करें और फिर उन्हें फ़िल्टर करें या जोड़ें:

SQL
-- Departments with average salary above 40000:
SELECT d.name, medie.stipendio_medio
FROM   departments AS d
JOIN  (SELECT department_id, AVG(salary) AS stipendio_medio
       FROM employees
       GROUP BY department_id) AS medie
   ON d.id = medie.department_id
WHERE  medie.stipendio_medio > 40000;

सबक्वेरी या जॉइन? कब कौन सा उपयोग करना है

अक्सर वही परिणाम JOIN या सबक्वेरी के साथ प्राप्त किया जा सकता है। अंगूठे का नियम:

  • किसी अन्य तालिका की संपत्ति के आधार पर एक तालिका की पंक्तियों को फ़िल्टर करना ("कर्मचारी जिनके विभाग हैं..."), IN (subquery) बहुत पठनीय है।
  • परिणाम में एकाधिक तालिकाओं से कॉलम को संयोजित करने के लिए, JOIN का उपयोग करें।
  • एक समुच्चय की गणना करने के लिए और इसे एक सीमा ("ऊपर) के रूप में उपयोग करें औसत"), स्केलर सबक्वेरी स्वाभाविक पसंद है।

व्यवहार में आप दोनों देखेंगे: SQL इंजन अक्सर उन्हें समान रूप से अनुकूलित करता है रास्ता. वह फॉर्म चुनें जो सबसे अच्छा पढ़ता हो।

इसे अजमाएं

व्यायाम#sql.m4.l4.e1
प्रयास: 0लोड हो रहा है...

उन कर्मचारियों का पहला नाम (प्रथम_नाम), अंतिम नाम (अंतिम_नाम) और वेतन (वेतन) ढूंढें जो कंपनी के औसत से बिल्कुल अधिक कमाते हैं। तीन स्तंभ.

संपादक लोड हो रहा है...
संकेत दिखाएँ

प्रतिस्थापित करें ? कर्मचारियों से सबक्वेरी SELECT AVG(वेतन) के साथ - यह सीमा के रूप में उपयोग करने के लिए एक एकल संख्या लौटाता है।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम की समीक्षा करें

व्यायाम#sql.m4.l4.e2
प्रयास: 0लोड हो रहा है...

उन विभागों के नाम (विभागों का नाम) सूचीबद्ध करें जिनमें कम से कम एक कर्मचारी का वेतन 50000 से अधिक है। आईएन के साथ एक सबक्वेरी का उपयोग करें। वर्णानुक्रम में ऑर्डर करें.

संपादक लोड हो रहा है...
संकेत दिखाएँ

आंतरिक सबक्वेरी उन विभागों की आईडी लौटाती है जिनमें वेतन > 50000 वाले कर्मचारी हैं। फिर बाहरी क्वेरी पर WHERE id IN (...) है।

3 प्रयासों के बाद समाधान उपलब्ध है