MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

Explication de l'opérateur MariaDB EXCEPT

Dans MariaDB, le EXCEPT L'opérateur renvoie les lignes de la requête d'entrée de gauche qui ne sont pas générées par la requête d'entrée de droite.

Une autre façon de le dire est qu'il renvoie toutes les lignes à partir de la gauche SELECT ensemble de résultats sauf lignes qui sont à droite SELECT jeu de résultats.

Syntaxe

La syntaxe officielle ressemble à ceci :

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}]

Ce qui précède inclut également le INTERSECT et UNION opérateurs dans la syntaxe, car la même syntaxe s'applique à ces opérateurs.

Depuis MariaDB 10.4.0, les parenthèses peuvent être utilisées pour spécifier la priorité.

Exemple

Supposons que nous ayons les tables suivantes :

SELECT * FROM Teachers;
SELECT * FROM Students;

Résultat :

+-----------+-------------+
| 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        |
+-----------+-------------+

Nous pouvons utiliser le EXCEPT opérateur pour renvoyer les enseignants qui ne sont pas également des étudiants :

SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;

Résultat :

+-------------+
| TeacherName |
+-------------+
| Ben         |
| Cathy       |
+-------------+

Nous n'obtenons donc que les valeurs qui apparaissent dans le Teachers tableau qui n'apparaissent pas également dans le Students table.

Par défaut, il renvoie des lignes distinctes, donc une seule ligne est renvoyée pour Cathy , même s'il y a deux professeurs portant ce nom. Nous pouvons changer ce comportement – ​​nous en reparlerons plus tard.

Nous pouvons également l'inverser et mettre les Students table à gauche et Teachers à droite.

SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;

Résultat :

+-------------+
| StudentName |
+-------------+
| Faye        |
| Jet         |
| Spike       |
| Ein         |
+-------------+

Il est possible d'obtenir le même résultat sans utiliser le EXCEPT opérateur. Par exemple, nous pourrions réécrire notre premier exemple en ceci :

SELECT 
    DISTINCT TeacherName
FROM Teachers t 
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);

Résultat :

+-------------+
| TeacherName |
+-------------+
| Ben         |
| Cathy       |
+-------------+

Attention, le EXCEPT L'opérateur aide à simplifier le code de manière assez significative.

Inclure les doublons

Par défaut, le EXCEPT l'opérateur applique implicitement un DISTINCT opération. En d'autres termes, il ne renvoie que des valeurs distinctes par défaut.

Avant MariaDB 10.5.0, le DISTINCT implicite était notre seule option - nous n'avons pas pu spécifier ALL . Cependant, MariaDB 10.5.0 a introduit le EXCEPT ALL et EXCEPT DISTINCT syntaxe.

Cela signifie que nous pouvons désormais effectuer des requêtes comme celle-ci :

SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;

Résultat :

+-------------+
| TeacherName |
+-------------+
| Cathy       |
| Ben         |
| Cathy       |
| Bill        |
+-------------+

Cette fois, nous avons quatre lignes, au lieu des deux que nous avions dans notre premier exemple.

Nous pouvons voir que les deux Cathy ont été renvoyées au lieu d'une seule comme dans notre premier exemple.

Quant à Bill ? Il y a deux projets de loi dans les Teachers table, mais un seul est retourné ici. C'est probablement parce qu'il y a un projet de loi dans les Students tableau, ce qui exclurait l'un des projets de loi de nos résultats.

Et voici un exemple qui utilise explicitement le DISTINCT opérateur :

SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;

Résultat :

+-------------+
| TeacherName |
+-------------+
| Ben         |
| Cathy       |
+-------------+

Comme prévu, nous obtenons le même résultat que si nous supprimions le DISTINCT opérateur.

Dans MariaDB 10.6.1, MINUS a été introduit comme synonyme de EXCEPT . Par conséquent, nous pouvons utiliser MINUS au lieu de EXCEPT dans MariaDB 10.6.1 et versions ultérieures.