MariaDB
 sql >> Database >  >> RDS >> MariaDB

Spiegazione dell'operatore MariaDB EXCEPT

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.