W MariaDB MINUS
Operator zwraca różne wiersze z lewego zapytania wejściowego, które nie są wyprowadzane przez prawe zapytanie wejściowe.
MINUS
operator został wprowadzony w MariaDB 10.6.1 jako synonim EXCEPT
operatora dla celów zgodności z Oracle. Dlatego możemy użyć MINUS
i EXCEPT
zamiennie (w MariaDB 10.6.1 i nowszych).
Odkryłem jednak, że MINUS
operator działa tylko wtedy, gdy mój sql_mode = "oracle"
. Chociaż nie jest to wyraźnie wymienione w dokumentacji MariaDB, jest to implikowane w zadaniu implementacji MINUS
operator w MariaDB.
Przykładowe dane
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ć MINUS
operatora, aby zwrócić nauczycieli, którzy nie są również uczniami.
Ustaw sql_mode
do Oracle
Zanim zaczniemy używać MINUS
operatora, ustawmy nasz sql_mode
do oracle
:
SET sql_mode = "oracle";
OK, teraz możemy iść dalej i użyć MINUS
operatora.
Przykład MINUS
SELECT TeacherName FROM Teachers
MINUS
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
MINUS
SELECT TeacherName FROM Teachers;
Wynik:
+-------------+ | StudentName | +-------------+ | Faye | | Jet | | Spike | | Ein | +-------------+
Możliwe jest uzyskanie tego samego wyniku bez użycia MINUS
(lub EXCEPT
) operatora. 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 | +-------------+
Dołącz duplikaty
Domyślnie MINUS
operator domyślnie stosuje DISTINCT
operacja. Innymi słowy, domyślnie zwraca tylko różne wartości. Ale możemy określić MINUS ALL
aby uwzględnić duplikaty w wyniku:
SELECT TeacherName FROM Teachers
MINUS 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
MINUS 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.
Nie jesteś w trybie Oracle?
Oto, co się dzieje, gdy próbujemy użyć MINUS
gdy nie jest w trybie Oracle.
Zresetujmy nasz sql_mode
do ustawienia domyślnego:
SET sql_mode = default;
Teraz spróbujmy użyć MINUS
operator ponownie:
SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;
Wynik:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT StudentName FROM Students' at line 3