W MariaDB EXCEPT
operator zwraca wiersze z lewego zapytania wejściowego, które nie są wyprowadzane przez prawe zapytanie wejściowe.
Innym sposobem na umieszczenie tego jest to, że zwraca wszystkie wiersze od lewej SELECT
zestaw wyników z wyjątkiem wiersze, które są w prawym SELECT
zestaw wyników.
Składnia
Oficjalna składnia wygląda następująco:
SELECT ...
(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL | DISTINCT]) SELECT ...
[(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL | DISTINCT]) SELECT ...]
[ORDER BY [column [, column ...]]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
Powyższe obejmuje również INTERSECT
i UNION
operatorów w składni, ponieważ ta sama składnia dotyczy tych operatorów.
Od wersji MariaDB 10.4.0 do określenia pierwszeństwa można użyć nawiasów.
Przykład
Załóżmy, że mamy następujące tabele:
SELECT * FROM Teachers;
SELECT * FROM Students;
Wynik:
+-----------+-------------+ | TeacherId | TeacherName | +-----------+-------------+ | 1 | Warren | | 2 | Ben | | 3 | Cathy | | 4 | Cathy | | 5 | Bill | | 6 | Bill | +-----------+-------------+ +-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | Faye | | 2 | Jet | | 3 | Spike | | 4 | Ein | | 5 | Warren | | 6 | Bill | +-----------+-------------+
Możemy użyć EXCEPT
operator zwracający nauczycieli, którzy nie są jednocześnie uczniami:
SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;
Wynik:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Tak więc otrzymujemy tylko wartości, które pojawiają się w Teachers
tabela, która nie pojawia się również w Students
stół.
Domyślnie zwraca różne wiersze, więc dla Cathy
zwracany jest tylko jeden wiersz , mimo że jest dwóch nauczycieli o tym nazwisku. Możemy zmienić to zachowanie – więcej o tym później.
Możemy też to zmienić i umieścić Students
tabela po lewej i Teachers
po prawej.
SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;
Wynik:
+-------------+ | StudentName | +-------------+ | Faye | | Jet | | Spike | | Ein | +-------------+
Możliwe jest uzyskanie tego samego wyniku bez użycia EXCEPT
operator. Na przykład moglibyśmy przepisać nasz pierwszy przykład do tego:
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
Wynik:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Pamiętaj, EXCEPT
operator pomaga znacznie uprościć kod.
Dołącz duplikaty
Domyślnie EXCEPT
operator domyślnie stosuje DISTINCT
operacja. Innymi słowy, domyślnie zwraca tylko różne wartości.
Przed wersją MariaDB 10.5.0 niejawny DISTINCT
była naszą jedyną opcją – nie byliśmy w stanie określić ALL
. Jednak MariaDB 10.5.0 wprowadziła EXCEPT ALL
i EXCEPT DISTINCT
składnia.
Oznacza to, że możemy teraz wykonywać takie zapytania:
SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;
Wynik:
+-------------+ | TeacherName | +-------------+ | Cathy | | Ben | | Cathy | | Bill | +-------------+
Tym razem otrzymaliśmy cztery wiersze, zamiast dwóch, które otrzymaliśmy w naszym pierwszym przykładzie.
Widzimy, że obie Cathys zostały zwrócone zamiast jednej, jak w naszym pierwszym przykładzie.
A co do Billa? W sekcji Teachers
znajdują się dwa rachunki tabela, ale tutaj zwracana jest tylko jedna. To prawdopodobnie dlatego, że w grupie Students
jest jeden rachunek tabeli, która wykluczałaby jeden z rachunków z naszych wyników.
A oto przykład, który wyraźnie używa DISTINCT
operator:
SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;
Wynik:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Zgodnie z oczekiwaniami otrzymujemy taki sam wynik, jaki byśmy otrzymali, gdybyśmy usunęli DISTINCT
operatora.
W MariaDB 10.6.1, MINUS
został wprowadzony jako synonim dla EXCEPT
. Dlatego możemy użyć MINUS
zamiast EXCEPT
w MariaDB 10.6.1 i nowszych.