Un des grands intérêts des bases de données et du SQL va être de pouvoir manipuler des données dans plusieurs tables à la fois.
Nous allons pouvoir faire cela grâce entre autres à la clause JOIN
et à ce qu’on appelle en français les jointures SQL.
Manipuler des données de plusieurs tables : quel intérêt ?
Si votre base de données est bien construite, vous devriez normalement avoir de nombreuses tables contenant chacune des informations cohérentes et liées à un objet.
Pour un site e-commerce, vous allez probablement avoir une table « clients » qui contient des informations liées à vos clients (nom, prénom, adresse, adresse mail, mot de passe, etc.), une table « commandes » qui va lister les différentes commandes avec des informations liées à celle-ci (date, prix, nom du client, etc.) et etc.
Dans le cadre d’un blog, vous aurez certainement une table « utilisateur » dans laquelle vous allez stocker des informations liées aux utilisateurs, une table « commentaires » dans laquelle vous allez stocker le texte, la date, l’auteur etc. de chaque commentaire et etc.
Cette segmentation des données est ce qui fait tout l’intérêt et toute la puissance des bases de données en cela que nos informations sont organisées et accessibles de la meilleure façon qu’il soit et que les ressources sont optimisées.
En effet, imaginez qu’une personne commente régulièrement sur votre blog avec son compte créé chez vous. Il est hors de question de stocker toutes les informations liées à cet utilisateur à chaque fois qu’elle poste un nouveau commentaire dans la table « commentaires », cela serait une aberration en termes d’optimisation des ressources !
Nous allons stocker les informations du compte utilisateur une et une seule fois dans une table « utilisateurs » et ensuite les informations liées à chaque nouveau commentaire dans une table « commentaires ».
Vous pouvez ainsi vous douter qu’il va être souvent intéressant de puiser des informations dans plusieurs tables à la fois pour retourner des informations complètes et pertinentes. On va par exemple souvent vouloir récupérer les informations liées à un client et à une commande correspondante, ne serait-ce que pour remplir le bon de commande avec l’adresse du client (qui devrait se trouver dans la table « cilents ».
Les jointures, comment ça fonctionne ?
Nous allons utiliser une clause de type JOIN
pour combiner des entrées entre plusieurs tables.
Cependant, pour pouvoir « lier » plusieurs tables entre elles, il va nous falloir un liant, c’est-à-dire un point commun entre ces tables. Ce point commun sera une colonne qui contient les mêmes données à travers plusieurs tables.
En reprenant notre exemple de site e-commerce, par exemple, il semble tout à fait logique que nos tables « clients » et « commandes » possèdent toutes les deux une colonne contenant les noms de chaque client. Cela pourrait donc être notre colonne commune à partir de laquelle faire la jointure.
Cependant, en pratique, cette façon de faire serait très mauvaise tout simplement car un nom n’est pas quelque chose d’unique. Pour cette raison, nous allons souvent utiliser les colonnes id pour lier les données de plusieurs tables entre elles.
Pour faire cela, il va nous falloir donc dans le cas de notre site e-commerce une colonne « IDClient » dans chacune de nos deux tables. Si cela parait une nouvelle fois logique dans le cadre de notre table « clients », cela semble moins évident d’inclure une telle colonne dans notre table « commandes » à priori.
C’est bien là, et j’insiste sur ce point, que réside toute la difficulté de bien construire sa base de données : il faut bien réfléchir aux différentes situations que l’on pourrait rencontrer et aux opérations qu’on va vouloir effectuer dessus !
Les alias en SQL
Les jointures SQL vont nous permettre de travailler avec plusieurs tables en même temps. Nous allons donc être amenés à manipuler différentes colonnes appartenant à différente tables et donc il va être important de ne pas se perdre dans les différents noms. Les alias vont nous aider à cela.
En effet, les alias vont être utilisés pour donner à une colonne ou à une table complète un nom temporaire.
Pour créer un alias, nous utiliserons le mot AS
(« en tant que » en français) en SQL.
Les alias vont ainsi nous permettre de renommer temporairement des tables ou des colonnes afin de les rendre plus faciles à manipuler et de rendre nos requêtes SQL plus lisibles.
Notez que l’alias, c’est-à-dire le nom donné de manière temporaire à nos colonnes ou à nos tables, n’existera que le temps de notre requête. Nos colonnes et tables ne sont bien entendus pas renommées pour toujours !
Voici un exemple concret d’utilisation des alias avec notre table « users » :
<!DOCTYPE html> <html> <head> <title>Cours PHP / MySQL</title> <meta charset='utf-8'> </head> <body> <h1>Bases de données MySQL</h1> <?php $servname = "localhost"; $dbname = "cours"; $user = "root"; $pass = "root"; try{ $dbco = new PDO("mysql:host=$servname;dbname=$dbname", $user, $pass); $dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sth = $dbco->prepare(" SELECT prenom AS p, nom as n FROM users AS U WHERE prenom = 'Pierre' ORDER BY n DESC "); $sth-> execute(); $resultat = $sth->fetchAll(PDO::FETCH_ASSOC); echo '<pre>'; print_r($resultat); echo '</pre>'; } catch(PDOException $e){ echo "Erreur : " . $e->getMessage(); } ?> </body> </html>
Dans l’exemple ci-dessus, nous donnons l’alias « p » à notre colonne « prenom », « n » à notre colonne « nom » et « U » à notre table « users ».
Ici, cependant, comme nous n’allons puiser des résultats que dans une table et comme notre requête est relativement simple l’intérêt des alias est limité.
Les alias vont ainsi s’avérer particulièrement utiles dans les cas où nous devons manipuler plusieurs tables à la fois, ou si le nom de nos colonnes ou tables est long ou peu pertinent par rapport aux données qu’elles contiennent, ou encore lorsque nous combinons plusieurs colonnes en une le temps d’une requête.
Attention, nous n’allons toutefois pas pouvoir utiliser les alias avec n’importe quelle clause en MySQL. En particulier, il est interdit d’utiliser les alias au sein d’une clause WHERE
car en SQL standard, lorsqu’une clause WHERE
est évalué la valeur de la colonne en soi peut ne pas encore avoir été déterminée.
Nous allons pouvoir utiliser les alias sans soucis avec les clauses GROUP BY
, ORDER BY
et HAVING
.