समुच्चय फ़ंक्शन: MAX, MIN, AVG, SUM, COUNT
समुच्चय (मल्टी-रो) फ़ंक्शन पूरे स्तंभ पर चलकर एक मान लौटाता है। तालिका emp:
| Name | Dept | Salary |
|---|---|---|
| Asha | IT | 50000 |
| Ravi | HR | 30000 |
| Mohan | IT | 40000 |
| Zoya | Sales | 35000 |
| Kabir | HR | NULL |
| Neha | IT | 60000 |
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;
| Dept | SUM(Salary) | COUNT(*) |
|---|---|---|
| IT | 150000 | 3 |
| HR | 30000 | 2 |
| Sales | 35000 | 1 |
नियम: 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
| WHERE | HAVING |
|---|---|
| अकेली पंक्तियाँ छाँटता है | समूह छाँटता है |
| 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 से करें।
मुख्य सूत्र और परिभाषाएँ
- MAX · MIN · SUM · AVG · COUNT(स्तंभ) NULL छोड़ें · COUNT(*) सब पंक्तियाँ गिने
- AVG = SUM ÷ COUNT(NULL रहित मान)
- SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY … [ASC|DESC]
- इक्वी-जॉइन: FROM A, B WHERE A.col = B.col
- कार्टेशियन गुणनफल पंक्तियाँ = पंक्तियाँ(A) × पंक्तियाँ(B)
हल किए गए उदाहरण
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 पंक्तियाँ।
आम गलतियाँ
- WHERE में समुच्चय फ़ंक्शन लगाना (WHERE SUM(Salary) > 1000); GROUP BY के बाद HAVING लगाएँ।
- सोचना कि COUNT(Salary) और COUNT(*) हमेशा बराबर होंगे; COUNT(स्तंभ) NULL छोड़ता है।
- जॉइन शर्त भूलना, जिससे बहुत बड़ा कार्टेशियन गुणनफल बनता है।
- ORDER BY को GROUP BY से पहले लिखना; क्रम WHERE → GROUP BY → HAVING → ORDER BY है।