किसी भी डेटाबेस तालिकाओं पर "table_name से गिनती (1)" का क्या अर्थ है?


92

जब हम निष्पादित करते हैं तो select count(*) from table_nameयह पंक्तियों की संख्या लौटाता है।

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


1
दिलचस्प सवाल। मुझे इस बात में भी दिलचस्पी होगी कि क्या उत्तर कार्यान्वयन-निर्भर है (जैसे कि क्वेरी का परिणाम SQL सर्वर में वैसा ही हो जैसा कि Oracle में है)।
जॉन श्नाइडर 3

जवाबों:


106

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

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

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


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

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

तालिका 1 से गिनती (DISTINCT / ALL columnName) का चयन करें; कॉलम (कॉलम नाम) के सभी / अलग नहीं पूर्ण मानों की कोई वापसी नहीं करेगा।
कानागावेलु सुगुमार

तालिका 1 से DISTINCT कॉलम 1 का चयन करें; कॉलम (कॉलम 1) में एक NULL मान शामिल होगा। तालिका 1 से गिनती (DISTINCT coloumn1) का चयन करें; एक भी पूर्ण पंक्ति शामिल नहीं होगी।
कनागावेलु सुगुमार

1
@datps - वास्तव में एक असीमित संख्या में अभिव्यक्तियाँ हैं जो समान परिणाम देती हैं। COUNT ('हैलो, दुनिया!') को भी काम करना चाहिए। (मैंने इसे आज़माया नहीं है।) तो सवाल यह है कि क्यों एक विशेष अभिव्यक्ति (*) बनाएं जब पहले से ही एक ही काम करने के तरीकों की असीमित संख्या हो? मैं SQL के रचनाकारों के लिए नहीं बोल सकता (जिनके पास प्रायश्चित करने के लिए कई पाप हैं :)), लेकिन यह शायद ऐसा था कि लोगों को मनमाने ढंग से एक अशक्त अभिव्यक्ति का चयन नहीं करना होगा। इससे क्वेरी के लेखक के इरादे का पता चल जाएगा। "उन्होंने 2 के बजाय 1 क्यों लिखा? इसका कुछ मतलब होना चाहिए!"
जेफरी एल व्हाइटलेज

26

यहाँ है एक लिंक दिया गया है जो आपके सवालों के जवाब देने में मदद करेगा। संक्षेप में:

काउंट (*) इसे लिखने का सही तरीका है और काउंट (1) बीई काउंट के लिए ऑप्टिमाइज़ किया गया है (*) आंतरिक रूप से -

a) उन पंक्तियों को गिनें जहाँ 1 n n से कम कुशल नहीं है
) पंक्तियों को गिनें


17

गणना (*) और गिनती (1) के बीच का अंतर?

count (*) का अर्थ है कि यह सभी रिकॉर्डों को गिनेगा और प्रत्येक सेल BUT होगा

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


9

यह बीच के अंतर के समान है

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
गिनती (column_name) काफी समान नहीं है - यह उस कॉलम में अशक्त पंक्तियों की गणना नहीं करता है। विवरण के लिए यहां देखें: stackoverflow.com/questions/169784
Blorgbeard

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

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

"SELECT * FROM table_name और SELECT 1 FROM table_name के बीच अंतर के समान।" -- ज़रुरी नहीं। सेलेक्ट * और सेलेक्ट 1 अलग हैं। Select (*) और SELECT (1) समान परिणाम देते हैं।
डेविड एल्ड्रिज

7

इसमें कोई फर्क नही है।

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) सम्मेलन अस्तित्व में आया।


5
SELECT COUNT(1) from <table name>

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

SELECT COUNT(*)  from <table name>

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

SELECT COUNT(col_name) from <table name>

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


3

oracle में मेरा मानना ​​है कि ये बिल्कुल एक ही अर्थ है


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

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

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

@dacracot: यह हो सकता है लेकिन मुझे ऐसा नहीं लगता। जो मैं अलंकृत समझता हूं, वह पृष्ठभूमि में काउंट (*) होने की गिनती (1) को फिर से लिखता है
जैरोड इलियट

2

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

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;

0

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

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


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

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