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