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.