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

Explication de l'opérateur MariaDB INTERSECT

Dans MariaDB, le INTERSECT L'opérateur croise deux requêtes et renvoie uniquement les lignes renvoyées dans les deux requêtes.

Il renvoie toutes les lignes à partir de la gauche SELECT ensemble de résultats qui sont également présents dans le bon 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 EXCEPT 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 Employees;
SELECT * FROM Customers;

Résultat :

+------------+--------------+
| EmployeeId | EmployeeName |
+------------+--------------+
|          1 | Bart         |
|          2 | Jan          |
|          3 | Ava          |
|          4 | Rohit        |
|          5 | Monish       |
|          6 | Monish       |
|          7 | Monish       |
+------------+--------------+

+------------+--------------+
| CustomerId | CustomerName |
+------------+--------------+
|          1 | Mia          |
|          2 | Rohit        |
|          3 | Peter        |
|          4 | Ava          |
|          5 | Monish       |
|          6 | Monish       |
+------------+--------------+

Nous pouvons utiliser le INTERSECT opérateur pour renvoyer les employés qui sont également des clients :

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;

Résultat :

+--------------+
| EmployeeName |
+--------------+
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Nous n'obtenons donc que les valeurs qui apparaissent dans le Employees tableau qui apparaît également dans le Customers table.

Par défaut, il renvoie des lignes distinctes, de sorte qu'une seule ligne est renvoyée pour Monish, même s'il existe plusieurs employés et plusieurs clients portant ce nom. Nous pouvons cependant changer cela.

Inclure les doublons

Par défaut, le INTERSECT 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 INTERSECT ALL et INTERSECT DISTINCT syntaxe.

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

SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;

Résultat :

+--------------+
| EmployeeName |
+--------------+
| Monish       |
| Ava          |
| Rohit        |
| Monish       |
+--------------+

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

Nous pouvons voir que deux lignes contenant le nom Monish ont été renvoyées au lieu d'une seule comme dans notre premier exemple. Il y a en fait trois clients appelés Monish, mais seulement deux employés portant ce nom. L'opération n'en croise donc que deux.

Et pour être complet, voici un exemple qui utilise explicitement le DISTINCT opérateur :

SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;

Résultat :

+--------------+
| EmployeeName |
+--------------+
| Ava          |
| Rohit        |
| Monish       |
+--------------+

C'est le même résultat que nous obtiendrions si nous supprimions le DISTINCT opérateur.

Une requête alternative

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

SELECT 
    DISTINCT EmployeeName
FROM Employees e 
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);

Résultat :

+--------------+
| EmployeeName |
+--------------+
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Attention, l'INTERSECT l'opérateur aide à simplifier le code.