Di universitas, profesor saya mengajari saya tahun ini bahwa pernyataan SQL ini:
SELECT COUNT(length) FROM product
akan kembali 2
dengan dataset berikut:
| product |
|id | length | code |
|-------------------|
| 1 | 11 | X00 |
| 2 | 11 | C02 |
| 3 | 40 | A31 |
Dia membenarkannya dengan mengatakan itu COUNT
tidak termasuk duplikat.
Saya memberi tahu profesor saya bahwa saya pikir dia membuat kesalahan. Dia menjawab saya bahwa beberapa DBMS mungkin menghitung duplikat atau tidak.
Setelah mencoba banyak DBMS, saya tidak pernah menemukan yang memiliki perilaku ini.
Apakah DBMS ini ada?
Apakah ada alasan bagi seorang profesor untuk mengajarkan perilaku ini? Dan bahkan tanpa menyebutkan bahwa DBMS lain mungkin berperilaku berbeda?
FYI, dukungan kursus tersedia di sini (dalam bahasa Prancis) . Slide yang bersangkutan ada di sudut kiri bawah pada halaman 10.
Jawaban:
COUNT
menghitung duplikat di semua DBMS yang saya ketahui, tetapi.Ya, ada alasannya. Dalam teori relasional asli (yang mendasari semua DBMSes relasional modern) hubungan adalah himpunan dalam arti matematika dari kata ini. Itu berarti bahwa tidak ada hubungan yang bisa mengandung duplikat sama sekali, termasuk semua hubungan transisi, bukan hanya "tabel" Anda.
Mengikuti prinsip ini, Anda dapat mengatakan bahwa
SELECT length FROM product
sudah berisi hanya dua baris, karenanyaCOUNT
pengembalian yang sesuai2
, tidak3
.Misalnya, dalam Rel DBMS, menggunakan relasi yang diberikan dalam pertanyaan dan sintaks D Tutorial :
memberi:
sumber
COUNT
berperilaku berbeda dari implementasi SQL.Entah profesor Anda membuat kesalahan atau Anda salah mengerti apa yang dia katakan. Dalam konteks DBMS relasional, seperti yang diterapkan oleh berbagai vendor, fungsi agregat
COUNT(<expression>)
mengembalikan jumlah nilai-nilai non-NULL<expression>
dalam set hasil (atau grup).Ada kasus khusus
COUNT(*)
, yang mengembalikan jumlah baris dalam set atau grup hasil, bukan jumlah nilai apa pun. Ini setara denganCOUNT(<constant expression>)
, sepertiCOUNT(1)
.Banyak basis data mendukung
COUNT(DISTINCT <expression>)
, yang akan mengembalikan jumlah nilai unik<expression>
.sumber
Jika profesor Anda berbicara tentang SQL, pernyataannya salah.
COUNT(x)
akan mengembalikan jumlah baris di mana xIS NOT NULL
termasuk duplikat.COUNT(*) or COUNT([constant])
adalah kasus khusus yang akan menghitung baris, bahkan di mana setiap kolom beradaNULL
. Namun, duplikat selalu dihitung, kecuali jika Anda menentukanCOUNT(distinct x)
. Contoh:COUNT(distinct *)
AFAIK tidak valid.Sebagai catatan, NULL memperkenalkan beberapa perilaku tidak intuitif. Sebagai contoh:
yaitu:
Jika dia berbicara tentang sistem relasional seperti yang dijelaskan oleh, misalnya, buku Basis Data, Jenis, dan Model Relasional: Manifesto Ketiga oleh CJ Date dan Hugh Darwen - itu akan menjadi pernyataan yang benar.
Katakan bahwa kita memiliki hubungan:
sesuai dengan:
yaitu
yang akan mengembalikan 2 .
sumber
Ini adalah cara kerjanya di MS SQL Server
sumber
Jika meja tampak seperti ini,
Anda bisa mengharapkan permintaan untuk mengembalikan 2, setidaknya di Oracle DB, karena nol tidak dihitung. Namun duplikat dihitung dengan baik.
sumber
mungkin maksudnya bersamaan dengan unik, Tapi Hitung memang COUNT DUPLICATES. Ada beberapa guru yang tidak tahu barang-barang mereka, tidak ada kekhawatiran hanya menginformasikan teman sekelas Anda / teman sehingga ketika mereka pergi ke db yang lebih tinggi dan kehidupan nyata mereka tidak akan lupa, lebih baik mengirim pesan anonim kepada guru Anda bertanya kepadanya bahwa mereka tidak memahami beberapa fungsi sql dan ingin demonstrasi, mintalah guru Anda datang dengan cara untuk kelas untuk menyarankan apa yang harus dimasukkan termasuk duplikat (tidak memiliki data yang besar) dan ketika dia menggunakan jumlah fungsi, Anda mendapatkannya. Beberapa orang akan mengambilnya, Juga ketika dia mengatakan basis data lain, mintalah teman Anda menanyakan yang mana, lalu gandakan dia dan katakan Anda mencoba semua basis data itu dan mereka tidak berfungsi seperti katanya dan menghitung mengambil duplikat.
sumber