जवाबों:
ऐसा क्यों है कि आपको स्तंभ बनाने की आवश्यकता है (उदाहरण के लिए "नंबर 1 के रूप में 1 का चयन करें") और उसके बाद MySQL में नहीं?
WHERE
पहले लागू किया जाता है GROUP BY
, के HAVING
बाद लागू किया जाता है (और समुच्चय पर फ़िल्टर कर सकते हैं)।
सामान्य तौर पर, आप इनमें से किसी भी खंड में उपनामों का संदर्भ नहीं दे सकते, लेकिन स्तर के उपनामों को MySQL
संदर्भित करने की अनुमति देता SELECT
है GROUP BY
, ORDER BY
और HAVING
।
और "WHERE 1" करने के बजाय कोई डाउनसाइड्स हैं (कॉलम नाम के बजाय पूरी परिभाषा लिखना)
यदि आपकी गणना की गई अभिव्यक्ति में कोई समुच्चय नहीं है, तो इसे WHERE
क्लॉज में रखना सबसे अधिक कुशल होगा।
इस प्रश्न के अन्य सभी उत्तर महत्वपूर्ण बिंदु पर नहीं आए।
मान लें कि हमारे पास एक तालिका है:
CREATE TABLE `table` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`value` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `value` (`value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
और आईडी और मान 1 से 10 दोनों के साथ 10 पंक्तियाँ हैं:
INSERT INTO `table`(`id`, `value`) VALUES (1, 1),(2, 2),(3, 3),(4, 4),(5, 5),(6, 6),(7, 7),(8, 8),(9, 9),(10, 10);
निम्नलिखित 2 प्रश्नों का प्रयास करें:
SELECT `value` v FROM `table` WHERE `value`>5; -- Get 5 rows
SELECT `value` v FROM `table` HAVING `value`>5; -- Get 5 rows
आपको बिल्कुल समान परिणाम मिलेंगे, आप देख सकते हैं कि HAVING क्लॉज, GROUP BY क्लॉज के बिना काम कर सकता है।
यहाँ अंतर है:
SELECT `value` v FROM `table` WHERE `v`>5;
त्रुटि # 1054 - 'कॉलम' में अज्ञात कॉलम 'v'
SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows
जहां कोई भी शर्त किसी भी तालिका स्तंभ का उपयोग करने की अनुमति देती है, लेकिन यह उपनाम या कुल कार्यों का उपयोग नहीं कर सकता है। HAVING क्लॉज एक स्थिति को चयनित (!) कॉलम, उपनाम या एक समुच्चय फ़ंक्शन का उपयोग करने की अनुमति देता है।
इसका कारण यह है कि जहां क्लॉज डेटा का चयन करने से पहले फ़िल्टर करता है, लेकिन चयन के बाद डेटा को फ़िल्टर करने से हाइविंग क्लॉज़ हो जाता है।
यदि एक तालिका में कई पंक्तियाँ हैं, तो WHERE क्लॉज़ में स्थितियाँ अधिक कुशल होंगी।
महत्वपूर्ण अंतर देखने के लिए प्रयास करें:
EXPLAIN SELECT `value` v FROM `table` WHERE `value`>5;
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
| 1 | SIMPLE | table | range | value | value | 4 | NULL | 5 | Using where; Using index |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
EXPLAIN SELECT `value` v FROM `table` having `value`>5;
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
| 1 | SIMPLE | table | index | NULL | value | 4 | NULL | 10 | Using index |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
आप या तो WHERE या HAVING इंडेक्स का उपयोग करते हुए देख सकते हैं, लेकिन पंक्तियाँ अलग हैं।
SELECT value, COUNT(*) frequency FROM table GROUP BY value HAVING frequency > 10
...HAVING clause can use both column and alias.
करने के लिए ...HAVING clause can use either column or alias.
और परिवर्तन ...WHERE clause will be more effective
करने के लिए...WHERE clause will be more efficient
मुख्य अंतर यह है कि WHERE
समूहित वस्तु (जैसे SUM(number)
) पर इस्तेमाल नहीं किया जा सकता है, जबकि HAVING
कर सकते हैं।
कारण यह है WHERE
किया जाता है इससे पहले कि समूहीकरण और HAVING
किया जाता है के बाद समूहीकरण किया जाता है।
HAVING
आपके में एकत्रीकरण को फ़िल्टर करने के लिए उपयोग किया जाता है GROUP BY
।
उदाहरण के लिए, डुप्लिकेट नामों की जांच करने के लिए:
SELECT Name FROM Usernames
GROUP BY Name
HAVING COUNT(*) > 1
इन 2 को पहले की तरह ही महसूस किया जाएगा क्योंकि दोनों का उपयोग डेटा को फ़िल्टर करने की स्थिति के बारे में कहने के लिए किया जाता है। हालाँकि हम किसी भी स्थिति में 'जहाँ' के स्थान पर 'होने' का उपयोग कर सकते हैं, ऐसे उदाहरण हैं जब हम 'होने' के बजाय 'जहाँ' का उपयोग नहीं कर सकते हैं। ऐसा इसलिए है क्योंकि एक चुनिंदा क्वेरी में, 'जहां' डेटा को 'सिलेक्ट' करने से पहले 'सिलेक्ट' करते समय 'सिलेक्ट' होने के बाद 'डेटा को फिल्टर' करते हैं। इसलिए, जब हम उन उपनामों का उपयोग करते हैं जो वास्तव में डेटाबेस में नहीं होते हैं, तो 'जहां' उन्हें पहचान नहीं सकते हैं, लेकिन 'होने' कर सकते हैं।
Ex: टेबल छात्र को student_id, नाम, जन्मदिन, पता दें। मान लें कि जन्मदिन प्रकार की तारीख का है।
SELECT * FROM Student WHERE YEAR(birthday)>1993; /*this will work as birthday is in database.if we use having in place of where too this will work*/
SELECT student_id,(YEAR(CurDate())-YEAR(birthday)) AS Age FROM Student HAVING Age>20;
/*this will not work if we use ‘where’ here, ‘where’ don’t know about age as age is defined in select part.*/
WHERE
और के बीच अंतर को स्पष्ट करता है HAVING
।
डेटा को समूहीकृत करने से पहले फ़िल्टर कहाँ होता है, और डेटा के समूहीकृत होने के बाद फ़िल्टर करना। यह एक महत्वपूर्ण अंतर है; WHERE क्लॉज द्वारा समाप्त की गई पंक्तियों को समूह में शामिल नहीं किया जाएगा। यह गणना मूल्यों को बदल सकता है, जो बदले में (= परिणामस्वरूप) प्रभावित कर सकता है कि एचएवीआई क्लॉज में उन मूल्यों के उपयोग के आधार पर कौन से समूह फ़िल्टर किए गए हैं ।
और जारी है,
HAVING ऐसा ही है कि जहाँ कोई DB BY निर्दिष्ट नहीं है, तो अधिकांश DBMS उनसे एक ही बात मानते हैं । फिर भी, आपको उस अंतर को खुद बनाना चाहिए। ग्रुप बाई क्लॉस के साथ संयोजन के रूप में केवल उपयोग करें । मानक पंक्ति-स्तरीय फ़िल्टरिंग के लिए WHERE का उपयोग करें ।