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

Explication de l'opérateur MariaDB MINUS

Dans MariaDB, le MINUS L'opérateur renvoie des lignes distinctes 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.

Le MINUS L'opérateur a été introduit dans MariaDB 10.6.1 comme synonyme de EXCEPT opérateur à des fins de compatibilité avec Oracle. Par conséquent, nous pouvons utiliser MINUS et EXCEPT de manière interchangeable (dans MariaDB 10.6.1 et versions ultérieures).

Cependant, j'ai trouvé que le MINUS l'opérateur ne fonctionne que lorsque mon sql_mode = "oracle" . Bien que cela ne soit pas explicitement mentionné dans la documentation de MariaDB, cela est implicite dans la tâche d'implémentation du MINUS opérateur dans MariaDB.

Exemple de données

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 MINUS opérateur pour renvoyer les enseignants qui ne sont pas aussi des étudiants.

Définir sql_mode vers Oracle

Avant de commencer à utiliser le MINUS opérateur, définissons notre sql_mode à oracle :

SET sql_mode = "oracle";

OK, maintenant nous pouvons continuer et utiliser le MINUS opérateur.

Exemple de MINUS

SELECT TeacherName FROM Teachers
MINUS
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
MINUS
SELECT TeacherName FROM Teachers;

Résultat :

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

Il est possible d'obtenir le même résultat sans utiliser le MINUS (ou 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       |
+-------------+

Inclure les doublons

Par défaut, le MINUS l'opérateur applique implicitement un DISTINCT opération. En d'autres termes, il ne renvoie que des valeurs distinctes par défaut. Mais nous pouvons spécifier MINUS ALL pour inclure les doublons dans le résultat :

SELECT TeacherName FROM Teachers
MINUS 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
MINUS DISTINCT
SELECT StudentName FROM Students;

Résultat :

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

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

Pas en mode Oracle ?

Voici ce qui se passe lorsque nous essayons d'utiliser MINUS lorsqu'il n'est pas en mode Oracle.

Réinitialisons notre sql_mode au paramètre par défaut :

SET sql_mode = default;

Essayons maintenant d'utiliser le MINUS à nouveau l'opérateur :

SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;

Résultat :

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