2008-10-08 9 views
53

जब हम select count(*) from table_name निष्पादित करते हैं तो यह पंक्तियों की संख्या देता है।किसी भी डेटाबेस टेबल पर "table_name से गिनती (1) का चयन करें" का क्या अर्थ है?

count(1) क्या करता है? 1 क्या संकेत है? क्या यह count(*) जैसा है (क्योंकि यह निष्पादन पर एक ही परिणाम देता है)?

+0

दिलचस्प सवाल। मुझे यह भी दिलचस्पी होगी कि क्या उत्तर कार्यान्वयन-निर्भर है (उदाहरण के लिए क्वेरी का परिणाम SQL सर्वर में समान है क्योंकि यह ओरेकल में है)। –

उत्तर

70

COUNT फ़ंक्शन का पैरामीटर एक अभिव्यक्ति है जिसका मूल्यांकन प्रत्येक पंक्ति के लिए किया जाना है। COUNT फ़ंक्शन उन पंक्तियों की संख्या देता है जिनके लिए अभिव्यक्ति गैर-शून्य मान का मूल्यांकन करती है। (* एक विशेष अभिव्यक्ति है जिसका मूल्यांकन नहीं किया जाता है, यह केवल पंक्तियों की संख्या देता है।)

अभिव्यक्ति के लिए दो अतिरिक्त संशोधक हैं: सभी और DISTINCT। ये निर्धारित करते हैं कि डुप्लीकेट को त्याग दिया गया है या नहीं। चूंकि सभी डिफ़ॉल्ट हैं, आपका उदाहरण गिनती (सभी 1) जैसा ही है, जिसका अर्थ है कि डुप्लीकेट बनाए रखा जाता है।

अभिव्यक्ति "1" प्रत्येक पंक्ति के लिए गैर-शून्य के मूल्यांकन का मूल्यांकन करती है, और चूंकि आप डुप्लिकेट को नहीं हटा रहे हैं, इसलिए COUNT (1) को हमेशा COUNT (*) के समान संख्या वापस करनी चाहिए।

+0

तालिका 1 से DISTINCT coloumn1 का चयन याद रखें! = तालिका 1 से गिनती चुनें (DISTINCT coloumn1); –

+0

भी गिनें (1) यहां 1 coloumn नहीं है, यह एक अभिव्यक्ति है। उदाहरण के लिए) तालिका 1 से 1 का चयन करें; तालिका में पंक्तियों की कोई भी पंक्ति के लिए 1 बार प्रिंट नहीं करेगा। –

+0

तालिका 1 से गणना (DISTINCT/सभी कॉलमनाम) का चयन करें; कॉलम (कॉलमनाम) के सभी/विशिष्ट नॉट मानों में से कोई भी वापस नहीं लौटाएगा। –

2

ओरेकल में मैं इन का मानना ​​है कि वास्तव में एक ही मतलब है

+0

क्या 1 कॉलम को संदर्भित करता है? – dacracot

+0

संख्या, 1 निरंतर संख्या 1 को संदर्भित करता है। जब आप कहते हैं, 1 द्वारा आदेश, यह कॉलम को संदर्भित करता है। – Thilo

+0

जो मैंने थोड़ी देर पहले सोचा था, लेकिन आप कॉलम गिनती से अधिक किसी भी संख्या को निर्दिष्ट कर सकते हैं, फिर भी परिणाम समान है। तो यह निश्चित रूप से कॉलम संख्या नहीं है। – Nrj

6

यह

SELECT * FROM table_name and SELECT 1 FROM table_name. 

यदि आप करते हैं के बीच का अंतर

SELECT 1 FROM table_name 

यह आप के लिए नंबर 1 दे देंगे के समान है तालिका में प्रत्येक पंक्ति। तो हाँ count(*) और count(1) वही परिणाम प्रदान करेगा जैसे count(8) या count(column_name)

+3

गिनती (कॉलम_नाम) गिनती (*) की गिनती (*) को फिर से लिखती है (कॉलम_नाम) बिल्कुल समान नहीं है - यह उस कॉलम में शून्य के साथ पंक्तियों की गणना नहीं करता है। विवरण के लिए यहां देखें: http://stackoverflow.com/questions/169784 – Blorgbeard

+0

हम्म, वास्तव में यह SQL सर्वर के लिए है। मुझे लगता है कि ओरेकल अलग-अलग काम कर सकता है। – Blorgbeard

+0

गणना मानक एसक्यूएल के अनुसार कभी भी नल मानों का उपयोग नहीं करना चाहिए, ओरेकल और एसक्यूएल सर्वर को इस संबंध में एक ही व्यवहार होना चाहिए। – Thorsten

4

कोई अंतर नहीं है।

COUNT(1) मूल रूप से बस प्रत्येक पंक्ति के लिए निरंतर मान 1 कॉलम की गणना कर रहा है। जैसा कि अन्य उपयोगकर्ताओं ने कहा है, यह COUNT(0) या COUNT(42) जैसा ही है। कोई भी गैर- NULL मूल्य पर्याप्त होगा।

http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789

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

2
SELECT COUNT(1) from <table name> 

के रूप में सटीक एक ही बात करना चाहिए

SELECT COUNT(*) from <table name> 

वहाँ हो सकता है या अभी भी कुछ कारण हैं कि यह कुछ डेटाबेस पर की तुलना में बेहतर प्रदर्शन करेंगे SELECT COUNT(*) हो, लेकिन मैं पर विचार करेंगे कि में एक बग डीबी।

SELECT COUNT(col_name) from <table name> 

हालांकि इसका एक अलग अर्थ है, क्योंकि यह केवल कॉलम के लिए गैर-शून्य मूल्य वाली पंक्तियों की गणना करता है।

17

यहां a link है जो आपके प्रश्नों के उत्तर देने में मदद करेगा।संक्षेप में:

गिनती (*) इसे लिखने और गिनती करने के लिए सही तरीका क्या है (1) गिनती (*) आंतरिक रूप से बीई के लिए अनुकूलित है -

के बाद से

क) पंक्तियों गिनती जहां 1 अशक्त नहीं है से
ख कम कुशल है) पंक्तियों

0

तुम कौन पूछने पर निर्भर करता है गिनती, कुछ लोगों का कहना है कि select count(*) from random_table से select count(1) from random_table; रन तेजी से क्रियान्वित करने। दूसरों का दावा है कि वे बिल्कुल वही हैं।

यह link दावा करता है कि 2 के बीच गति अंतर एक पूर्ण तालिका स्कैन बनाम तेजी से पूर्ण स्कैन के कारण है।

+0

आप लिंक को गलत व्याख्या कर रहे हैं। एलएस इस बिंदु को बना रहा है कि COUNT (COLUMN) COUNT (*) की तुलना में तेज़ और तेज़ हो सकता है, लेकिन केवल जब नल कॉलम अनुक्रमित नहीं होते हैं, लेकिन COLUMN अनुक्रमित है और वास्तव में कोई शून्य मान नहीं है। एक चाल सवाल के अधिक। –

+1

मैं इस दावे को दस्तावेज करने के लिए लिंक का उपयोग करने का प्रयास कर रहा था कि, कुछ परिस्थितियों में, COUNT (1) COUNT (*) से तेज़ हो सकता है। कुछ पहले के उत्तरों ने यह बयान दिया था कि 2 के बीच कोई अंतर नहीं था, और मैं एक संभावित काउंटर उदाहरण प्रदान कर रहा था। –

10

गिनती (*) और गिनती (1) के बीच अंतर ओरेकल में?

गिनती (*) यह सभी रिकॉर्ड प्रत्येक और हर सेल यानी की गणना होती है इसका मतलब है लेकिन

गिनती (1) यह मान 1 के साथ एक छद्म स्तंभ जोड़ देगा का मतलब है और सभी रिकॉर्ड की गणना देता है

+0

धन्यवाद! इससे अन्य शीर्ष उत्तरों पढ़ने के बाद मदद मिली –

1

आप इस तरह परीक्षण कर सकते हैं:

create table test1(
id number, 
name varchar2(20) 
); 

insert into test1 values (1,'abc'); 
insert into test1 values (1,'abc'); 

select * from test1; 
select count(*) from test1; 
select count(1) from test1; 
select count(ALL 1) from test1; 
select count(DISTINCT 1) from test1; 
संबंधित मुद्दे