Opérateur d'intersection dans MySQL
Cet article vous permettra de vous familiariser avec l’opérateur INTERSECT
. Bien que MySQL ne supporte pas INTERSECT
et MINUS
/EXCEPT
, il existe d’autres façons de simuler cette fonctionnalité.
Nous verrons ce qu’est INTERSECT
, ses avantages, et les différentes manières d’apprendre à émuler INTERSECT
dans MySQL.
Introduction à l’opérateur INTERSECT
dans MySQL
INTERSECT
est un opérateur d’ensemble utilisé pour récupérer les éléments communs de deux ensembles. Il est également utilisé pour obtenir des enregistrements (lignes) DISTINCT
(ou communs) à partir de deux tables.
On peut aussi dire que l’opérateur INTERSECT
ne renvoie que des lignes identiques, qui sont récupérées en sortie de deux instructions SELECT
. Regardez le diagramme de Venn suivant pour comprendre INTERSECTION
.
Ici, la zone de grille jaune est INTERSECTION
. Le principal avantage de INTERSECT
est que vous pouvez accéder à des enregistrements identiques à partir de nombreuses tables.
Bien que MySQL
ne supporte pas l’opérateur INTERSECT
, nous pouvons utiliser d’autres alternatives pour obtenir cette fonctionnalité.
Opérateur INTERSECT
dans MySQL
Comme déjà dit, l’opérateur INTERSECT
n’est pas disponible dans MySQL
. Néanmoins, nous pouvons simuler cela en utilisant les clauses INNER JOIN
et IN
et EXISTS
en fonction de la complexité et des exigences de la requête.
Nous utilisons deux tables nommées order
et customer
. Les champs de la table customer
incluent customer_id
, customer_firstname
, customer_lastname
, customer_age
, et customer_salary
.
La table order
a order_id
, order_date
, order_amount
, et customer_id
(l’id du client est une clé étrangère ici). Nos tables customer
et order
se présentent comme suit avec les données.
Vous pouvez créer les deux tables et insérer des données à l’aide de l’exemple de code suivant.
#create customer table
CREATE TABLE customer(
customer_id INT NOT NULL PRIMARY KEY,
customer_firstname VARCHAR(60) NOT NULL,
customer_lastname VARCHAR(60) NOT NULL,
customer_age INT NOT NULL,
customer_salary INT NOT NULL
);
#create order table
CREATE TABLE order(
order_id INT NOT NULL PRIMARY KEY,
order_date DATETIME NOT NULL,
order_amount INT NOT NULL,
customer_id INT NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customer(customer_id)
);
#insert into customer table
INSERT INTO customer VALUES
(1, 'Shajeel', 'Daniel', 23, 9000),
(2, 'Nayya', 'Preston', 54, 1500),
(3, 'James', 'Robert', 36, 2500),
(4, 'Jennifer', 'John', 29, 5000),
(5, 'Sarah', 'Paul', 15, 8000),
(6, 'Karen', 'Donald', 40, 3500);
#insert into order table
INSERT INTO order VALUES
(1, '2019-12-03 10:25:30', 500, 2),
(2, '2019-12-10 12:00:30', '1500', 4);
Tableau client :
Tableau de commande :
Émuler INTERSECT
via INNER JOIN
dans MySQL
Nous voulons trouver les détails commande
(order_id
, order_amount
, order_date
) et les détails customer
(customer_id
, customer_firstname
, customer_lastname
) pour savoir quel customer
a placé le order
à quelle date.
Cela signifie que nous voulons trouver le customer
identique à la table customer
et à la table order
. Il faut aussi observer que les données proviennent de deux tables ; on peut utiliser une jointure nommée INNER JOIN
.
#MySQL Version 8.0.27
SELECT
order.order_id, customer.customer_id, customer.customer_firstname,
customer.customer_lastname,order.order_amount,order.order_date
FROM order
INNER JOIN
customer ON order.customer_id = customer.customer_id;
Dans le code ci-dessus, il récupérera le order_id
, customer_id
, customer_firstname
, customer_lastname
, order_amount
et order_date
pour ceux dont le customer_id
est le même dans la table customer
et la table order
.
Production :
Émuler INTERSECT
via la clause IN
dans MySQL
Maintenant, nous avons une situation différente. Ici, nous n’avons besoin que des données relatives au client.
Ces données incluent customer_id
, customer_firstname
, customer_lastname
et customer_age
. Et ce client doit être présent dans la table order
.
Ici, nous pouvons utiliser la clause IN
pour simuler l’opération INTERSECT
.
#MySQL version 8.0.27
SELECT
customer.customer_id, customer.customer_firstname,
customer.customer_lastname, customer.customer_age
FROM customer
WHERE customer.customer_id IN ( SELECT order.customer_id FROM order);
La sous-requête sera exécutée en premier en collectant tous les customer_id
de la table order
ci-dessus. Ensuite, il ne SELECT
que les détails liés au client dont customer_id
est présent dans le résultat de la sous-requête.
Production :
Simuler INTERSECT
via la clause EXISTS
dans MySQL
Dans ce cas de figure, nous souhaitons uniquement les coordonnées customer
dont l’âge est inférieur à 45
et qui doivent passer au moins une order
. La clause EXISTS
est utilisée de la manière suivante.
Le code suivant produira également la même sortie si vous omettez la clause EXISTS
.
SELECT
customer.customer_id, customer.customer_firstname,
customer.customer_lastname, customer.customer_age
FROM customer
WHERE customer.customer_age < 45
AND EXISTS
(SELECT order.customer_id FROM order where order.customer_id = customer.customer_id);
La sous-requête sera exécutée en premier et donnera tous les customer_id
de la table order
où le customer_id
est le même dans les deux tables (tables order
et customer
). Ensuite, il SELECT
uniquement les détails liés au client dont l’âge est inférieur à 45
et customer_id
sont présents dans le résultat de la sous-requête.
Production :
Conclusion
Cet article a conclu de nombreuses autres alternatives pour faire une opération.
Nous avons également appris différentes manières de simuler INTERSECT
dans MySQL. Il comprend les clauses INNER JOIN
, IN
et EXISTS
.
Nous avons même vu comment nous pouvions utiliser WHERE
et AND
tout en émulant les opérations INTERSECT
dans MySQL.