MySQL With clause

Mehvish Ashiq 15 février 2024
  1. Utilisation de la clause MySQL WITH alias Common Table Expression
  2. Utilisation de la clause MySQL WITH ayant plusieurs Common Table Expressions
  3. Conclusion
MySQL With clause

Dans ce tutoriel, nous allons découvrir la clause WITH de MySQL, également connue sous le nom de Common Table Expression (CTE). Les CTE sont utilisés chaque fois que vous souhaitez manipuler des données de sous-requêtes difficiles.

Nous apprendrons également comment Common Table Expression (CTE) vous permet d’écrire des requêtes complexes de manière facilement lisible et compréhensible. Nous verrons également si nous pouvons utiliser ou non la clause WITH imbriquée.

Veuillez noter que Common Table Expression n’était pas disponible avant la version 8.0 de MySQL. Vous devez avoir MySQL version 8.0 ou supérieure pour l’utiliser. Vous pouvez voir les nouveautés de MySQL version 8.0 ici.

Utilisation de la clause MySQL WITH alias Common Table Expression

Pour utiliser la clause WITH de MySQL, comprenons d’abord les CTE. Les expressions de table communes (CTE) sont des ensembles de résultats temporaires nommés qui n’existent que dans la portée d’exécution de l’instruction dans laquelle ils sont écrits.

En utilisant la clause WITH, vous pouvez attribuer un nom à une sous-requête complexe que vous pouvez facilement utiliser au sein de la requête principale (SELECT, INSERT, UPDATE ou DELETE). Gardez à l’esprit que toutes les bases de données ne prennent pas en charge la clause WITH.

Vous pouvez utiliser une ou plusieurs sous-requêtes et CTE dans la même clause WITH, mais vous ne pouvez pas utiliser WITH imbriqué (un autre WITH à l’intérieur de la clause WITH). Créons une Table nommée tb_order et remplissons-la avec des données pour pratiquer la clause WITH.

Exemple de code :

# SQL Programming Using MySQL Version 8.27
CREATE TABLE `practice_with_clause`.`tb_order` (
ORDER_ID INTEGER NOT NULL,
CUSTOMER_FIRST_NAME	VARCHAR(30) NOT NULL,
CUSTOMER_LAST_NAME VARCHAR(30) NOT NULL,
CITY_NAME VARCHAR(64) NOT NULL,
PURCHASED_PRODUCTS VARCHAR(64) NOT NULL,
ORDER_DATE DATE NOT NULL,
PRIMARY KEY (ORDER_ID)
);

Assurez-vous dans votre Base de données sous Tables que votre table est créée avec succès.

mysql with clause - créer une table

Utilisez la commande INSERT suivante pour remplir la table avec 7 enregistrements.

# SQL Programming Using MySQL Version 8.27
INSERT INTO practice_with_clause.tb_order 
(ORDER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, CITY_NAME, PURCHASED_PRODUCTS, ORDER_DATE)
VALUES
(1,'John','Horton', 'Washington', 'Books', '2021-05-03'),
(2,'Banji','Horton',  'Florida', 'Pens', '2010-5-6'),
(3,'Nayya','Sofia',  'South Carolina', 'Books', '2011-10-15'),
(4,'Martell','Daniel',  'Michigan', 'NoteBooks', '2012-12-02'),
(5,'Sana','Preston',  'Michigan', 'White Board Marker', '2013-08-27'),
(6,'Gulraiz','Yonja', 'Washington', 'Books', '2021-05-03'),
(7,'Mashal','Naaz',  'Florida', 'Comic Books', '2019-01-01');

Maintenant, utilisez la commande SELECT pour afficher les données.

# SQL Programming Using MySQL Version 8.27
SELECT * FROM practice_with_clause.tb_order;

mysql with clause - afficher les données de la table

À ce stade, nous allons utiliser la clause WITH pour utiliser l’expression de table commune et manipuler la sous-requête complexe comme indiqué ci-dessous.

# SQL Programming Using MySQL Version 8.27
WITH cte_order AS 
(
SELECT PURCHASED_PRODUCTS, COUNT(ORDER_ID) as Number_of_Orders
FROM practice_with_clause.tb_order
GROUP BY PURCHASED_PRODUCTS
)
SELECT AVG(Number_of_Orders) AS "Average Orders Per Category"
FROM cte_order;

Décomposons la requête ci-dessus en sections pour comprendre :

Expression de table commune : cte_order

Sous-requête :

SELECT PURCHASED_PRODUCTS, COUNT(ORDER_ID) as Number_of_Orders FROM practice_with_clause.tb_order GROUP BY PURCHASED_PRODUCTS

Requête principale :

SELECT AVG(Number_of_Orders) AS "Average Orders Per Category" FROM cte_order;

Notez que le CTE se référence lui-même dans la requête principale pour lire les données. Il affichera la sortie suivante en fonction de mes données (votre sortie peut être différente).

mysql with clause - with clause pratique partie a

Portée d’exécution de Common Table Expression

Comme nous l’avons dit, le CTE ne fonctionne que dans son périmètre d’exécution, comment ? Voir la capture d’écran suivante.

mysql with clause - with clause pratique partie b

Lorsque vous ne sélectionnez que le code mis en surbrillance avec la case verte, vous restez dans le périmètre d’exécution de CTE nommé cte_order, mais lorsque vous sélectionnez uniquement le code dans la zone rouge, vous êtes maintenant hors de la portée d’exécution et ne pouvez pas référencer le Expression de table commune nommée cte_order. Cela signifie que vous pouvez référencer le CTE dans la même clause WITH dans laquelle il est écrit.

Utilisation de la clause MySQL WITH ayant plusieurs Common Table Expressions

Pratiquons la clause WITH en utilisant plusieurs expressions de table communes.

WITH 
cte_order AS 
(
SELECT PURCHASED_PRODUCTS, COUNT(ORDER_ID) as Number_of_Orders
FROM practice_with_clause.tb_order
GROUP BY PURCHASED_PRODUCTS
),
cte_location AS
(
SELECT COUNT(CITY_NAME) as City
FROM practice_with_clause.tb_order
WHERE CITY_NAME = 'Washington'
)
SELECT AVG(Number_of_Orders) AS "Average Orders Per Category", City
FROM cte_order,cte_location;

Maintenant, vous verrez la sortie suivante.

mysql with clause - with clause pratique partie c

De même, nous pouvons également faire référence à une expression de table commune précédemment définie à partir d’un autre CTE. Assurez-vous que les deux expressions de table communes sont écrites dans la même clause WITH.

Conclusion

Compte tenu de la discussion ci-dessus, nous avons conclu que la clause WITH est utilisée pour obtenir l’avantage de l'expression de table commune qui aide à manipuler les sous-requêtes difficiles. Nous pouvons utiliser plusieurs sous-requêtes et expressions de table communes dans la même clause WITH, mais nous ne pouvons pas avoir de clause WITH imbriquée. Nous ne pouvons pas non plus faire référence aux CTE à partir de différentes clauses WITH.

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