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

MariaDB Z WYJĄTKIEM Operatora wyjaśniono

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.


  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 UTC_TIMESTAMP() działa w MariaDB

  2. MariaDB Z WYJĄTKIEM Operatora wyjaśniono

  3. Jak działa FORMAT() w MariaDB?

  4. 7 opcji włączania potoków (||) jako operatora konkatenacji w MariaDB

  5. Zwróć język używany dla funkcji daty i godziny w MariaDB