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

Vysvětlení operátora MariaDB MINUS

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

  1. Jak vygenerovat rozsah dat na serveru SQL Server

  2. Získávání dat z uložené procedury pomocí Entity Framework

  3. Jak vrátím pole jsonb a pole objektů z mých dat?

  4. Jak nainstalovat pgAdmin 4 na Ubuntu 20.04/18.04/16.04