मेरे प्रोफेसर ने मुझे सिखाया कि `COUNT` डुप्लिकेट की गिनती नहीं करता है


40

विश्वविद्यालय में, मेरे प्रोफेसर ने मुझे यह सिखाया कि यह एसक्यूएल वक्तव्य:

SELECT COUNT(length) FROM product

2निम्नलिखित डेटासेट के साथ लौटेंगे :

|   product         |
|id | length | code |
|-------------------|
| 1 |    11  | X00  |
| 2 |    11  | C02  |
| 3 |    40  | A31  |

उसने यह कहकर इसे सही ठहराया कि COUNTडुप्लिकेट की गिनती नहीं है।

मैंने अपने प्रोफेसर से कहा कि मुझे लगा कि उसने एक त्रुटि की है। उसने मुझे जवाब दिया कि कुछ DBMS डुप्लिकेट की गिनती कर सकते हैं या नहीं।

DBMS की बहुत कोशिश करने के बाद, मुझे कभी ऐसा नहीं मिला, जिसमें यह व्यवहार हो।

क्या यह DBMS मौजूद है?

क्या इस व्यवहार को सिखाने के लिए एक प्रोफेसर के लिए कोई कारण है? और यह भी उल्लेख किए बिना कि अन्य DBMS अलग तरह से व्यवहार कर सकते हैं?


FYI करें, पाठ्यक्रम समर्थन यहाँ उपलब्ध है (फ्रेंच में) । संबंधित स्लाइड निचले बाएँ कोने में पृष्ठ 10 पर है।


1
चूंकि स्लाइड्स में ANSi SQL के बारे में बात की जाती है, इसलिए आपके प्रोफेसर गलत हैं, यहां तक ​​कि 1992 के मानक में भी (पृष्ठ 125 देखें यहां contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ) DISTINCT के साथ और उसके बिना गणना के विभिन्न व्यवहारों को सूचीबद्ध करता है। आप लाइब्रेरी को अद्यतन संस्करण (जिसमें ऑल /
ऑवर

जवाबों:


38

COUNT मैं सभी DBMS में डुप्लिकेट की गिनती करता हूं, जिनके बारे में मैं जानता हूं, लेकिन

क्या किसी प्रोफेसर के पास इस व्यवहार को सिखाने के लिए कोई कारण है

हाँ, एक कारण है। मूल संबंधपरक सिद्धांत में (जो सभी आधुनिक संबंधपरक DBMSes को रेखांकित करता है) संबंध इस शब्द के गणितीय अर्थ में एक सेट है। इसका मतलब है कि किसी भी संबंध में डुप्लिकेट शामिल नहीं हो सकते हैं, जिसमें सभी संक्रमणकालीन संबंध शामिल हैं, न कि केवल आपके "टेबल"।

इस सिद्धांत के बाद आप कह सकते हैं कि SELECT length FROM productपहले से ही केवल दो पंक्तियाँ हैं, इसलिए संबंधित COUNTरिटर्न 2, नहीं 3


उदाहरण के लिए, रिले डीबीएमएस में, प्रश्न और ट्यूटोरियल डी सिंटैक्स में दिए गए संबंध का उपयोग करते हुए :

SUMMARIZE product {length} BY {}: {c := COUNT()}

देता है:

रिजल्ट जारी


1
चूंकि इस साल के अंत में हमारे पास इस प्रोफेसर के साथ संबंधपरक सिद्धांत पाठ्यक्रम थे, इसलिए मुझे लगता है कि यह सही उत्तर है। वैसे भी, मैं अपने प्रोफेसर से अधिक जानकारी के लिए पूछूंगा।
जूल्स लामुर

2
शिक्षक शायद DBMSs के बारे में बात कर रहा था, न केवल SQL DBMSs के बारे में। जैसा कि संपादन से पता चलता है, रिलेशनल मॉडल (जैसे रिले) के COUNTकार्यान्वयन हैं , जहां एसक्यूएल कार्यान्वयन की तुलना में अलग तरीके से व्यवहार होता है।
ypercube y

47

या तो आपके प्रोफेसर ने गलती की या आपने जो कहा उसे गलत समझा। विभिन्न विक्रेताओं द्वारा कार्यान्वित रिलेशनल DBMSes के संदर्भ में, कुल फ़ंक्शन परिणाम सेट (या एक समूह) COUNT(<expression>)में गैर-पूर्ण मूल्यों की संख्या लौटाता है <expression>

का एक विशेष मामला है COUNT(*), जो परिणाम सेट या समूह में पंक्तियों की संख्या लौटाता है , किसी भी चीज़ के मूल्यों की संख्या नहीं। इस के बराबर है COUNT(<constant expression>), जैसे COUNT(1)

कई डेटाबेस समर्थन करते हैं COUNT(DISTINCT <expression>), जो अद्वितीय मूल्यों की संख्या को वापस कर देंगे<expression>


13

यदि आपका प्रोफेसर SQL के बारे में बात कर रहा है, तो कथन गलत है। डुप्लिकेट सहित COUNT(x)x जहां पंक्तियों की संख्या वापस करेगा IS NOT NULLCOUNT(*) or COUNT([constant])एक विशेष मामला है जो पंक्तियों की गणना करेगा, यहां तक ​​कि जहां हर स्तंभ है NULL। हालाँकि, डुप्लिकेट हमेशा गिने जाते हैं, जब तक आप निर्दिष्ट नहीं करते हैं COUNT(distinct x)। उदाहरण:

with t(x,y) as ( values (null,null),(null,1),(1,null),(1,1) )

select count(*) from t
4

select count(1) from t
4

select count(distinct 1) from t
1

select count(x) from t
2

select count(distinct x) from t
1

COUNT(distinct *) अमान्य है AFAIK

एक साइड नोट के रूप में, NULL कुछ अनपेक्षित व्यवहार का परिचय देता है। उदहारण के लिए:

SELECT SUM(x) + SUM(y),  SUM(x + y) FROM T
4, 2

अर्थात:

SUM(x)+SUM(y) <> SUM(x+y)

यदि वह एक संबंधित प्रणाली के बारे में बता रहा है, उदाहरण के लिए, सीजे डेट और ह्यूग डारवेन की पुस्तक डेटाबेस, टाइप्स, और रिलेशनल मॉडल: द थर्ड मेनिफेस्टो - यह एक सही कथन होगा।

कहो कि हमारा रिश्ता है:

STUDENTS = Relation(["StudentId", "Name"]
                    , [{"StudentId":'S1', "Name":'Anne'},
                       {"StudentId":'S2', "Name":'Anne'},
                       {"StudentId":'S3', "Name":'Cindy'},
                     ])
SELECT COUNT(NAME) FROM STUDENTS

से मेल खाती है:

COUNT(STUDENTS.project(['Name']))

अर्थात

COUNT( Relation(["Name"]
               , [{"Name":'Anne'},
                  {"Name":'Cindy'},
                ]) )

जो 2 लौटेगा ।


3

यह MS SQL सर्वर में कैसे काम करता है

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

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

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


1

यदि तालिका इस प्रकार दिखती थी,

|   product         |
|id | length | code |
|-------------------|
| 1 |    11  | X00  |
| 2 |    11  | C02  |
| 3 |  null  | A31  |

आप क्वेरी 2 की उम्मीद कर सकते हैं, कम से कम Oracle DB में, क्योंकि नल की गिनती नहीं की जाती है। हालांकि डुप्लिकेट को ठीक-ठीक गिना जाता है।


-7

शायद वह अद्वितीय के साथ संयोजन के रूप में मतलब है, लेकिन गणना COUP DUPLICATES। कुछ शिक्षक ऐसे होते हैं जो अपना सामान नहीं जानते हैं, कोई चिंता नहीं बस अपने सहपाठियों / दोस्तों को सूचित करें ताकि जब वे उच्च db और वास्तविक जीवन में जाएं तो वे भूल न जाएं, बेहतर अभी तक अपने शिक्षक को एक गुमनाम संदेश भेजते हुए पूछें कि उन्होंने नहीं किया कुछ sql फ़ंक्शन को समझें और एक प्रदर्शन चाहते हैं, तो क्या आपके शिक्षक को क्लास के लिए यह सुझाव देने के लिए एक तरीका है कि सम्मिलित करने के लिए क्या डुप्लिकेट शामिल हैं (डेटा बड़ा नहीं है) और जब वह फ़ंक्शन काउंट का उपयोग करता है, तो आप उसे मिल गए। कुछ लोग इस पर पिक करेंगे, साथ ही जब वह कहती है कि अन्य डेटाबेस, आपके मित्र ने उससे पूछा है कि कौन से लोग हैं, तो उसे दोहराएं और कहें कि आपने उन सभी डेटाबेसों की कोशिश की और वे काम नहीं करते हैं जैसे उसने कहा था और वह गणना डुप्लिकेट को चुनता है।


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