sql >> Databáze >  >> RDS >> MariaDB

MariaDB KROMĚ Vysvětlení operátora

V MariaDB, EXCEPT Operátor vrací řádky z levého vstupního dotazu, které nejsou výstupem pravého vstupního dotazu.

Jiný způsob, jak to uvést, je, že vrací všechny řádky zleva SELECT sada výsledků kromě řádky, které jsou vpravo SELECT sada výsledků.

Syntaxe

Oficiální syntaxe vypadá takto:

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}]

Výše uvedené také zahrnuje INTERSEC> a UNION operátory v syntaxi, protože pro tyto operátory platí stejná syntaxe.

Od MariaDB 10.4.0 lze k určení priority použít závorky.

Příklad

Předpokládejme, že máme následující tabulky:

SELECT * FROM Teachers;
SELECT * FROM Students;

Výsledek:

+-----------+-------------+
| 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        |
+-----------+-------------+

Můžeme použít EXCEPT operátor vrátit učitele, kteří nejsou zároveň studenty:

SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;

Výsledek:

+-------------+
| TeacherName |
+-------------+
| Ben         |
| Cathy       |
+-------------+

Získáváme tedy pouze hodnoty, které se objevují v Učitelé tabulka, která se také neobjevuje v Studenti stůl.

Ve výchozím nastavení vrací odlišné řádky, takže pro Cathy je vrácen pouze jeden řádek , i když jsou dva učitelé s tímto jménem. Toto chování můžeme změnit – více o tom později.

Můžeme to také přepnout a vložit Studenti tabulka vlevo a Učitelé vpravo.

SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;

Výsledek:

+-------------+
| StudentName |
+-------------+
| Faye        |
| Jet         |
| Spike       |
| Ein         |
+-------------+

Je možné získat stejný výsledek bez použití EXCEPT operátor. Například bychom mohli přepsat náš první příklad na toto:

SELECT 
    DISTINCT TeacherName
FROM Teachers t 
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);

Výsledek:

+-------------+
| TeacherName |
+-------------+
| Ben         |
| Cathy       |
+-------------+

Pamatujte, že KROMĚ operátor pomáhá značně zjednodušit kód.

Zahrnout duplikáty

Ve výchozím nastavení EXCEPT operátor implicitně aplikuje DISTINCT úkon. Jinými slovy, ve výchozím nastavení vrací pouze odlišné hodnoty.

Před MariaDB 10.5.0, implicitní DISTINCT byla naše jediná možnost – nebyli jsme schopni zadat ALL . MariaDB 10.5.0 však zavedla EXCEPT ALL a EXCEPT DISTINCT syntax.

To znamená, že nyní můžeme provádět dotazy jako tento:

SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;

Výsledek:

+-------------+
| TeacherName |
+-------------+
| Cathy       |
| Ben         |
| Cathy       |
| Bill        |
+-------------+

Tentokrát jsme dostali čtyři řádky místo dvou, které jsme dostali v našem prvním příkladu.

Můžeme vidět, že obě Cathy byly vráceny místo jedné, jako v našem prvním příkladu.

Co se týče Billa? V Učitelé jsou dva návrhy zákonů stůl, ale vrací se sem jen jeden. Je to pravděpodobně proto, že v Studenti je jeden účet tabulky, což by vyřadilo jeden z účtů z našich výsledků.

A zde je příklad, který explicitně používá DISTINCT operátor:

SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;

Výsledek:

+-------------+
| TeacherName |
+-------------+
| Ben         |
| Cathy       |
+-------------+

Podle očekávání dostaneme stejný výsledek, jaký bychom dostali, kdybychom odstranili DISTINCT operátor.

V MariaDB 10.6.1 MINUS byl představen jako synonymum pro KROMĚ . Proto můžeme použít MINUS místo EXCEPT v MariaDB 10.6.1 a novějších.


  1. Zaznamenejte změny záznamu na serveru SQL do auditní tabulky

  2. Vrátit všechny nepočítané sloupce z tabulky na serveru SQL Server

  3. Funkce SCHEMA() v MySQL

  4. Nejlepší způsob, jak otestovat, zda existuje řádek v tabulce MySQL