In MariaDB, il EXCEPT
l'operatore restituisce le righe dalla query di input di sinistra che non vengono restituite dalla query di input di destra.
Un altro modo per dirlo è che restituisce tutte le righe da sinistra SELECT
set di risultati tranne righe che sono in SELECT
a destra set di risultati.
Sintassi
La sintassi ufficiale è questa:
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}]
Quanto sopra include anche il INTERSECT
e UNION
operatori nella sintassi, poiché la stessa sintassi si applica a tali operatori.
Da MariaDB 10.4.0, le parentesi possono essere utilizzate per specificare la precedenza.
Esempio
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 EXCEPT
operatore per restituire gli insegnanti che non sono anche studenti:
SELECT TeacherName FROM Teachers
EXCEPT
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
EXCEPT
SELECT TeacherName FROM Teachers;
Risultato:
+-------------+ | StudentName | +-------------+ | Faye | | Jet | | Spike | | Ein | +-------------+
È possibile ottenere lo stesso risultato senza utilizzare il 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 | +-------------+
Intendiamoci, il EXCEPT
operatore aiuta a semplificare il codice in modo abbastanza significativo.
Includi duplicati
Per impostazione predefinita, EXCEPT
l'operatore applica implicitamente un DISTINCT
operazione. In altre parole, restituisce solo valori distinti per impostazione predefinita.
Prima di MariaDB 10.5.0, l'implicito DISTINCT
era la nostra unica opzione:non siamo stati in grado di specificare ALL
. Tuttavia, MariaDB 10.5.0 ha introdotto il EXCEPT ALL
e EXCEPT DISTINCT
sintassi.
Ciò significa che ora possiamo eseguire query come questa:
SELECT TeacherName FROM Teachers
EXCEPT 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
EXCEPT DISTINCT
SELECT StudentName FROM Students;
Risultato:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Come previsto, otteniamo lo stesso risultato che otterremmo se dovessimo rimuovere DISTINCT
operatore.
In MariaDB 10.6.1, MINUS
è stato introdotto come sinonimo di EXCEPT
. Pertanto, possiamo utilizzare MINUS
invece di EXCEPT
in MariaDB 10.6.1 e versioni successive.