SQL में, काउंट (कॉलम) और काउंट (*) में क्या अंतर है?


205

मेरे पास निम्नलिखित प्रश्न हैं:

select column_name, count(column_name)
from table
group by column_name
having count(column_name) > 1;

अगर मैं करने के लिए सभी कॉल्स की जगह क्या अंतर हो जाएगा count(column_name)करने के लिए count(*)?

यह प्रश्न इस बात से प्रेरित था कि मैं ओरेकल में एक तालिका में डुप्लिकेट मान कैसे प्राप्त करूं?


स्वीकृत उत्तर (और शायद मेरा प्रश्न) को स्पष्ट करने के लिए, इसके count(column_name)साथ प्रतिस्थापित करने से कॉलम में मानों की गिनती और count(*)परिणाम में एक अतिरिक्त पंक्ति वापस आ जाएगी ।nullnull

जवाबों:


235

count(*)NULLs को गिनता है और count(column)नहीं करता है

[संपादित करें] इस कोड को जोड़ा ताकि लोग इसे चला सकें

create table #bla(id int,id2 int)
insert #bla values(null,null)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,null)

select count(*),count(id),count(id2)
from #bla

परिणाम 7 3 2


8
बस जिज्ञासु: यदि आपके पास सभी NULLs के साथ एक पंक्ति है , तो (*) अभी भी इसे गिना जाएगा, या सभी कॉलमों के लिए सिर्फ काउंट (स्तंभ) है?
जोएल कोएहॉर्न

7
क्या यह मानक डीबीएमएस है?
ग्रहण

51
यह ध्यान देने योग्य है कि यदि आपके पास एक गैर-अशक्त स्तंभ है जैसे कि आईडी, तो गणना (आईडी) गणना (*) पर प्रदर्शन में काफी सुधार करेगी।
tsilb

12
@tsilb: @Alan द्वारा पोस्ट किया गया उत्तर "गिनती (*) वास्तविक डेटा पंक्तियों के बजाय प्रश्न में तालिका पर अनुक्रमित को देखकर गणना की जाती है", जो यदि सही है, तो आपकी टिप्पणी को अमान्य करता है। मैं सराहना करता हूं कि @Alan गलत हो सकता है लेकिन मुझे आपकी जानकारी के स्रोत में दिलचस्पी है ताकि यह पता लगाया जा सके कि कौन सा सही है।
टोनी

12
@tsilb: कई आधुनिक क्वेरी ऑप्टिमाइज़र जब यह समझ में आता है, तो अनुक्रमित का उपयोग करने के लिए गिनती (*) का अनुकूलन करेगा।
शैनन सेवरेंस

37

* और एक विशिष्ट कॉलम का उपयोग करने के बीच एक और मामूली अंतर यह है कि कॉलम मामले में आप कीवर्ड DISTINCT जोड़ सकते हैं, और गिनती को अलग-अलग मानों तक सीमित कर सकते हैं:

select column_a, count(distinct column_b)
from table
group by column_a
having count(distinct column_b) > 1;

1
क्या समूह द्वारा स्तंभ और एक को गिना जाना अलग होना चाहिए? अन्यथा आपको इस क्वेरी से कुछ भी नहीं मिलेगा
steevc

हाँ, क्षमा करें .. मैंने नहीं देखा था कि वे उदाहरण में एक ही कॉलम थे। मैं पोस्ट अपडेट कर दूंगा।
शाखा

16

एक और शायद और सूक्ष्म अंतर यह है कि कुछ डेटाबेस कार्यान्वयन में गणना (*) की गणना वास्तविक डेटा पंक्तियों के बजाय प्रश्न में तालिका पर अनुक्रमित को देखकर की जाती है। चूंकि कोई विशिष्ट स्तंभ निर्दिष्ट नहीं है, इसलिए वास्तविक पंक्तियों और उनके मूल्यों से परेशान होने की आवश्यकता नहीं है (जैसा कि यदि आप किसी विशिष्ट पंक्ति को गिना जाता है तो) होगा। सूचकांक डेटा का उपयोग करने के लिए डेटाबेस की अनुमति देने से "वास्तविक" पंक्तियों को गिनने की तुलना में काफी तेज हो सकता है।


5
+1 हां, ओरेकल के लिए निश्चित रूप से सच है, और पोस्टग्रेक्सेल के लिए 9.2 बाद से।
डेविड एल्ड्रिज

@DavidAldridge क्या आप दस्तावेज़ीकरण के लिए एक संकेतक प्रदान कर सकते हैं (विशेष रूप से पोस्टग्रैक्स्ल के लिए) जहां यह उल्लेख किया गया है? धन्यवाद।
भूषण


10

डॉक्स में स्पष्टीकरण , यह समझाने में मदद करता है:

COUNT (*) समूह में आइटम की संख्या देता है, जिसमें NULL मान और डुप्लिकेट शामिल हैं।

COUNT (अभिव्यक्ति) समूह में प्रत्येक पंक्ति के लिए अभिव्यक्ति का मूल्यांकन करता है और गैर-मानों की संख्या लौटाता है।

तो गिनती (*) में नल शामिल हैं, दूसरी विधि नहीं है।


SQL नवाबों के लिए: आप किस मदद फ़ाइल का जिक्र कर रहे हैं?
छिपकली का बिल

10

हम एक साधारण क्वेरी के साथ अंतर को स्पष्ट करने के लिए स्टैक एक्सचेंज डेटा एक्सप्लोरर का उपयोग कर सकते हैं । स्टैक ओवरफ्लो के डेटाबेस में उपयोगकर्ता तालिका में अक्सर उपयोगकर्ता के वेबसाइट URL की तरह कॉलम खाली होते हैं।

-- count(column_name) vs. count(*)
-- Illustrates the difference between counting a column
-- that can hold null values, a  'not null' column, and  count(*)

select count(WebsiteUrl), count(Id), count(*) from Users

यदि आप डेटा एक्सप्लोरर में ऊपर क्वेरी चलाते हैं , तो आप देखेंगे कि गणना समान है count(Id)और count(*)क्योंकि Idकॉलम nullमानों की अनुमति नहीं देता है। WebsiteUrlगिनती बहुत कम है, हालांकि, क्योंकि उस स्तंभ की अनुमति देता है, null


2

मूल रूप से COUNT(*)फ़ंक्शन तालिका से सभी पंक्तियों को वापस COUNT(COLUMN_NAME)करता है जबकि ऐसा नहीं करता है; यह शून्य मानों को शामिल नहीं करता है, जिसका उत्तर यहां सभी ने दिया है। लेकिन सबसे दिलचस्प हिस्सा प्रश्नों और डेटाबेस को अनुकूलित करना है, COUNT(*)जब तक कि कई काउंट या जटिल क्वेरी करने के बजाय इसका उपयोग करना बेहतर होता है COUNT(COLUMN_NAME)। अन्यथा, यह बड़ी संख्या में डेटा के साथ काम करते हुए आपके DB प्रदर्शन को वास्तव में कम कर देगा।


1
  • COUNT (*) वाक्य SQL सर्वर को NULLs सहित तालिका से सभी पंक्तियों को वापस करने के लिए इंगित करता है।
  • COUNT (column_name) केवल पंक्तियों पर एक गैर-शून्य मान वाली पंक्तियों को पुनः प्राप्त करता है।

कृपया परीक्षण निष्पादन SQL Server 2008 के लिए निम्न कोड देखें:

-- Variable table
DECLARE @Table TABLE
(
      CustomerId int NULL 
    , Name nvarchar(50) NULL
)

-- Insert some records for tests
INSERT INTO @Table VALUES( NULL, 'Pedro')
INSERT INTO @Table VALUES( 1, 'Juan')
INSERT INTO @Table VALUES( 2, 'Pablo')
INSERT INTO @Table VALUES( 3, 'Marcelo')
INSERT INTO @Table VALUES( NULL, 'Leonardo')
INSERT INTO @Table VALUES( 4, 'Ignacio')

-- Get all the collumns by indicating *
SELECT  COUNT(*) AS 'AllRowsCount'
FROM    @Table

-- Get only content columns ( exluce NULLs )
SELECT  COUNT(CustomerId) AS 'OnlyNotNullCounts'
FROM    @Table

1

COUNT(*) - एक तालिका में रिकॉर्ड की कुल संख्या (पूर्ण मूल्यवान रिकॉर्ड सहित) लौटाता है।

COUNT(Column Name) - गैर-पूर्ण रिकॉर्ड की कुल संख्या लौटाता है। इसका मतलब है कि, यह उस विशेष कॉलम में NULL मूल्यवान रिकॉर्ड की गणना को अनदेखा करता है।


0

इसका उपयोग करना सबसे अच्छा है

Count(1) in place of column name or * 

किसी तालिका में पंक्तियों की संख्या गिनने के लिए, यह किसी भी प्रारूप की तुलना में तेज़ है क्योंकि यह स्तंभ नाम को जाँचने के लिए कभी तालिका में मौजूद नहीं है या नहीं


4
कम से कम ओरेकल के लिए गलत है, और अन्य आरडीबीएमएस के लिए भी मुझे संदेह है। आंतरिक रूप से गिनती (1) गिनती (*) में बदल जाती है। विशेष रूप से, गिनती (*) का प्रदर्शन पंक्तियों के आकार से प्रतिकूल रूप से प्रभावित नहीं होता है, जो एक आम गलत धारणा है।
डेविड एल्ड्रिज

यह SQL सर्वर के लिए सही है। जैसा कि @Ali Adravi ने कहा, COUNT(*)इसकी तुलना में COUNT(columnName)कॉलम वैल्यू की जांच करने के लिए नहीं जाना चाहिए, क्योंकि यह सिर्फ पंक्तियों की गणना करता है। लेकिन COUNT(columnName)यह भी countएक idस्तंभ पर लागू धीमी है ! कम से कम SQL सर्वर में, बिल्कुल।
ABS

0

यदि आपके कॉलम में एक कॉलम फिक्स है, तो कोई अंतर नहीं है, यदि आप एक से अधिक कॉलम का उपयोग करना चाहते हैं, तो आपको यह निर्दिष्ट करना होगा कि आपको कितने कॉलमों की गणना करनी है ......

धन्यवाद,


0

जैसा कि पिछले उत्तरों में बताया गया है, Count(*)यहां तक ​​कि NULLकॉलम भी गिना जाता है, जबकि count(Columnname)केवल तभी गिना जाता है जब कॉलम में मान हों।

यह हमेशा सबसे अच्छा से बचने के लिए अभ्यास है *( Select *, count *, ...)


यह बचने के लिए एक सबसे अच्छा अभ्यास नहीं हैCOUNT(*)
डेविड फैबर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.