2010-07-01 12 views
8

होने के यहाँ एक एसक्यूएल बयान जहां हम HAVING का उपयोग का एक उदाहरण है:एसक्यूएल: का उपयोग कर कहां और बदले

select column1 from table1 
where condition1 
having condition2; 

यह एक ही सटीक बात नहीं है अगर हम ऐसा करते हैं:

select column1 from table1 
where condition1 AND condition2; 

इन दोनों के बीच क्या अंतर है?

उत्तर

17

आपके उदाहरण में, उन्हें वही करना चाहिए। लेकिन WHEREGROUP BY से पहले संसाधित हो जाता है, और इसलिए इसमें समेकित मानों (यानी Min(), Max(), आदि फ़ंक्शंस के परिणाम) तक पहुंच नहीं है। HAVINGGROUP BY के बाद संसाधित हो जाता है और इसलिए परिणाम सेट को केवल उन निश्चित मानों के साथ सीमित करने के लिए उपयोग किया जा सकता है जो एक निश्चित भविष्यवाणी से मेल खाते हैं।

+4

डैनियल के उत्तर को एक और तरीके से रखने के लिए, परिणाम सेट में सभी पंक्तियों पर जहां खंड लागू होता है। क्लॉज द्वारा समूह द्वारा बनाए गए समूहों पर होने वाला खंड लागू होता है। इसलिए यदि आपके समूह में आपके उदाहरण में कॉलम 1 शामिल है और शर्तें कॉलम 1 पर थीं, तो यह कहां समान है, क्योंकि पंक्ति "समूह" के समान ही है। – Anon246

+0

@Strommy: बिल्कुल। और यदि किसी कारण से आप 'हैविंग' का उपयोग नहीं करना चाहते हैं, तो आप एक वांछित 'चयन' का उपयोग कर और वांछित भविष्य को व्यक्त करने के लिए बाहरी 'WHERE' खंड का उपयोग करके एक ही चीज़ को पूरा कर सकते हैं। –

3

नहीं, क्योंकि क्लॉज द्वारा कुल कार्यों या समूह के लिए है।

उदाहरण के लिए:

SELECT COUNT(ID) 
FROM tablexpto 
where name = 'a' 
having count(ID) > 1 

पहली क्वेरी नहीं चल पाएंगे।

6

HAVING समुच्चय साथ प्रयोग के लिए है, उदाहरण के लिए, HAVING SUM(column1) > 200, WHERE सिर्फ कॉलम, उदाहरण के लिए, WHERE column1 < 20 के लिए है।

1

क्लॉज द्वारा समूह के साथ काम करता है और समूहबद्ध होने के बाद रिकॉर्ड सीमित करता है।

3

नहीं, वे पूरी तरह से अलग हैं।

समेकित कार्यों को समूहीकृत करने के लिए शर्तें हैं। समेकित मूल्य की गणना के बाद उनकी गणना की जाती है।

उदाहरण:

select id, count(1) 
    from table 
where COND1 
having count(1) > 1 

यहाँ, having हिस्सा के बाद मूल्यांकन किया जाता है क्वेरी गणना की गिनती (1) प्रत्येक समूह के लिए मूल्य।

4

अपने उदाहरण में, यह है, क्योंकि आप अन्यथा, द्वारा

कोई ग्रुप केवल सहायता की जरूरत ग्रुप जिसके द्वारा के बाद लागू किया जाता है, जहां ...

कि कह रही है के बाद लागू किया जाता है एक ही है होने एक साधारण फ़िल्टर के साथ (x = 2) बिल्कुल WHERE जैसा ही है क्योंकि x = 2 का अर्थ केवल उस पर है जब आप इसे समूहित करते हैं। आप आम तौर पर एक कुल (COUNT(*) > 2 उदाहरण के लिए) पर हैविंग का उपयोग करते हैं जिसे केवल GROUP BY

2

हैविंग समूह के लिए खोज स्थिति निर्दिष्ट करता है या एक SELECT कथन में उपयोग किए गए एक समग्र फ़ंक्शन को निर्दिष्ट करता है।

एक हैविंग क्लॉज एक WHERE क्लॉज की तरह है, लेकिन केवल पूरे समूह पर लागू होता है, जबकि WHERE क्लॉज अलग-अलग पंक्तियों पर लागू होता है।

होने http://blog.sqlauthority.com/2007/07/04/sql-server-definition-comparison-and-difference-between-having-and-where-clause/

-1

आप खंड द्वारा एक समूह की जरूरत होने का उपयोग करें। आप बिना एक

+1

गलत: यदि आप 'चयन' खंड में एक शाब्दिक मान (यानी कोई कॉलम नाम) का उपयोग नहीं करते हैं और 'ग्रुप बाय' क्लॉज को छोड़ देते हैं तो 'हैविंग' क्लॉज पूरी तालिका पर लागू किया जाएगा (या फ़िल्टर किए गए परिणामसेट को 'जहां' खंड का उपयोग किया जाता है ') और यदि एक हैविंग क्लॉज का मूल्यांकन सत्य के रूप में मूल्यांकन किया जाता है तो अन्य पंक्तियों को शून्य पंक्तियों के रूप में मूल्यांकन किया जाता है। उदाहरण: पता लगाएं कि संख्याओं के अनुक्रम में कोई अंतर है या नहीं: 'नंबरों से 1 चुनें MAX (num) = COUNT (*); ' – onedaywhen

+0

जो स्नीकी था, क्या कोई भी वास्तविक दुनिया में इसका उपयोग करता है? कैसे? – kacalapy

3

के रूप में दूसरों की है (अधिकतर) सही ढंग से कहा गया है एक त्रुटि प्राप्त होगी, एसक्यूएल में WHERE खंड, SELECT खंड से पहले मूल्यांकन किया जाता है इसलिए एक सेट समारोह का परिणाम WHERE खंड में 'क्षेत्र से बाहर' है।

उदाहरण के लिए, आप ऐसा नहीं कर सकते:

SELECT Subject, MAX(Mark) AS TopScore 
    FROM Exam_Marks 
GROUP 
    BY Subject 
WHERE TopScore <= 70; 

क्योंकि स्तंभ सहसंबंध नाम TopScoreWHERE खंड के लिए दायरे में नहीं है।

SELECT DT1.TopScore 
    FROM (
     SELECT Subject, MAX(Mark) AS TopScore 
      FROM Exam_Marks 
     GROUP 
      BY Subject 
     ) AS DT1 
WHERE DT1.TopScore <= 70; 

समस्या थी, एसक्यूएल के प्रारंभिक कार्यान्वयन (आईबीएम की प्रणाली अनुसंधान के साथ शुरू), व्युत्पन्न तालिकाओं के लिए समर्थन का अभाव है इसलिए unintuitive HAVING पैदा हुआ था:

बेशक हम एक सबक्वेरी इस्तेमाल कर सकते हैं

आप ह्यूग डार्वेन द्वारा HAVING A Blunderful Time (or Wish You Were WHERE) में पूरी खेद की कहानी पढ़ सकते हैं, जिसमें से मैंने उपर्युक्त उदाहरण उधार लिया है।

संबंधित मुद्दे