Afficher des données de plusieurs tables
Objectifs
A la fin de ce TP, vous pourrez :
• écrire des instructions SELECT afin d'accéder aux
données de plusieurs tables à l'aide d'équijointures
et de non-équijointures
• joindre une table à elle-même à l'aide d'une auto-
jointure
• afficher des données qui ne satisfont généralement
pas à une condition de jointure, à l'aide de jointures
externes
• générer un produit cartésien de toutes les lignes de
plusieurs tables
Obtenir des données de plusieurs tables
EMPLOYEES DEPARTMENTS
…
Types de jointure
Les jointures conformes à la norme SQL:1999 sont :
• Jointures naturelles Natural Join
• Clause USING Join … Using
• Clause ON Join … On
• Auto-jointures
• Non équijointures
• Jointures externes (gauche ; droite ; complète )
• Jointures croisées
Joindre des tables à l'aide de la syntaxe
SQL : 1999
Utilisez une jointure pour interroger des données
provenant de plusieurs tables :
SELECT [Link], [Link]
FROM table1
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |
[JOIN table2
ON (table1.column_name = table2.column_name)]|
[LEFT|RIGHT|FULL OUTER JOIN table2
ON (table1.column_name = table2.column_name)]|
[CROSS JOIN table2];
Créer des jointures naturelles
• La clause NATURAL JOIN est basée sur toutes les
colonnes des deux tables portant le même nom.
• Elle sélectionne les lignes des deux tables dont
les valeurs sont identiques dans toutes les
colonnes qui correspondent.
• Si les colonnes portant le même nom présentent
des types de données différents, une erreur est
renvoyée.
Extraire des enregistrements à l'aide de
jointures naturelles
SELECT department_id, department_name,
location_id, city
FROM departments
NATURAL JOIN locations ;
Créer des jointures avec la clause USING
• Si plusieurs colonnes portent le même nom, et on
veut privilégier une colonne particulière pour la
jointure, la clause NATURAL JOIN est replacée par la
clause USING, laquelle permet de désigner la colonne
qui doit être utilisée pour la jointure.
• Utilisez donc la clause USING pour n'indiquer qu'une
seule colonne lorsque plusieurs colonnes
correspondent.
• N'utilisez pas de nom ou alias de table dans les
colonnes référencées.
• Les clauses NATURAL JOIN et USING sont
mutuellement exclusives.
Joindre des noms de colonne
EMPLOYEES DEPARTMENTS
… …
Clé étrangère Clé primaire
Extraire des enregistrements avec la clause USING
SELECT employee_id, last_name, location_id,
department_id
FROM employees JOIN departments
USING (department_id) ;
…
Différencier les noms de colonne
• Utilisez des préfixes qui précisent le nom de la table
pour différencier les noms de colonne présents dans
plusieurs tables.
• L'utilisation de préfixes désignant la table améliore
les performances.
• Utilisez des alias de colonne pour distinguer les
colonnes qui présentent des noms identiques, mais
qui résident dans des tables différentes.
• N'utilisez pas d'alias sur les colonnes identifiées
dans la clause USING et indiquées ailleurs dans
l'instruction SQL.
Différencier les noms de colonne
SELECT employees.employee_id, employees.last_name,
departments.location_id, department_id
FROM employees JOIN departments
USING (department_id) ;
…
Utiliser des alias de table
• Utilisez des alias de table pour simplifier les
interrogations.
• Utilisez des alias de table pour améliorer les
performances.
SELECT e.employee_id, e.last_name,
d.location_id, department_id
FROM employees e JOIN departments d
USING (department_id) ;
Créer des jointures avec la clause ON
• La condition de la jointure naturelle est une
équijointure de toutes les colonnes portant le
même nom.
• Utilisez la clause ON pour indiquer des conditions
arbitraires ou pour désigner les colonnes à joindre.
• La condition de jointure est distincte des autres
conditions de recherche.
• La clause ON facilite la compréhension du code.
Extraire des enregistrements avec la clause ON
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id);
…
Auto-jointures avec la clause ON
EMPLOYEES (WORKER) EMPLOYEES (MANAGER)
… …
MANAGER_ID dans la table WORKER est égal à
EMPLOYEE_ID dans la table MANAGER.
Auto-jointures avec la clause ON
SELECT e.last_name emp, m.last_name mgr
FROM employees e JOIN employees m
ON (e.manager_id = m.employee_id);
…
Appliquer des conditions supplémentaires
à une jointure
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)
AND e.manager_id = 149 ;
Créer des jointures à trois liens avec la
clause ON
SELECT employee_id, city, department_name
FROM employees e
JOIN departments d
ON d.department_id = e.department_id
JOIN locations l
ON d.location_id = l.location_id;
…
Non-équijointures
EMPLOYEES JOB_GRADES
Le salaire de la table EMPLOYEES
doit être compris entre le salaire
… le plus faible et le salaire le plus
élevé de la table JOB_GRADES.
Extraire des enregistrements à l'aide de
non-équijointures
SELECT e.last_name, [Link], j.grade_level
FROM employees e JOIN job_grades j
ON [Link]
BETWEEN j.lowest_sal AND j.highest_sal;
…
Jointures externes
DEPARTMENTS EMPLOYEES
…
Le département 190 ne compte
aucun employé.
Comparaison des jointures INNER et OUTER
• Dans la syntaxe SQL : 1999, la jointure de deux
tables qui renvoie uniquement les lignes qui
correspondent est une jointure interne.
• Une jointure entre deux tables qui renvoie les
résultats de la jointure interne, ainsi que les
lignes de la table de gauche (ou droite) qui ne
correspondent pas, est une jointure externe
gauche (ou droite).
• Une jointure entre deux tables qui renvoie les
résultats d'une jointure interne, ainsi que les
résultats d'une jointure gauche et droite, est une
jointure externe complète.
LEFT OUTER JOIN
SELECT e.last_name, e.department_id, d.department_name
FROM employees e LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;
…
RIGHT OUTER JOIN
SELECT e.last_name, e.department_id, d.department_name
FROM employees e RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;
…
FULL OUTER JOIN
SELECT e.last_name, d.department_id, d.department_name
FROM employees e FULL OUTER JOIN departments d
ON (e.department_id = d.department_id) ;
…
Produits cartésiens
• Un produit cartésien est généré dans les cas suivants :
– Une condition de jointure est omise
– Une condition de jointure n'est pas valide
– Toutes les lignes de la première table sont jointes à
toutes les lignes de la seconde
• Pour éviter un produit cartésien, incluez toujours une
condition de jointure valide.
Générer un produit cartésien
EMPLOYEES (20 lignes) DEPARTMENTS (8 lignes)
Produit cartésien :
20 x 8 = 160 lignes
…
Créer des jointures croisées
• La clause CROSS JOIN génère le produit cartésien
de deux tables.
SELECT last_name, department_name
FROM employees
CROSS JOIN departments ;
…
Synthèse
Dans ce TP, vous avez appris à utiliser des jointures pour
afficher des données de plusieurs tables avec des :
• jointures naturelles
• auto-jointures
• non-équijointures
• jointures externes (gauche ; droite ; complète)
• jointures croisées