avril
2012
Il n’est pas rare de devoir requêter sur plusieurs tables pour avoir un ensemble de résultat cohérent. Pour faire ça il faut utiliser les relations clé primaire clé étrangère entre les tables, c’est ce que nous allons voir ici.
L’utilisation d’alias pour les tables
L’utilisation d’alias pour remplacer les noms de tables permet une lecture plus facile de la requête, malgré des jointures complexes.
On peut remplacer un nom long et complexe par un alias simple.
Exemple:
SELECT * FROM server.database.schema.table AS table_alias
Donc si on a des noms de tables à rallonge ou difficile à écrire cette façon de faire est utile.
Prenons l’exemple de tables liées par une relation, on a la table « produits » et la table « inventaire », ces 2 tables sont liés par le champ « productid » qui devient donc l’objet de la jointure. Dans l’exemple suivant on veut avoir le nom du produit et sa quantité en stock donc on fait la jointure sur « productid » on donne l’alias « nom_produit » à la table « Production.product » et l’alias « moninventaire » à la table « production.Productinventory ».
Jointure sur une table elle-même
Une possibilité extrêmement utile est de joindre 2 fois la même table pour pouvoir parcourir la table en cherchant des valeurs déterminées.
Par exemple, on a la table employés qui contient la colonne « employeeid » et la colonne « managerid » qui reprend en fait l’id employé du manager. Si on veut savoir qui est le chef de qui dans une seule requête simple on écrit ce qui suit (la clause « where » a été rajoutée pour avoir un ensemble de résultat simple mais sans le « where » on a la hiérarchie sur toute la table).
Ici le 12 est le chef de 3, 109 est le chef de 12 et 109 n’a pas de chef donc c’est le boss.
Ici la jointure est interne ce qui est le cas par défaut donc vous pouvez abréger « inner Join » par « Join ».
Les jointures Internes
Les jointures internes combinent des tables en comparant des colonnes qui sont communes aux deux tables. Sql Server renvoie uniquement les lignes qui répondent aux conditions de jointures.
Attention il est souvent nécessaire de préciser dans la clause « select » « le nom de la table. Le nom de la colonne » car si la colonne est présente dans les deux tables qui composent la jointure SQL ne saura pas où piocher la valeur.
N’utiliser pas de valeur NULL comme condition de jointure, car les valeurs de ce type ne sont pas considérées comme égales entre elles.
Exemple on a 2 tables qui sont liées par une relation (clé primaire, clé étrangère) on veut faire une requête qui nous renvoi certains champs de la table 1 et certains champs de la tablmes2 qui sont relatifs aux champs de la tables 1. On va donc faire une requête en mettant les champs qui nous intéressent dans la clause « select » puis faire la jointure interne entre les deux tables grâce à la relation qui existe.
Ici on a encore utilisé les alias pour une lecture plus simple de la requête.
La relation entre les deux tables porte ici sur la colonne « EmployeeID ».
Si maintenant on veut ajouter une clause WHERE on la mettra après la jointure.
Les jointures externes
Les jointures externes gauches ou droites combinent les lignes provenant de deux tables qui remplissent la condition de jointure, ainsi que celle de la table de droite ou de gauche qui ne remplissent pas cette condition, conformément à ce que spécifie la clause Join. Les lignes qui ne remplissent pas la condition de la jointure affichent la valeur NULL dans l’ensemble des résultats.
Pourquoi utiliser ce type de jointure ?
Pour obtenir la liste complète des données stockées dans l’une des tables jointes en plus des informations remplissant les conditions de jointures.
Attention aux points suivants :
- SQL ne renvoie que les lignes uniques lorsque vous utilisez des jointures externes gauche ou droite.
- Utilisez une jointure externe gauche pour afficher toutes les lignes de la première table spécifiée (la table à gauche de l’expression). Si vous inversez l’ordre dans lequel les tables sont répertoriées dans la clause from, l’instruction produit le même résultat qu’une jointure externe droite. Inversement pour la jointure externe droite.
- Vous pouvez abréger les clauses « LEFT OUTER JOIN » et « RIGHT OUTER JOIN » en « LEFT JOIN » et « RIGHT JOIN ».
Exemple on a 2 tables liées par une relation, une table clients qui contient 4 clients et une table qui contient les réponses clients à des question seulement on ne sait pas si tout les clients ont répondus aux questions si on fait un inner join :
On un client qui à répondu à 2 question et un autre client qui a répondu à une question. On veut avoir la liste complète des clients qu’ils aient répondu ou pas.
On choisit de mettre un left car la table que l’on veut voir complètement est à gauche du join .
Ici on voit qu’il y a un client (Dollon) qui a répondu qu’à une question et 2 clients qui n’ont pas répondu donc ils ont les champs à NULL.
Maintenant si je fais un right join sur la même requête j’aurais le même résultat qu’un inner join puisque la table t_clireponse ne possède que les réponses des clients.
Ce que je peux faire ici c’est inverser les tables autour du join et mettre right à la place de left et j’aurais le même résultat que le left.
Les jointures croisées
Elles affichent toutes les combinaisons de l’ensemble des lignes des tables jointes. Il n’est pas obligatoire de disposer d’une colonne commune pour utiliser des jointures croisées.
Elles sont rarement utilisées dans une base de données normalisée, on peut les utiliser pour générer des données de tests ou pour créer des listes de vérification.
Select * from T1 cross join T2
Pas de « ON t1.col1=T2.Col1 »
Jointures de plus de deux tables
Il est possible de joindre un nombre quelquonque de tables (limité à 256 tables par instruction select). Toute table spécifiée dans une opération de jointure peut être jointe à une autre table qui possède une colonne commune.
Ainsi on peut obtenir des informations associées provenant de plusieurs tables.
Pensez à utiliser une clause Where pour limiter le nombre de lignes renvoyées.
Exemple on va faire une requête pour laquelle on a besoin de champs qui sont dans 3 tables pour nous aider on a les 3 tables reliées par des relations donc dans le select on va spécifier les champs que l’on veut voir apparaitre en les nommant « table.colonne » puis on va faire des jointure sur les relations .
Combinaison d’ensemble de résultats (union)
On va utiliser l’opérateur union pour créer un seul ensemble de résultat à partir de plusieurs requêtes.
On utilise Union lorsque les données qu’on souhaite extraire proviennent de sources différentes et qu’elles ne sont pas accessibles à l’aide d’une seule requête.
Attention les tables spécifiées doivent contenir des données de mêmes types ainsi que le même nombre et le même ordre de colonne dans la liste de sélection de chaque requête.
Sql supprime les lignes en double de l’ensemble de résultats. Toutefois si, si on utilise l’option ALL, toutes les lignes (doublons inclus) figurent dans l’ensemble de résultats.
Exemple : On va faire une requête qui demande le nom et le numéro des personnes dont le nom commence par « AB » et une autre requête qui demande le nom d’un produit et sa référence pour tout les produits dont le nom commence par un « B », les 2 requêtes demandent des champs qui sont de même types donc on va pouvoir faire une union pour rassembles les 2 requêtes dans le même ensemble de résultat.
Si on exécute les 2 requêtes sans union on a 2 ensembles de résultats
Si pour la même requête on ajoute une clause union entre les 2 on a ce qui suit :
Soit un seul ensemble de résultat.
Articles récents
- [SharePoint 2010]Faire un workflow approbation sous SharePoint foundation 2010
- [SQL Server]Saga transact-SQL Episode 6 : Les sous requêtes
- [SQL Server]Saga transact-SQL Episode 5 : Les jointures de tables
- [SQL Server]Saga transact-SQL Episode 4 : Grouper et organiser les données
- [SQL Server]Saga transact-SQL Episode 3 : Retrouver les données avec un SELECT