Mein Professor hat mir beigebracht, dass COUNT keine Duplikate zählt

40

An der Universität hat mir mein Professor dieses Jahr beigebracht, dass diese SQL-Anweisung:

SELECT COUNT(length) FROM product

wird 2mit dem folgenden Datensatz zurückkehren:

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

Sie begründete dies damit, dass COUNTDuplikate nicht gezählt würden.

Ich sagte meinem Professor, dass ich dachte, sie hätte einen Fehler gemacht. Sie antwortete mir, dass einige DBMS möglicherweise Duplikate zählen oder nicht.

Nachdem ich viele DBMS ausprobiert habe, habe ich noch nie eines gefunden, das dieses Verhalten aufweist.

Existiert dieses DBMS?

Gibt es einen Grund für einen Professor, dieses Verhalten zu lehren? Und ohne auch nur zu erwähnen, dass sich andere DBMS möglicherweise anders verhalten?


Zu Ihrer Information, die Kursunterstützung finden Sie hier (in französischer Sprache) . Die betroffene Folie befindet sich in der unteren linken Ecke auf Seite 10.

Jules Lamur
quelle
1
Da in den Folien von ANSi SQL die Rede ist, ist Ihr Professor falsch, selbst im Standard von 1992 (siehe Seite 125 hier contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ) werden die verschiedenen Verhaltensweisen für die Zählung mit und ohne DISTINCT aufgelistet. Vielleicht möchten Sie die Bibliothek besuchen tonged eine aktualisierte Version (die mehr Optionen wie ALL / OVER enthält)
Eckes

Antworten:

38

COUNT zählt Duplikate in allen mir bekannten DBMS, aber.

Gibt es einen Grund für einen Professor, dieses Verhalten zu lehren?

Ja, es gibt einen Grund. In der ursprünglichen relationalen Theorie (die allen modernen relationalen DBMS zugrunde liegt) ist die Beziehung eine Menge im mathematischen Sinne dieses Wortes. Das bedeutet, dass keine Relation Duplikate enthalten kann, einschließlich aller Übergangsrelationen, nicht nur Ihre „Tabellen“.

Nach diesem Prinzip kann man sagen, dass SELECT length FROM productbereits nur zwei Zeilen enthalten sind, daher entsprechende COUNTRückgaben 2, nicht 3.


Zum Beispiel in Rel DBMS unter Verwendung der in Frage und Tutorial D angegebenen Beziehung :

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

gibt:

Rel Ergebnis

Vadim Pushtaev
quelle
1
Da wir später in diesem Jahr bei diesem Professor relationale Theoriekurse hatten, denke ich, dass dies die richtige Antwort ist. Wie auch immer, ich werde meinen Professor um weitere Informationen bitten.
Jules Lamur
2
Der Lehrer sprach vielleicht allgemein von DBMS, nicht nur von SQL-DBMS. Wie die Bearbeitung zeigt, gibt es Implementierungen des relationalen Modells (z. B. Rel), bei denen COUNTsich das Verhalten von SQL-Implementierungen unterscheidet.
ypercubeᵀᴹ
47

Entweder hat Ihr Professor einen Fehler gemacht oder Sie haben falsch verstanden, was sie gesagt hat. Im Kontext von relationalen DBMS, wie sie von verschiedenen Anbietern implementiert wurden, gibt die Aggregatfunktion COUNT(<expression>)die Anzahl der Nicht-NULL-Werte <expression>in der Ergebnismenge (oder einer Gruppe) zurück.

Es gibt einen Sonderfall von COUNT(*), der die Anzahl der Zeilen in der Ergebnismenge oder Gruppe und nicht die Anzahl der Werte von irgendetwas zurückgibt . Dies ist äquivalent zu COUNT(<constant expression>), wie z COUNT(1).

Viele Datenbanken unterstützen COUNT(DISTINCT <expression>), was wird die Anzahl der eindeutigen Werte zurückgeben <expression>.

mustaccio
quelle
13

Wenn Ihr Professor über SQL spricht, ist die Aussage falsch. COUNT(x)Gibt die Anzahl der Zeilen zurück, in denen x IS NOT NULLDuplikate enthält. COUNT(*) or COUNT([constant])Dies ist ein Sonderfall, bei dem die Zeilen gezählt werden, auch die, in denen sich jede Spalte befindet NULL. Duplikate werden jedoch immer gezählt, sofern Sie dies nicht angeben COUNT(distinct x). Beispiel:

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 *) ist ungültig AFAIK.

Als Randnotiz führt NULL ein unintuitives Verhalten ein. Als Beispiel:

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

dh:

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

Wenn es sich um ein relationales System handelt, wie es beispielsweise in dem Buch " Datenbanken, Typen und das relationale Modell: Das dritte Manifest" von CJ Date und Hugh Darwen beschrieben wird, wäre dies eine korrekte Aussage.

Sagen Sie, dass wir die Beziehung haben:

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

entspricht:

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

dh

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

das würde 2 zurückgeben .

Lennart
quelle
3

So funktioniert es in MS SQL Server

COUNT (*) gibt die Anzahl der Elemente in einer Gruppe zurück. Dies schließt NULL-Werte und Duplikate ein.

COUNT (ALL expression) wertet den Ausdruck für jede Zeile in einer Gruppe aus und gibt die Anzahl der nicht leeren Werte zurück.

COUNT (DISTINCT-Ausdruck) wertet den Ausdruck für jede Zeile in einer Gruppe aus und gibt die Anzahl der eindeutigen, nicht leeren Werte zurück.

Daniel Björk
quelle
1

Wenn der Tisch so ausgesehen hätte,

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

Sie könnten erwarten, dass die Abfrage mindestens in Oracle DB 2 zurückgibt, da Nullen nicht gezählt werden. Duplikate werden jedoch in Ordnung gezählt.

Terje
quelle
-7

Vielleicht meint sie in Verbindung mit Unique, aber Count macht COUNT DUPLICATES. Es gibt einige Lehrer, die sich mit ihren Sachen nicht auskennen. Keine Sorge, informieren Sie einfach Ihre Klassenkameraden / Freunde, damit sie, wenn sie in die höhere Klasse aufsteigen und das wirkliche Leben nicht vergessen, besser noch eine anonyme Nachricht an Ihre Lehrerin schicken und sie fragen, ob sie es nicht getan haben Verstehen Sie einige der SQL-Funktionen und möchten Sie eine Demonstration. Lassen Sie sich von Ihrer Lehrerin eine Möglichkeit einfallen, der Klasse vorzuschlagen, was einzufügen ist, einschließlich Duplikate (die Daten müssen nicht groß sein). Wenn sie die Funktionsanzahl verwendet, haben Sie sie. Einige Leute werden es aufgreifen. Auch wenn sie andere Datenbanken sagt, lassen Sie Ihre Freundin fragen, welche, dann fangen Sie sie doppelt und sagen, Sie haben alle diese Datenbanken ausprobiert und sie funktionieren nicht wie sie gesagt hat und diese Zählung nimmt Duplikate auf.

dasda
quelle
2
Ich bin mir nicht sicher, ob ich den Lehrer absichtlich antagonisieren würde. Bei manchen mag es völlig ausreichend sein, sich nur persönlich mit ihnen zu treffen und danach zu fragen, wenn Sie ein Gegenbeispiel haben (nur um zu zeigen, dass Sie einen Grund haben, danach zu fragen). Dennoch sind die Grundlagen des Ansatzes gültig; bis zum OP die spezifische Richtung zu verwenden.
RDFozz