SQL का उपयोग करने के बारे में कुछ महत्वपूर्ण बिंदु:
- आप WHERE क्लॉज में कॉलम एलियासेस का उपयोग नहीं कर सकते हैं, लेकिन आप HAVING क्लॉज में कर सकते हैं। आपको मिली त्रुटि का कारण यही है।
- सहसंबद्ध उपश्रेणियों का उपयोग करने की तुलना में आप JOIN और GROUP BY का उपयोग करके अपनी गणना बेहतर तरीके से कर सकते हैं। यह बहुत तेज़ होगा।
- समूहों को फ़िल्टर करने के लिए HAVING क्लॉज़ का उपयोग करें।
इस तरह मैं इस क्वेरी को लिखूंगा:
SELECT t1.id, COUNT(t2.id) AS num_things
FROM t1 JOIN t2 USING (id)
GROUP BY t1.id
HAVING num_things = 5;
मुझे एहसास है कि यह क्वेरी JOIN
को छोड़ सकती है t1 के साथ, जैसा कि चार्ल्स ब्रेटाना के समाधान में है। लेकिन मुझे लगता है कि आप चाहते हैं कि क्वेरी में t1 से कुछ अन्य कॉलम शामिल हों।
पुन:टिप्पणी में प्रश्न:
अंतर यह है कि WHERE
क्लॉज का मूल्यांकन पंक्तियों पर किया जाता है, GROUP BY
. से पहले समूहों को प्रति समूह एक पंक्ति में कम कर देता है। HAVING
समूह बनने के बाद खंड का मूल्यांकन किया जाता है। इसलिए, उदाहरण के लिए, आप COUNT()
. को नहीं बदल सकते HAVING
. का उपयोग करके किसी समूह का; आप केवल समूह को ही बाहर कर सकते हैं।
SELECT t1.id, COUNT(t2.id) as num
FROM t1 JOIN t2 USING (id)
WHERE t2.attribute = <value>
GROUP BY t1.id
HAVING num > 5;
उपरोक्त क्वेरी में, WHERE
किसी शर्त से मेल खाने वाली पंक्तियों के लिए फ़िल्टर, और HAVING
उन समूहों के लिए फ़िल्टर जिनकी संख्या कम से कम पाँच है।
अधिकांश लोगों को भ्रम की स्थिति तब होती है जब उनके पास GROUP BY
. नहीं होता है खंड, तो यह लगता है जैसे HAVING
और WHERE
विनिमेय हैं।
WHERE
चयन-सूची में अभिव्यक्तियों से पहले मूल्यांकन किया जाता है। यह स्पष्ट नहीं हो सकता है क्योंकि SQL सिंटैक्स पहले चयन-सूची रखता है। तो आप WHERE
. का उपयोग करके बहुत सारी महंगी गणनाओं को बचा सकते हैं पंक्तियों को प्रतिबंधित करने के लिए।
SELECT <expensive expressions>
FROM t1
HAVING primaryKey = 1234;
यदि आप ऊपर की तरह एक क्वेरी का उपयोग करते हैं, तो चयन-सूची में अभिव्यक्तियों की गणना हर पंक्ति के लिए की जाती है , केवल HAVING
. के कारण अधिकांश परिणामों को त्यागने के लिए स्थिति। हालांकि, नीचे दी गई क्वेरी केवल एकल पंक्ति . के लिए व्यंजक की गणना करती है WHERE
से मेल खाता है हालत।
SELECT <expensive expressions>
FROM t1
WHERE primaryKey = 1234;
तो संक्षेप में, चरणों की श्रृंखला के अनुसार डेटाबेस इंजन द्वारा क्वेरी चलाई जाती हैं:
- तालिका(ओं) से पंक्तियों का सेट उत्पन्न करें, जिसमें
JOIN
. द्वारा उत्पादित कोई भी पंक्तियाँ शामिल हैं । - मूल्यांकन करें
WHERE
पंक्तियों के समूह के विरुद्ध स्थितियां, मेल न खाने वाली पंक्तियों को फ़िल्टर करना। - पंक्तियों के समूह में प्रत्येक के लिए चयन-सूची में भावों की गणना करें।
- कॉलम उपनाम लागू करें (ध्यान दें कि यह एक अलग चरण है, जिसका अर्थ है कि आप चयन-सूची में अभिव्यक्तियों में उपनामों का उपयोग नहीं कर सकते हैं)।
GROUP BY
. के अनुसार, समूहों को प्रति समूह एक पंक्ति में संघनित करें खंड।- मूल्यांकन करें
HAVING
समूहों के विरुद्ध स्थितियां, मेल न खाने वाले समूहों को फ़िल्टर करना। - परिणाम को
ORDER BY
के अनुसार क्रमित करें खंड।