MariaDB
 sql >> Baza danych >  >> RDS >> MariaDB

Objaśnienie operatora MariaDB MINUS

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak działa QUARTER() w MariaDB

  2. Jak działa funkcja EXPORT_SET() w MariaDB

  3. MariaDB JSON_SEARCH() Objaśnienie

  4. Napraw „BŁĄD 1222 (21000):Użyte instrukcje SELECT mają inną liczbę kolumn” podczas korzystania z UNION w MariaDB

  5. 2 sposoby na uzyskanie skróconej nazwy miesiąca z daty w MariaDB