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

Spiegazione dell'operatore MariaDB MINUS

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