2013-08-17 5 views
24

मुझे हाल ही में एक साक्षात्कार में इस प्रश्न से पूछा गया था। मैंने इसे mySQL में करने की कोशिश की, और उसी परिणाम (अंतिम परिणाम) प्राप्त हुए। सभी ने उस विशेष तालिका में पंक्तियों की संख्या दी। क्या कोई भी उनके बीच प्रमुख अंतर समझा सकता है।गिनती (0), गिनती (1) के बीच क्या अंतर है .. और mySQL/SQL में गिनती (*)?

+1

एक कॉलम में 'शून्य' मान है। फिर कॉलम पर एक गिनती करें। देखें कि गणना कैसे भिन्न होती है। '0' या '1' का चयन सिर्फ प्रत्येक पंक्ति के लिए स्थिर का चयन कर रहा है, कोई' शून्य 'शामिल नहीं होगा। – Glenn

+0

संभावित डुप्लिकेट [एसक्यूएल में, गिनती (कॉलम) और गिनती (\ *) के बीच क्या अंतर है?] (Http://stackoverflow.com/questions/59294/in-sql-whats-the-difference-between-countcolumn -और-गिनती) – newtover

उत्तर

30

कुछ भी नहीं है वास्तव में, जब तक आप एक तालिका में एक क्षेत्र या लगातार मान के स्थान पर parantheses भीतर एक अभिव्यक्ति या * निर्दिष्ट

मुझे आप एक विस्तृत जवाब देता हूँ। गणना आपको दिए गए क्षेत्र की गैर-शून्य रिकॉर्ड संख्या प्रदान करेगी। आप नाम के एक

select 1 from A 
select 0 from A 
select * from A 

सब वापस आ जाएगी अभिलेखों का एक ही नंबर एक टेबल है कहते हैं, कि तालिका ए में पंक्तियों की संख्या अभी भी उत्पादन अलग है। यदि तालिका में 3 रिकॉर्ड हैं। एक्स और वाई फ़ील्ड नाम के रूप में साथ

select 1 from A will give you 

1 
1 
1 

select 0 from A will give you 
0 
0 
0 

select * from A will give you (assume two columns X and Y is in the table) 
X  Y 
--  -- 
value1 value1 
value2 (null) 
value3 (null) 

तो, इन तीनों प्रश्नों ही नंबर लौट आते हैं। जब तक आप

select count(Y) from A 

का उपयोग के बाद से वहाँ केवल एक गैर शून्य मान आप, आउटपुट के रूप में 1 मिल जाएगा

+1

तो गिनती फ़ंक्शन को वास्तव में अभिन्न मूल्य क्यों पारित किए गए हैं? – Dhruv

+0

@DruruSingh ने आपको मेरे उत्तर में अधिक जानकारी दी – Bren

+0

@ ब्रेन प्रदर्शन के मामले में कोई अंतर है? –

20

COUNT(*) पंक्तियों की संख्या की गणना होती है, जबकि COUNT(expression) अभिव्यक्ति और COUNT(column) में गैर-शून्य मान में गिना जाएगा कॉलम में सभी गैर-शून्य मानों की गणना करें।

चूंकि 0 और 1 दोनों गैर-शून्य मान हैं, COUNT(0)=COUNT(1) और वे दोनों COUNT(*) पंक्तियों की संख्या के बराबर होंगे। यह एक अलग अवधारणा है, लेकिन परिणाम वही होगा।

+0

धन्यवाद fthiella। @brhneser मेरे जैसे शुरुआती के लिए एक बहुत निराश जवाब है। – Dhruv

+1

हां आप सही हैं लेकिन मुझे लगता है कि 'गिनती (*)' को 'गिनती (1)' से अधिक समय लगेगा, है ना? यदि हां तो 'गिनती (1)' का उपयोग प्रदर्शन के तरीके के लिए बेहतर होगा। :) – Yubaraj

+3

@ युबराज गिनती (1) कम से कम कुछ डीबीएमएस पर गिनती (*) की तुलना में बेहतर प्रदर्शन करती थी, लेकिन आजकल ऑप्टिमाइज़र गिनती (*) के बराबर गिनती (*) बनाने के लिए सक्षम है (1) – fthiella

10

अब - उन्हें सभी समान रूप से प्रदर्शन करना चाहिए।

हालांकि, बीते हुए दिनों में, COUNT (1) (या जो भी लगातार आपके द्वारा चुने गए) कभी कभी COUNT (*) से अधिक की सिफारिश की थी क्योंकि गरीब क्वेरी अनुकूलन कोड डाटाबेस क्षेत्र डेटा के सभी पुनः प्राप्त होगा गिनती चलाने से पहले । COUNT (1) इसलिए तेज़ था, लेकिन अब इससे कोई फर्क नहीं पड़ता।

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