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.