In MariaDB, il MINUS
l'operatore restituisce righe distinte dalla query di input di sinistra che non vengono restituite dalla query di input di destra.
Il MINUS
operator è stato introdotto in MariaDB 10.6.1 come sinonimo di EXCEPT
operatore ai fini della compatibilità con Oracle. Pertanto, possiamo utilizzare MINUS
e EXCEPT
in modo intercambiabile (in MariaDB 10.6.1 e versioni successive).
Tuttavia, ho scoperto che il MINUS
l'operatore funziona solo quando il mio sql_mode = "oracle"
. Sebbene ciò non sia esplicitamente menzionato nella documentazione di MariaDB, è implicito nell'attività di implementazione di MINUS
operatore in MariaDB.
Dati campione
Supponiamo di avere le seguenti tabelle:
SELECT * FROM Teachers;
SELECT * FROM Students;
Risultato:
+-----------+-------------+ | 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 | +-----------+-------------+
Possiamo usare il MINUS
operatore per restituire gli insegnanti che non sono anche studenti.
Imposta sql_mode
a Oracle
Prima di iniziare a utilizzare il MINUS
operatore, impostiamo il nostro sql_mode
a oracle
:
SET sql_mode = "oracle";
OK, ora possiamo andare avanti e utilizzare il MINUS
operatore.
Esempio di MINUS
SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;
Risultato:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Quindi otteniamo solo i valori che appaiono in Teachers
tabella che non compare anche in Students
tavolo.
Per impostazione predefinita, restituisce righe distinte, quindi viene restituita solo una riga per Cathy
, anche se ci sono due insegnanti con quel nome. Possiamo cambiare questo comportamento – ne parleremo più avanti.
Possiamo anche cambiarlo e inserire Students
tabella a sinistra e Teachers
a destra.
SELECT StudentName FROM Students
MINUS
SELECT TeacherName FROM Teachers;
Risultato:
+-------------+ | StudentName | +-------------+ | Faye | | Jet | | Spike | | Ein | +-------------+
È possibile ottenere lo stesso risultato senza utilizzare il MINUS
(o EXCEPT
) operatore. Ad esempio, potremmo riscrivere il nostro primo esempio in questo:
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
Risultato:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Includi duplicati
Per impostazione predefinita, il MINUS
l'operatore applica implicitamente un DISTINCT
operazione. In altre parole, restituisce solo valori distinti per impostazione predefinita. Ma possiamo specificare MINUS ALL
per includere duplicati nel risultato:
SELECT TeacherName FROM Teachers
MINUS ALL
SELECT StudentName FROM Students;
Risultato:
+-------------+ | TeacherName | +-------------+ | Cathy | | Ben | | Cathy | | Bill | +-------------+
Questa volta abbiamo ottenuto quattro righe, invece delle due che abbiamo ottenuto nel nostro primo esempio.
Possiamo vedere che entrambi i Cathy sono stati restituiti invece di uno solo come nel nostro primo esempio.
Quanto a Bill? Ci sono due Bill in Teachers
tabella, ma qui ne viene restituito solo uno. Probabilmente perché c'è un disegno di legge in Students
tabella, che escluderebbe uno dei Bill dai nostri risultati.
Ed ecco un esempio che usa esplicitamente DISTINCT
operatore:
SELECT TeacherName FROM Teachers
MINUS DISTINCT
SELECT StudentName FROM Students;
Risultato:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Come previsto, otteniamo lo stesso risultato che otterremmo se dovessimo rimuovere DISTINCT
operatore.
Non in modalità Oracle?
Ecco cosa succede quando tentiamo di utilizzare MINUS
quando non in modalità Oracle.
Resettiamo il nostro sql_mode
all'impostazione predefinita:
SET sql_mode = default;
Ora proviamo a usare il MINUS
di nuovo operatore:
SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;
Risultato:
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