SQL प्रश्नों में ग्रुप BY द्वारा HAVING का उपयोग


26

HAVINGएसक्यूएल प्रश्नों में उपयोग करने के लिए , GROUP BYकॉलम नामों को एकत्र करने के लिए एक होना चाहिए ?

क्या ऐसे कोई विशेष मामले हैं, जिनमें एसक्यूएल प्रश्नों के HAVINGबिना उपयोग करना संभव है GROUP BY?

क्या उन्हें एक ही समय में सह-अस्तित्व में होना चाहिए?

जवाबों:


25

नहीं।

उन्हें सह-अस्तित्व में नहीं होना चाहिए, जैसा कि इस तथ्य से साबित होता है कि ओरेकल में निम्नलिखित क्वेरी काम करती है:

select * from dual having 1 = 1;

इसी तरह, PostgreSQL में निम्नलिखित क्वेरी काम करती है:

select 1 having 1 = 1;

तो आवश्यकता having नहीं है group by

चल रहा है लागू किया के बाद एकत्रीकरण चरण और यदि आप समस्त परिणाम फ़िल्टर करना चाहते इस्तेमाल किया जाना चाहिए। तो रिवर्स सच नहीं है, और निम्नलिखित काम नहीं करेगा:

select a, count(*) as c
from mytable
group by a
where c > 1;

आप प्रतिस्थापित करने की आवश्यकता whereके साथ havingइस प्रकार, इस मामले में:

select a, count(*) as c
from mytable
group by a
having c > 1;

NB निम्नलिखित क्वेरी प्रपत्र भी काम करेगा:

select *
from (
  select a, count(*) as c
  from mytable
  group by a
)
where c > 1;

आप देख सकते हैं कि उपयोग havingकरना इस अंतिम प्रश्न का एक संक्षिप्त संस्करण है।


सारांश में, havingलागू किया जाता है के बादgroup by चरण जबकि whereलागू किया जाता है से पहलेgroup by चरण।


2
एक अन्य उदाहरण:SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);
ypercubeᵀᴹ

1
हाँ। और PostgreSQL निम्नलिखित निर्माण की अनुमति देता है select 1 having count(*) = 1;जिसे मैंने अभी तक समझ लिया है।
कॉलिन 'टी हार्ट

SQL सर्वर भी अनुमति देता है, SELECT 1 AS id, 'Colin' AS name;जबकि अन्य Oracle की तरह एक विशेष dualतालिका है। मुझे नहीं लगता कि इनमें से कोई भी वाक्य रचना एएनएसआई / आईएसओ एसक्यूएल (जिसकी आवश्यकता है FROM)।
ypercube y

मैं कमी का मतलब नहीं था, fromलेकिन खंड count(*)में संदर्भ havingबिना किसी संकेत के कि यह किस कॉलम में एकत्र किया जा रहा है। संभवत: यह selectखंड में सभी स्तंभों पर एकत्रित होता है ।
कॉलिन 'टी हार्ट

आह अच्छा। हां, मैं मानता हूं कि यह वही करता है (सभी पंक्तियों पर आपका मतलब है - एक खाली तालिका की सभी पंक्तियों पर)।
ypercube y

4

समूहों को फ़िल्टर करने के लिए उपयोग किया जाता है।

जहाँ खंड पंक्तियों को फ़िल्टर करने के लिए उपयोग किया जाता है।



1
आपका पहला कथन सही नहीं है। havingहै लागू किया के बाद एकत्रीकरण चरण इतना करने के लिए इस्तेमाल किया जा सकता फिल्टर समूहों।
कॉलिन 'टी हार्ट

1

HAVING समूहों को छान रहा है। यदि आपके पास GROUP BY कारण नहीं है, तो सभी पंक्तियाँ एक समूह प्रस्तुत करती हैं। इसलिए, यदि HAVING में विधेय सत्य के रूप में मूल्यांकन करता है, तो आपको एक पंक्ति मिलती है, अन्यथा कोई पंक्ति नहीं।


1

GROUP BY के खंड के अभाव में क्वेरी पूरे संबंध को एक समूह मानती है।

जैसे

     select count(*)
     from dual
     having count(*) > 5;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.