อาจารย์ของฉันสอนฉันว่า `COUNT 'ไม่นับซ้ำกัน


40

ที่มหาวิทยาลัยอาจารย์ของฉันสอนฉันปีนี้ว่าคำสั่ง SQL นี้:

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 คุณอาจต้องการที่จะเยี่ยมชมห้องสมุด tonged รุ่นที่ปรับปรุง (ซึ่งรวมถึงตัวเลือกมากขึ้นเช่น ALL / over)
Eckes

คำตอบ:


38

COUNT จะนับซ้ำใน DBMS ทั้งหมดที่ฉันทราบ แต่

มีเหตุผลใดที่อาจารย์ผู้สอนจะสอนพฤติกรรมนี้

ใช่มีเหตุผล ในทฤษฎีสัมพัทธภาพดั้งเดิม (ที่รองรับ DBMS เชิงสัมพันธ์ที่ทันสมัยทั้งหมด) ความสัมพันธ์เป็นชุดในความหมายทางคณิตศาสตร์ของคำนี้ นั่นหมายความว่าไม่มีความสัมพันธ์ใด ๆ ที่สามารถมีข้อมูลซ้ำได้รวมถึงความสัมพันธ์ในระยะเปลี่ยนผ่านทั้งหมดไม่ใช่แค่ "ตาราง" ของคุณ

ต่อไปนี้หลักการนี้คุณอาจพูดได้ว่าSELECT length FROM productมีอยู่แล้วเพียงสองแถวจึงสอดคล้องกับCOUNTผลตอบแทนไม่ได้23


ตัวอย่างเช่นในRel DBMS โดยใช้ความสัมพันธ์ที่กำหนดในคำถามและไวยากรณ์D ของบทช่วยสอน :

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

ให้:

Rel ผลลัพธ์


1
เนื่องจากเรามีหลักสูตรทฤษฎีเชิงสัมพันธ์กับศาสตราจารย์คนนี้ในปลายปีนี้ฉันคิดว่านี่เป็นคำตอบที่ถูกต้อง อย่างไรก็ตามฉันจะขอข้อมูลเพิ่มเติมจากอาจารย์ของฉัน
Jules Lamur

2
ครูอาจจะพูดคุยเกี่ยวกับ DBMS โดยทั่วไปไม่เพียง แต่เกี่ยวกับ SQL DBMSs เมื่อการแก้ไขแสดงให้เห็นว่ามีการใช้งานของโมเดลเชิงสัมพันธ์ (เช่น Rel) ซึ่งCOUNTมีพฤติกรรมแตกต่างจากการปรับใช้ SQL
ypercubeᵀᴹ

47

อาจารย์ของคุณทำผิดพลาดหรือคุณเข้าใจผิดว่าเธอพูดอะไร ในบริบทของ DBMS เชิงสัมพันธ์ซึ่งดำเนินการโดยผู้ขายหลายรายฟังก์ชันการรวมCOUNT(<expression>)จะส่งคืนจำนวนของค่าที่ไม่ใช่ค่า NULL <expression>ในชุดผลลัพธ์ (หรือกลุ่ม)

มีกรณีพิเศษCOUNT(*)คือซึ่งส่งคืนจำนวนแถวในชุดผลลัพธ์หรือกลุ่มไม่ใช่จำนวนของค่าใด ๆ นี้จะเทียบเท่ากับเช่นCOUNT(<constant expression>)COUNT(1)

ฐานข้อมูลจำนวนมากสนับสนุนCOUNT(DISTINCT <expression>)ซึ่งจะ<expression>กลับจำนวนของค่าที่เป็นเอกลักษณ์ของ


13

หากอาจารย์ของคุณกำลังพูดถึง SQL คำสั่งนั้นผิด COUNT(x)จะส่งคืนจำนวนแถวที่ x IS NOT NULLรวมถึงซ้ำกัน เป็นกรณีพิเศษที่จะนับแถวแม้กระทั่งผู้ที่ทุกคอลัมน์คือCOUNT(*) 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)

หากเขา / เธอกำลังพูดถึงระบบสัมพันธ์ตามที่อธิบายไว้โดยตัวอย่างเช่นหนังสือฐานข้อมูลประเภทและโมเดลเชิงสัมพันธ์: การประกาศที่สามโดย CJ Date และ Hugh Darwen - มันจะเป็นคำสั่งที่ถูกต้อง

บอกว่าเรามีความสัมพันธ์:

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 Server

COUNT (*) ส่งคืนจำนวนรายการในกลุ่ม ซึ่งรวมถึงค่า NULL และรายการที่ซ้ำกัน

COUNT (นิพจน์ทั้งหมด) ประเมินค่านิพจน์สำหรับแต่ละแถวในกลุ่มและส่งคืนจำนวนของค่าที่ไม่เป็นค่าว่าง

COUNT (นิพจน์ DISTINCT) จะประเมินค่านิพจน์สำหรับแต่ละแถวในกลุ่มและส่งกลับจำนวนของค่าที่ไม่ซ้ำกันและไม่เป็นศูนย์


1

หากตารางมีลักษณะเช่นนี้

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

คุณอาจคาดหวังให้แบบสอบถามส่งคืน 2 อย่างน้อยที่สุดใน Oracle DB เนื่องจากไม่มีการนับค่าว่าง รายการที่ซ้ำกันจะถูกนับว่าใช้ได้


-7

บางทีเธออาจหมายถึงการรวมกับสิ่งที่ไม่ซ้ำใคร แต่ Count ก็ทำซ้ำ COUNT มีครูบางคนที่ไม่รู้จักสิ่งของพวกเขาไม่ต้องกังวลแค่แจ้งเพื่อนร่วมชั้นเรียน / เพื่อน ๆ ของคุณเพื่อที่ว่าเมื่อพวกเขาไปที่ฐานข้อมูลที่สูงขึ้นและชีวิตจริงพวกเขาจะไม่ลืมเลยดีกว่า แต่ยังส่งข้อความนิรนามถึงครูของคุณ ทำความเข้าใจกับฟังก์ชั่น sql บางอย่างและต้องการสาธิตให้ครูของคุณหาวิธีให้ชั้นเรียนแนะนำสิ่งที่จะใส่รวมถึงรายการที่ซ้ำกัน (ไม่ต้องมีข้อมูลขนาดใหญ่) และเมื่อเธอใช้จำนวนฟังก์ชั่น บางคนจะหยิบมันขึ้นมานอกจากนี้เมื่อเธอพูดว่าฐานข้อมูลอื่นให้เพื่อนของคุณถามเธอว่าคนไหนแล้วควักเธอสองครั้งแล้วพูดว่าคุณลองฐานข้อมูลทั้งหมดแล้วพวกเขาก็ไม่ได้ทำงานเหมือนที่เธอพูด


2
ฉันไม่แน่ใจว่าฉันตั้งใจจะเป็นปรปักษ์กับครูโดยเจตนา สำหรับบางคนมันอาจจะเพียงพอที่จะพบกับพวกเขาเป็นการส่วนตัวและถามเกี่ยวกับมันพร้อมกับคุณตอบโต้ตัวอย่าง (เพียงเพื่อแสดงให้เห็นว่าคุณมีเหตุผลที่จะถาม) ยังคงพื้นฐานของวิธีการที่ถูกต้อง; จนถึง OP เป็นทิศทางที่เฉพาะเจาะจงที่จะใช้
RDFozz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.