Na uniwersytecie mój profesor nauczył mnie w tym roku, że ta instrukcja SQL:
SELECT COUNT(length) FROM product
zwróci 2
następujący zestaw danych:
| product |
|id | length | code |
|-------------------|
| 1 | 11 | X00 |
| 2 | 11 | C02 |
| 3 | 40 | A31 |
Uzasadniła to stwierdzeniem, że COUNT
nie liczy duplikatów.
Powiedziałem profesorowi, że myślałem, że popełniła błąd. Odpowiedziała mi, że niektóre DBMS mogą, ale nie muszą, liczyć duplikaty.
Po wypróbowaniu wielu DBMS, nigdy nie znalazłem takiego, który ma takie zachowanie.
Czy ten DBMS istnieje?
Czy jest jakiś powód, aby profesor uczył tego zachowania? I nawet nie wspominając, że inne DBMS mogą zachowywać się inaczej?
Do Twojej wiadomości, wsparcie kursu jest dostępne tutaj (w języku francuskim) . Dany slajd znajduje się w lewym dolnym rogu na stronie 10.
Odpowiedzi:
COUNT
liczy duplikaty we wszystkich DBMS, o których wiem, ale.Tak, jest powód. W oryginalnej teorii relacyjnej (która leży u podstaw wszystkich współczesnych relacyjnych DBMS) relacja jest zbiorem w matematycznym znaczeniu tego słowa. Oznacza to, że żadna relacja nie może w ogóle zawierać duplikatów, w tym wszystkich relacji przejściowych, a nie tylko „tabel”.
Zgodnie z tą zasadą można powiedzieć, że
SELECT length FROM product
zawiera już tylko dwa wiersze, a zatem odpowiednieCOUNT
zwroty2
, a nie3
.Na przykład w Rel DBMS, używając relacji podanej w pytaniu i składni Tutoriala D :
daje:
źródło
COUNT
zachowuje się inaczej niż implementacje SQL.Albo twój profesor popełnił błąd, albo źle zrozumiałeś, co powiedziała. W kontekście relacyjnych DBMS wdrożonych przez różnych dostawców funkcja agregująca
COUNT(<expression>)
zwraca liczbę wartości innych niż NULL<expression>
w zestawie wyników (lub grupie).Istnieje szczególny przypadek
COUNT(*)
, który zwraca liczbę wierszy w zestawie wyników lub grupie, a nie liczbę wartości czegokolwiek. Jest to równoważne zCOUNT(<constant expression>)
npCOUNT(1)
.Wiele baz wsparcia
COUNT(DISTINCT <expression>)
, które będzie powrócić liczbę unikalnych wartościach<expression>
.źródło
Jeśli twój profesor mówi o SQL, instrukcja jest błędna.
COUNT(x)
zwróci liczbę wierszy, w których xIS NOT NULL
zawiera duplikaty.COUNT(*) or COUNT([constant])
jest szczególnym przypadkiem, który policzy wiersze, nawet te, w których znajduje się każda kolumnaNULL
. Jednak duplikaty są zawsze liczone, chyba że określiszCOUNT(distinct x)
. Przykład:COUNT(distinct *)
jest niepoprawny AFAIK.Na marginesie, NULL wprowadza pewne nieintuicyjne zachowanie. Jako przykład:
to znaczy:
Jeśli mówi on o systemie relacyjnym opisanym na przykład w książce Bazy danych, typy i model relacyjny: Trzeci manifest autorstwa CJ Date i Hugh Darwen - byłoby to prawidłowe stwierdzenie.
Powiedz, że mamy relację:
koresponduje z:
to znaczy
co zwróci 2 .
źródło
Tak to działa w MS SQL Server
źródło
Jeśli stół wyglądałby tak,
można oczekiwać, że zapytanie zwróci 2, przynajmniej w Oracle DB, ponieważ wartości zerowe nie są liczone. Duplikaty są jednak liczone w porządku.
źródło
może ona ma na myśli w połączeniu z unikalnym, Ale Count ma COUNT DUPLICATES. Są nauczyciele, którzy nie znają swoich rzeczy, nie martw się, po prostu poinformuj swoich kolegów z klasy / przyjaciół, aby kiedy przejdą na wyższy poziom dbania i prawdziwego życia, nie zapomną, lepiej jednak wyślij do nauczyciela anonimową wiadomość z pytaniem, że nie rozumiesz niektóre funkcje sql i chcesz demonstracji, poproś nauczyciela, aby zaproponował klasie, w jaki sposób wstawić duplikaty (nie mieć dużych danych), a kiedy używa liczby funkcji, masz ją. Niektóre osoby będą to odbierać, a także, gdy powie inne bazy danych, poproś ją, aby zapytała ją, które z nich, a następnie podwójnie ją złap i powiedz, że wypróbowałeś wszystkie te bazy danych, a one nie działają tak, jak powiedziała, a liczba ta podnosi duplikaty.
źródło