📘 CodingMarble Learn

SQL समुच्चय फ़ंक्शन, GROUP BY, HAVING, ORDER BY और इक्वी-जॉइन

समुच्चय (मल्टी-रो) फ़ंक्शन कई पंक्तियाँ लेकर एक मान लौटाते हैं: MAX, MIN, SUM, AVG और COUNT। ये NULL मान छोड़ देते हैं, सिवाय COUNT(*) के, जो हर पंक्ति गिनता है। GROUP BY एक जैसे मान वाली पंक्तियों के समूह बनाता है, ताकि फ़ंक्शन हर समूह पर एक बार चले। HAVING समूहों को छाँटता है, जबकि WHERE समूह बनने से पहले अकेली पंक्तियाँ छाँटता है। ORDER BY परिणाम को बढ़ते या घटते क्रम में लगाता है। इक्वी-जॉइन दो तालिकाओं को वहाँ जोड़ता है जहाँ साझा स्तंभ बराबर हो।

🎬 कदम-दर-कदम कहानी

  1. समुच्चय फ़ंक्शन कई पंक्तियों को एक उत्तर में बदलते हैं।
  2. COUNT(स्तंभ) NULL छोड़ता है; COUNT(*) हर पंक्ति गिनता है।
  3. GROUP BY हर मान का एक ढेर बनाता है, और फ़ंक्शन हर ढेर पर चलता है।
  4. HAVING समूह छाँटता है; ORDER BY परिणाम क्रम में लगाता है।
  5. इक्वी-जॉइन दो तालिकाओं की पंक्तियाँ जोड़ता है जहाँ साझा स्तंभ बराबर हो।
  6. आपकी बारी: क्वेरी चुनें, उत्तर का अनुमान लगाएँ, बार देखें।

टिप: 3D दृश्य को घुमाने के लिए खींचें। ज़ूम के लिए दो उंगलियाँ इस्तेमाल करें।

🤔 आम शंकाएँ और उनके जवाब

तालिका में छह पंक्तियाँ हैं, फिर SUM एक पंक्ति क्यों देता है?

SUM समुच्चय फ़ंक्शन है: सब पंक्तियों को मिलाकर एक योग देता है।

AVG 43000 क्यों, 215000 ÷ 6 क्यों नहीं?

Kabir का वेतन NULL है और AVG NULL छोड़ता है। इसलिए 5 भरे मानों से भाग: 215000 ÷ 5 = 43000।

GROUP BY पंक्तियों के साथ असल में क्या करता है?

यह एक जैसे मान वाली पंक्तियों के ढेर (IT, HR, Sales) बनाता है। फिर फ़ंक्शन हर ढेर पर चलकर हर ढेर की एक पंक्ति देता है।

WHERE की जगह HAVING कब लगाएँ?

जब शर्त में समुच्चय फ़ंक्शन हो या शर्त समूह के बारे में हो (जैसे COUNT(*) > 1)। WHERE समूह बनने से पहले अकेली पंक्तियों पर चलता है।

क्या SELECT में न लिखे स्तंभ से ORDER BY कर सकते हैं?

हाँ, MySQL में तालिका के किसी भी स्तंभ या SUM(Salary) जैसे फ़ंक्शन से क्रम लगा सकते हैं।

जॉइन में WHERE भूल जाऊँ तो क्या होगा?

पहली तालिका की हर पंक्ति दूसरी की हर पंक्ति से जुड़ेगी (कार्टेशियन गुणनफल), और बहुत-सी ग़लत पंक्तियाँ आएँगी।

जॉइन में सिर्फ़ Dept की जगह E.Dept क्यों लिखें?

दोनों तालिकाओं में Dept स्तंभ है, इसलिए SQL को बताना पड़ता है कि कौन-सा।

समुच्चय फ़ंक्शन: MAX, MIN, AVG, SUM, COUNT

समुच्चय (मल्टी-रो) फ़ंक्शन पूरे स्तंभ पर चलकर एक मान लौटाता है। तालिका emp:

NameDeptSalary
AshaIT50000
RaviHR30000
MohanIT40000
ZoyaSales35000
KabirHRNULL
NehaIT60000
SELECT MAX(Salary) FROM emp;   -- 60000
SELECT MIN(Salary) FROM emp;   -- 30000
SELECT SUM(Salary) FROM emp;   -- 215000
SELECT AVG(Salary) FROM emp;   -- 43000  (215000 ÷ 5, NULL छूटा)

MAX और MIN पाठ और तारीख़ पर भी चलते हैं (वर्णक्रम / सबसे पहले-आख़िरी)।

COUNT(स्तंभ) बनाम COUNT(*)

SELECT COUNT(Salary) FROM emp;        -- 5  (NULL नहीं गिना)
SELECT COUNT(*) FROM emp;             -- 6  (हर पंक्ति)
SELECT COUNT(DISTINCT Dept) FROM emp; -- 3  (IT, HR, Sales)

सारे समुच्चय फ़ंक्शन NULL छोड़ते हैं। सिर्फ़ COUNT(*) पंक्तियाँ गिनता है, इसलिए NULL वाली पंक्ति भी आती है।

GROUP BY

GROUP BY किसी स्तंभ में एक जैसे मान वाली पंक्तियों को एक समूह में रखता है। फिर फ़ंक्शन हर समूह का एक उत्तर देता है।

SELECT Dept, SUM(Salary), COUNT(*) FROM emp GROUP BY Dept;
DeptSUM(Salary)COUNT(*)
IT1500003
HR300002
Sales350001

नियम: SELECT का हर स्तंभ जो किसी समुच्चय फ़ंक्शन के अंदर नहीं है, GROUP BY में होना चाहिए।

HAVING बनाम WHERE

SELECT Dept, COUNT(*) FROM emp GROUP BY Dept HAVING COUNT(*) > 1;     -- IT 3, HR 2
SELECT Dept, AVG(Salary) FROM emp WHERE Salary > 32000 GROUP BY Dept;  -- IT 50000, Sales 35000
WHEREHAVING
अकेली पंक्तियाँ छाँटता हैसमूह छाँटता है
GROUP BY से पहलेGROUP BY के बाद
समुच्चय फ़ंक्शन नहीं लगा सकतेअक्सर समुच्चय फ़ंक्शन लगते हैं

ORDER BY

SELECT * FROM emp ORDER BY Salary;             -- ASC (छोटे → बड़े), डिफ़ॉल्ट
SELECT * FROM emp ORDER BY Salary DESC;        -- बड़े → छोटे
SELECT * FROM emp ORDER BY Dept, Salary DESC;  -- पहले Dept, फिर हर Dept में Salary
SELECT Dept, SUM(Salary) FROM emp GROUP BY Dept ORDER BY SUM(Salary) DESC;

MySQL में बढ़ते क्रम में NULL सबसे पहले आता है। पूरा क्रम: SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY …

दो तालिकाओं पर इक्वी-जॉइन

जॉइन दो तालिकाओं की पंक्तियाँ मिलाता है। इक्वी-जॉइन साझा स्तंभ पर बराबर (=) चिह्न लगाता है। तालिका dept: (IT, Floor 3), (HR, Floor 1), (Sales, Floor 2)।

SELECT E.Name, D.Floor
FROM emp E, dept D
WHERE E.Dept = D.Dept;

-- JOIN … ON से भी
SELECT emp.Name, dept.Floor FROM emp JOIN dept ON emp.Dept = dept.Dept;

E और D तालिकाओं के छोटे उपनाम हैं। दोनों तालिकाओं में एक ही नाम का स्तंभ हो तो तालिका.स्तंभ लिखें। WHERE शर्त के बिना कार्टेशियन गुणनफल मिलता है: हर पंक्ति हर पंक्ति के साथ (6 × 3 = 18 पंक्तियाँ)। इक्वी-जॉइन सिर्फ़ 6 मेल खाते जोड़े रखता है।

करके देखें: परिवार का ख़र्च

इस हफ़्ते परिवार ने जो 10 चीज़ें ख़रीदीं, उनकी तालिका बनाएँ: Item, Category (Food, Travel, School), Amount। एक Amount ख़ाली (NULL) छोड़ें। अनुमान लगाकर चलाएँ: COUNT(*) बनाम COUNT(Amount), Category के हिसाब से SUM, HAVING SUM(Amount) > 500 वाली श्रेणियाँ, और ORDER BY SUM(Amount) DESC। ढेरों की तुलना 3D के कदम 3 और 4 से करें।

मुख्य सूत्र और परिभाषाएँ

हल किए गए उदाहरण

1. emp पर SELECT COUNT(*), COUNT(Salary), AVG(Salary) FROM emp; का आउटपुट?

6, 5, 43000। COUNT(*) में Kabir की NULL पंक्ति भी गिनी; AVG = 215000 ÷ 5।

2. हर विभाग का सबसे ऊँचा वेतन दिखाइए।

SELECT Dept, MAX(Salary) FROM emp GROUP BY Dept; → IT 60000, HR 30000, Sales 35000।

3. जिन विभागों का औसत वेतन 40000 से अधिक है, उन्हें दिखाइए।

SELECT Dept, AVG(Salary) FROM emp GROUP BY Dept HAVING AVG(Salary) > 40000; → IT 50000। (HR का औसत 30000, NULL छूटा।)

4. कर्मचारियों को सबसे ऊँचे से सबसे कम वेतन के क्रम में दिखाइए।

SELECT Name, Salary FROM emp ORDER BY Salary DESC; → Neha, Asha, Mohan, Zoya, Ravi, Kabir (DESC में NULL आख़िर में)।

5. हर विभाग में 32000 से ज़्यादा कमाने वाले गिनिए, सिर्फ़ वे विभाग जहाँ ऐसे कम से कम 2 हों।

SELECT Dept, COUNT(*) FROM emp WHERE Salary > 32000 GROUP BY Dept HAVING COUNT(*) >= 2; → IT 3।

6. हर कर्मचारी का Name उसके विभाग के Floor के साथ दिखाइए।

SELECT E.Name, D.Floor FROM emp E, dept D WHERE E.Dept = D.Dept; → Asha 3, Ravi 1, Mohan 3, Zoya 2, Kabir 1, Neha 3।

7. emp में 6 और dept में 3 पंक्तियाँ हैं। SELECT * FROM emp, dept; कितनी पंक्तियाँ देगा?

जॉइन शर्त नहीं → कार्टेशियन गुणनफल: 6 × 3 = 18 पंक्तियाँ।

आम गलतियाँ

अभ्यास क्विज़

1. NULL सहित पंक्तियाँ कौन गिनता है?
2. समूह कौन-सा क्लॉज़ छाँटता है?
3. ORDER BY Salary DESC दिखाता है:
4. 10, 20 और NULL का AVG:
5. इक्वी-जॉइन उन पंक्तियों को मिलाता है जहाँ साझा स्तंभ:

अभ्यास: खुद जवाब दो

अपना जवाब लिखो या चुनो, फिर जाँचें दबाओ। अटको तो संकेत देखो; जवाब देने के बाद पूरा हल दिखेगा।

अक्सर पूछे जाने वाले प्रश्न

COUNT(*) और COUNT(स्तंभ) में क्या अंतर है?

COUNT(*) हर पंक्ति गिनता है; COUNT(स्तंभ) सिर्फ़ वे पंक्तियाँ गिनता है जहाँ वह स्तंभ NULL नहीं है।

WHERE और HAVING में क्या अंतर है?

WHERE समूह बनने से पहले अकेली पंक्तियाँ छाँटता है और समुच्चय फ़ंक्शन नहीं ले सकता; HAVING GROUP BY के बाद समूह छाँटता है और अक्सर समुच्चय फ़ंक्शन लेता है।

इक्वी-जॉइन क्या है?

ऐसा जॉइन जो दो तालिकाओं की पंक्तियाँ वहाँ मिलाता है जहाँ साझा स्तंभ के मान बराबर हों, जैसे WHERE A.id = B.id।

यह कहाँ पढ़ाया जाता है

सीबीएसई (भारत)कक्षा 12एसक्यूएल द्वारा डेटाबेस क्वेरी

पहले यह पढ़ें

आगे पढ़ें

इससे जुड़े पाठ

सभी सूचना विज्ञान अभ्यास पाठ