Opérateur d'intersection dans MySQL

Mehvish Ashiq 15 février 2024
  1. Introduction à l’opérateur INTERSECT dans MySQL
  2. Opérateur INTERSECT dans MySQL
  3. Conclusion
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.

opérateur d’intersection dans mysql - diagramme de venn

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 :

opérateur d’intersection dans mysql - données client

Tableau de commande :

opérateur d’intersection dans mysql - données 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 :

opérateur d’intersection dans mysql - intersection avec jointure interne

É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 :

opérateur d’intersection dans mysql - intersection avec dans la clause

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 :

opérateur d&rsquo;intersection dans mysql - intersection avec et clause

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.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook