PRATIQUE OUTILS 
Les requêtes complexes avec MySQL
 
Jointures, unions, sous-requêtes, tables temporaires : quelques-unes des fonctionnalités de MySQL à ne pas oublier quand vient le moment de traiter des données sur plusieurs tables. (26/06/2006)
  Forum

Réagissez dans les forums de JDN Développeurs

MySQL 5 est aujourd'hui à même de soutenir la comparaison en fonctionnalités, tout en conservant un bon avantage en termes de vitesse. MySQL n'est toujours pas Oracle, bien entendu, mais pour un projet Web, elle reste le choix le plus évident.

MySQL n'est donc pas limitée aux requêtes de type SELECT ... FROM ... WHERE. C'était déjà le cas depuis de nombreuses années, mais les possibilités de la version 5 ont été décuplées. Nous allons donc aborder quelques-uns des moyens disponibles pour construire des requêtes complexes.

Jointures
Une jointure sert à combiner les enregistrements de deux tables ou plus, en faisant en sorte que les données ne se répètent pas pour chaque ligne. Il est bien sûr possible de construire cela avec une requête de type SELECT * FROM commande, produit WHERE ..., mais les jointures proposent des alternatives permettant de contrôler les données renvoyées.

Nom
Définition
Exemple
Cross join
Jointure croisée
Renvoie toutes les combinaisons possibles.
SELECT * FROM table1 CROSS JOIN table2;
Inner join
Jointure interne
C'est la jointure par défaut. Les lignes renvoyées correspondent aux intersections entre les tables. Pour MySQL, jointure croisée et jointure interne sont équivalentes, ce qui n'est pas le cas en SQL standard.
Left outer join
Jointure externe gauche
Limite les résultats à ceux incluant chaque ligne de la table à gauche du "JOIN", ici table1.
SELECT * FROM table1 LEFT JOIN table2;
Right outer join
Jointure externe droite
Limite les résultats à ceux incluant chaque ligne de la table à droite du "JOIN", ici table2.
SELECT * FROM table1 RIGHT JOIN table2;
Full outer join
Jointure externe complète
Toutes les lignes des deux tables sont incluses, et les lignes n'ayant pas de correspondances avec celles de l'autre table sont associées à des NULL. MySQL ne reconnaît pas les jointures externes complètes, mais cela peut être compensé par l'utilisation d'une union.

Unions
Les unions ont un fonctionnement proche des jointures : combiner des informations en provenance de plusieurs sources, en l'occurrence ici des requêtes.
La différence réside dans le fait que les données combinées doivent être du même type, et les tables doivent avoir les mêmes noms de colonnes. Les doublons sont éliminés, sauf si l'on précise le mot-clef ALL, auquel cas les valeurs multiples sont renvoyées autant de fois qu'elles apparaissent dans toutes les tables.
Pour les mettre en place, les parenthèses sont obligatoires pour chaque requête.

(SELECT nom FROM employes_france)
UNION (SELECT nom FROM employes_espagne)
UNION (SELECT nom FROM employes_italie)
;

Sous-requêtes
Une sous-requête consiste à établir une requête SQL traitant les données issues d'une seconde requête. La clause WHERE comprend ainsi une autre requête SQL pour limiter les résultats originels, ou pour agréger les informations de plusieurs tables. Une sous-requête peut également être placée dans une clause HAVING.

SELECT * FROM table WHERE colonne1 = (SELECT colonne2 FROM table2);
SELECT * FROM table WHERE colonne = (SELECT colonne2 FROM table2 WHERE colonne2 = (SELECT colonne3 FROM table3));


Table temporaire
L'utilisation d'une table temporaire ne dépasse jamais la session SQL en cours, et autorise la création de tables pour créer un nouvel arrangement d'informations plus adapté à une requête particulière, pour tester la bonne insertion de données dans la base, ou pour créer un sous-ensemble d'une autre table plus léger afin de soulager le serveur SQL... On ne peut logiquement y faire appel qu'une seule fois dans la même requête.

CREATE TEMPORARY TABLE temp SELECT * FROM donnes WHERE a=1;
SELECT * FROM temp WHERE ... ;

 
Xavier Borderie, JDN Développeurs
 
 
Accueil | Haut de page