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