V MariaDB, MINUS
operátor vrátí odlišné řádky z levého vstupního dotazu, které nejsou výstupem pravého vstupního dotazu.
MINUS
operátor byl představen v MariaDB 10.6.1 jako synonymum pro EXCEPT
provozovatele pro účely kompatibility s Oracle. Proto můžeme použít MINUS
a EXCEPT
zaměnitelně (v MariaDB 10.6.1 a novějších).
Zjistil jsem však, že MINUS
Operátor funguje pouze tehdy, když můj sql_mode = "oracle"
. Ačkoli to není výslovně uvedeno v dokumentaci MariaDB, je to zahrnuto v úloze implementace MINUS
operátor v MariaDB.
Ukázková data
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 MINUS
operátor vrátit učitele, kteří nejsou zároveň studenty.
Nastavit sql_mode
na Oracle
Než začneme používat MINUS
operátor, nastavíme náš sql_mode
na oracle
:
SET sql_mode = "oracle";
OK, nyní můžeme pokračovat a použít MINUS
operátor.
Příklad MINUS
SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;
Výsledek:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Získáváme tedy pouze hodnoty, které se objevují v Teachers
tabulka, která se také neobjevuje v Students
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 Students
tabulka vlevo a Teachers
vpravo.
SELECT StudentName FROM Students
MINUS
SELECT TeacherName FROM Teachers;
Výsledek:
+-------------+ | StudentName | +-------------+ | Faye | | Jet | | Spike | | Ein | +-------------+
Je možné získat stejný výsledek bez použití MINUS
(nebo 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 | +-------------+
Zahrnout duplikáty
Ve výchozím nastavení MINUS
operátor implicitně aplikuje DISTINCT
úkon. Jinými slovy, ve výchozím nastavení vrací pouze odlišné hodnoty. Ale můžeme zadat MINUS ALL
chcete-li do výsledku zahrnout duplikáty:
SELECT TeacherName FROM Teachers
MINUS 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 Teachers
jsou dva návrhy zákonů stůl, ale vrací se sem jen jeden. Je to pravděpodobně proto, že v Students
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
MINUS 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.
Nejste v režimu Oracle?
Zde je to, co se stane, když se pokusíme použít MINUS
když není v režimu Oracle.
Obnovme náš sql_mode
na výchozí nastavení:
SET sql_mode = default;
Nyní zkusme použít MINUS
znovu operátor:
SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;
Výsledek:
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