जहां बनाम


247

क्यों आप जगह स्तंभों की जरूरत है आप अपने आप को (उदाहरण के लिए बनाने के select 1 as "number") के बाद HAVINGऔर नहीं WHEREMySQL में?

और क्या करने के बजाय किसी भी डाउनसाइड्स हैं WHERE 1(एक कॉलम नाम के बजाय पूरी परिभाषा लिखना)?

जवाबों:


323

ऐसा क्यों है कि आपको स्तंभ बनाने की आवश्यकता है (उदाहरण के लिए "नंबर 1 के रूप में 1 का चयन करें") और उसके बाद MySQL में नहीं?

WHEREपहले लागू किया जाता है GROUP BY, के HAVINGबाद लागू किया जाता है (और समुच्चय पर फ़िल्टर कर सकते हैं)।

सामान्य तौर पर, आप इनमें से किसी भी खंड में उपनामों का संदर्भ नहीं दे सकते, लेकिन स्तर के उपनामों को MySQLसंदर्भित करने की अनुमति देता SELECTहै GROUP BY, ORDER BYऔर HAVING

और "WHERE 1" करने के बजाय कोई डाउनसाइड्स हैं (कॉलम नाम के बजाय पूरी परिभाषा लिखना)

यदि आपकी गणना की गई अभिव्यक्ति में कोई समुच्चय नहीं है, तो इसे WHEREक्लॉज में रखना सबसे अधिक कुशल होगा।


289

इस प्रश्न के अन्य सभी उत्तर महत्वपूर्ण बिंदु पर नहीं आए।

मान लें कि हमारे पास एक तालिका है:

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 इंडेक्स का उपयोग करते हुए देख सकते हैं, लेकिन पंक्तियाँ अलग हैं।


32
मैं सराहना करता हूं कि आपने EXPLAIN का उल्लेख किया है!
पैगीगो

चयन के बाद HAVING क्लॉज़ डेटा को फ़िल्टर करने के कारण, जहाँ क्लॉज़ अधिक प्रभावी होगा। तो अगर यह सच है, तो हमें WHERE के बजाय HAVING का उपयोग कब करना चाहिए?
grep

5
@grep यदि आपको चयन के बाद डेटा को फ़िल्टर करना है, तो आपको HAVING क्लॉज़ की आवश्यकता होती है, आमतौर पर हम इसका उपयोग GROUP BY क्लॉज़ के साथ करते हैं, जैसे: SELECT value, COUNT(*) frequency FROM table GROUP BY value HAVING frequency > 10
Fishdrowned

1
बहुत बढ़िया पोस्ट। सुझाव दिया स्पष्टीकरण के एक जोड़े: बदलें ...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
rmirabelle

2
HAVING क्लॉज को SQL में जोड़ा गया क्योंकि WHERE कीवर्ड का उपयोग कुल कार्यों के साथ नहीं किया जा सकता है।
शशांक विवेक 14

62

मुख्य अंतर यह है कि WHEREसमूहित वस्तु (जैसे SUM(number)) पर इस्तेमाल नहीं किया जा सकता है, जबकि HAVINGकर सकते हैं।

कारण यह है WHEREकिया जाता है इससे पहले कि समूहीकरण और HAVINGकिया जाता है के बाद समूहीकरण किया जाता है।


39

HAVINGआपके में एकत्रीकरण को फ़िल्टर करने के लिए उपयोग किया जाता है GROUP BY

उदाहरण के लिए, डुप्लिकेट नामों की जांच करने के लिए:

SELECT Name FROM Usernames
GROUP BY Name
HAVING COUNT(*) > 1

1
यह कुछ विस्तार के लिए सच है। आप अभी भी अपने पूरे 'को' को क्लॉज में रख सकते हैं।
डेविड ब्रुनेल

इसके अलावा stackoverflow.com/questions/2905292/…
Pacerier

8

इन 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.*/

1
यह वास्तविक जीवन उदाहरण पूरी तरह से WHEREऔर के बीच अंतर को स्पष्ट करता है HAVING
WM

स्पष्ट रूप से होने और कहाँ होने के बीच का अंतर दर्शाता है। धन्यवाद।
मार्कोज़ेन

3

डेटा को समूहीकृत करने से पहले फ़िल्टर कहाँ होता है, और डेटा के समूहीकृत होने के बाद फ़िल्टर करना। यह एक महत्वपूर्ण अंतर है; WHERE क्लॉज द्वारा समाप्त की गई पंक्तियों को समूह में शामिल नहीं किया जाएगा। यह गणना मूल्यों को बदल सकता है, जो बदले में (= परिणामस्वरूप) प्रभावित कर सकता है कि एचएवीआई क्लॉज में उन मूल्यों के उपयोग के आधार पर कौन से समूह फ़िल्टर किए गए हैं ।

और जारी है,

HAVING ऐसा ही है कि जहाँ कोई DB BY निर्दिष्ट नहीं है, तो अधिकांश DBMS उनसे एक ही बात मानते हैं । फिर भी, आपको उस अंतर को खुद बनाना चाहिए। ग्रुप बाई क्लॉस के साथ संयोजन के रूप में केवल उपयोग करें । मानक पंक्ति-स्तरीय फ़िल्टरिंग के लिए WHERE का उपयोग करें ।

अंश: फोर्ट, बेन। "10 मिनट (5 वें संस्करण) में Sams अपने आप को एसक्यूएल सिखाओ (Sams अपने आप को सिखाओ ...)।"।


1

होने का उपयोग केवल एकत्रीकरण के साथ किया जाता है, लेकिन गैर एकत्रीकरण कथनों के साथ जहां यदि आपके पास जहां शब्द एकत्रीकरण से पहले रखा गया है (समूह द्वारा)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.