2010-05-20 16 views
13

count(*) और count(column_name), mysql में क्या अंतर है।गिनती (*) और गिनती (कॉलम_नाम), diff क्या है?

+0

प्रदर्शन के अनुसार, कोई अंतर नहीं, हालांकि जब आप कॉलम नाम निर्दिष्ट करते हैं, तो आपको केवल पंक्तियों की गिनती मिलती है जहां वह क्षेत्र शून्य नहीं होता है। इसके अलावा, गिनती (कॉलमनाम) मेरी राय में बस "महसूस" बेहतर है। – Jay

+3

@Jay: एक प्रदर्शन अंतर है। देखें: http://www.mysqlperformanceblog.com/2007/04/10/count-vs-countcol/ –

उत्तर

25
  • COUNT(*) मायने रखता है परिणाम सेट में सभी पंक्तियों चाहते COUNT (ColumnName) बेहतर है।
  • COUNT(column_name) केवल उन पंक्तियों की गणना करता है जहां column_name शून्य नहीं है। यह कुछ परिस्थितियों में धीमा हो सकता है भले ही कोई शून्य मान न हो क्योंकि मान को जांचना है (जब तक कॉलम शून्य नहीं हो जाता)।
  • COUNT(1)COUNT(*) जैसा ही है क्योंकि 1 कभी भी पूर्ण नहीं हो सकता है।

परिणाम में अंतर को देखने के लिए आप इस छोटे प्रयोग की कोशिश कर सकते हैं:

CREATE TABLE table1 (x INT NULL); 
INSERT INTO table1 (x) VALUES (1), (2), (NULL); 
SELECT 
    COUNT(*) AS a, 
    COUNT(x) AS b, 
    COUNT(1) AS c 
FROM table1; 

परिणाम: यदि आपके स्तंभ शून्य अनुमति देते हैं

 
a b c 
3 2 3 
+0

COUNT (*) परिणाम सेट में सभी पंक्तियों की गणना नहीं करता है (या ग्रुप BY का उपयोग करते हुए समूह) केवल उन पंक्तियों की गणना नहीं करता है जहां सभी कॉलम_नाम पूर्ण नहीं है – zloctb

0

COUNT (*), COUNT (ColumnName), COUNT (1) के बीच कोई प्रदर्शन अंतर नहीं है।

अब, यदि आपके पास COUNT (ColumnName) है तो डेटाबेस को यह जांचना होगा कि कॉलम में NULL मान है, और NULL एस को समेकित से हटा दिया गया है। तो COuNT (*) या COUNT (1) जब तक आप (ग्रुप द्वारा उपयोग कर या समूह) COUNT (DISTINCT ColumnName)

1

स्तंभ परिभाषा -ie पर निर्भर करता है - आप अलग-अलग परिणाम प्राप्त हो सकते हैं (और कुछ स्थितियों में यह गिनती (कॉलम) के साथ धीमा हो सकता है क्योंकि मार्क ने पहले ही बताया है)।

0

ज्यादातर मामलों में थोड़ा अंतर होता है, और COUNT(*) या COUNT(1) आम तौर पर पसंद किया जाता है। हालांकि, एक महत्वपूर्ण स्थिति है जहां आप COUNT(columnname) का उपयोग करना चाहिए: बाहरी जुड़ता है।

यदि आप किसी मूल तालिका से किसी बच्चे तालिका में बाहरी शामिल हो रहे हैं, और आप उन पंक्तियों में शून्य गणना प्राप्त करना चाहते हैं जिनके पास बाल तालिका में कोई संबंधित आइटम नहीं है, तो आपको COUNT(column in child table) का उपयोग करना होगा। जब कोई मिलान नहीं होता है, तो वह कॉलम NULL होगा, और आपको वांछित शून्य गणना मिल जाएगी (वास्तव में, आपको NULL मिल जाएगा, लेकिन आप इसे 0 पर IFNULL() या COALESCE() के साथ परिवर्तित कर सकते हैं)। यदि आप COUNT(*) का उपयोग करते हैं, तो यह पंक्ति को मूल तालिका से गिना जाता है, इसलिए आपको 1 की गिनती मिल जाएगी।

SELECT c.name, COALESCE(COUNT(o.id), 0) AS order_count 
FROM customers AS c 
LEFT JOIN orders AS o ON o.customer_id = c.id 
संबंधित मुद्दे