Académique Documents
Professionnel Documents
Culture Documents
6-9
Jointure de tables avec JOIN
DFo 6-9
Jointure de tables avec JOIN Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés. 3
Objectifs
Voici les objectifs de cette leçon :
• Ecrire des instructions SELECT pour accéder aux données de
plusieurs tables à l'aide d'équijointures et de non-
équijointures
• Utiliser une auto-jointure pour joindre une table à elle-même
• Utiliser des jointures externes (OUTER) pour afficher des
données qui ne répondent généralement pas à une condition
de jointure
• Générer un produit cartésien (jointure
croisée) de toutes les lignes de
plusieurs tables
DFo 6-9
Jointure de tables avec JOIN 4
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Obtention de données de plusieurs tables
• Vous avez parfois besoin d'utiliser les données de plusieurs
tables.
EMPLOYEES
• Pour générer le DEPARTMENTS
rapport, vous
devez lier les
tables EMPLOYEES
et DEPARTMENTS,
et accéder aux
données des
deux tables.
DFo 6-9
Jointure de tables avec JOIN 5
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Types de jointure
DFo 6-9
Jointure de tables avec JOIN 6
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Jointure de tables avec la syntaxe
SQL:1999
• Utilisez une jointure pour interroger les données de
plusieurs tables :
SELECT table1.column, table2.column
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];
DFo 6-9
Jointure de tables avec JOIN 7
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Qualification des noms de colonne
ambigus
• Utilisez des préfixes de table pour qualifier les noms
de colonne figurant dans plusieurs tables afin
d'éviter les ambigüités.
• Utilisez des préfixes de table pour augmenter la
vitesse d'analyse de l'instruction.
• Au lieu de préfixes de nom de table complet, utilisez
des alias de table.
• Les alias de table permettent d'abréger les noms de
table, de limiter la longueur du code SQL et d'utiliser
moins de mémoire.
DFo 6-9
Jointure de tables avec JOIN 8
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Qualification des noms de colonne
ambigus
• Utilisez des alias de table pour distinguer les
colonnes portant des noms identiques, mais figurant
dans différentes tables.
SELECT e.first_name,d.department_name,d.manager_id,
FROM employees e JOIN departments d
USING(deparment_id)
DFo 6-9
Jointure de tables avec JOIN 9
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Création de jointures naturelles
DFo 6-9
Jointure de tables avec JOIN 10
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Extraction d'enregistrements avec des
jointures naturelles
• Une jointure naturelle utilise le seul champ commun
aux deux tables (DEPARTMENT_ID) pour faire la
jointure.
SELECT department_id, department_name,location_id,
city
FROM departments NATURAL JOIN locations;
DFo 6-9
Jointure de tables avec JOIN 11
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Création de jointures avec la clause USING
• Si plusieurs colonnes sont partagées par les tables
jointes, tous les champs communs sont utilisés dans
la jointure.
• Utilisez la clause USING pour indiquer une seule
colonne pour la jointure (JOIN) au lieu d'une
jointure naturelle (NATURAL JOIN).
• La clause USING permet également d'associer des
colonnes ayant le même nom, mais des types de
données différents.
• Les clauses NATURAL JOIN et USING s'excluent
mutuellement.
DFo 6-9
Jointure de tables avec JOIN 12
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Jointure de noms de colonne
• Les valeurs de la colonne DEPARTMENT_ID des deux tables
doivent être égales. Il s'agit d'une équijointure (également
appelée jointure simple ou interne).
EMPLOYEES DEPARTMENTS
DFo 6-9
Jointure de tables avec JOIN 14
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Utilisation d'alias de table avec la clause
USING
• N'utilisez pas d'alias ou de nom de table dans la
clause USING.
• Si la même colonne est utilisée ailleurs dans
l'instruction SQL, ne lui attribuez pas d'alias.
SELECT l.city, d.department_name
FROM locations l JOIN departments d
USING (location_id)
WHERE d.location_id = 1400;
DFo 6-9
Jointure de tables avec JOIN 15
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Création de jointures avec la clause ON
DFo 6-9
Jointure de tables avec JOIN 16
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Création de jointures avec la clause ON
DFo 6-9
Jointure de tables avec JOIN 17
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Extraction d'enregistrements avec la
clause ON
• Vous pouvez également utiliser la clause ON pour joindre
des colonnes ayant des noms ou des types de données
différents.
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);
EMPLOYEE_ID LAST_NAME DEPARTMENT_ID DEPARTMENT_ID LOCATION_ID
103 Southlake IT …
DFo 6-9
Jointure de tables avec JOIN 19
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Scénario : Clause ON
SELECT b.TITLE as "BOOK TITLE",
Extraction de
a.NAME as "AUTHOR",
t.ID as "BOOK TRANSACTION"
données à partir de FROM AUTHORS a
trois tables JOIN BOOKS b
ON a.ID = b.AUTHOR_ID
JOIN BOOK_TRANSACTIONS t
ON b.ID = t.BOOK_ID;
DFo 6-9
Jointure de tables avec JOIN 20
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Application de conditions supplémentaires
à une jointure
• Utilisez la clause AND ou WHERE pour appliquer des
conditions supplémentaires :
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 ;
Ou
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)
WHERE e.manager_id = 149 ;
DFo 6-9
Jointure de tables avec JOIN 21
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Projet - Exercice 1
DFo_6_9_1_Project
DFo 6-9
Jointure de tables avec JOIN 22
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Jointure d'une table à elle-même
… …
DFo 6-9
Jointure de tables avec JOIN 23
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Auto-jointures avec la clause ON
• La clause ON peut aussi être utilisée pour joindre des colonnes
ayant des noms différents et figurant dans une même table ou
dans des tables distinctes.
SELECT worker.last_name emp, manager.last_name mgr
FROM employees worker JOIN employees manager
ON (worker.manager_id = manager.employee_id);
EMP MGR
Kochhar King
De Haan King
Zlotkey King
Mourgos King
Hartstein King
Whalen Kochhar
Higgins Kochhar
…
DFo 6-9
Jointure de tables avec JOIN 24
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Non-équijointures
EMPLOYEES JOB_GRADES
…
• La table JOB_GRADES définit la plage de valeurs LOWEST_SAL et
HIGHEST_SAL pour chaque niveau hiérarchique (GRADE_LEVEL).
• Par conséquent, la colonne GRADE_LEVEL peut être utilisée pour
attribuer des niveaux hiérarchiques aux employés en fonction de leur
salaire.
DFo 6-9
Jointure de tables avec JOIN 25
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Extraction d'enregistrements avec des non-
équijointures
• Cet exemple crée une non-équijointure pour évaluer le niveau
de salaire d'un employé. Le salaire doit être compris dans
n'importe quelle paire des plages de salaire minimal/maximal.
SELECT e.last_name, e.salary, j.grade_level
FROM employees e JOIN job_grades j
ON e.salary
BETWEEN j.lowest_sal AND j.highest_sal;
LAST_NAME SALARY GRADE_LEVEL
Vargas 2500 A
Matos 2600 A
Davies 3100 B
Rajs 3500 B
Lorentz 4200 B
Whalen 4400 B
…
DFo 6-9
Jointure de tables avec JOIN 26
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Renvoi d'enregistrements sans
correspondance directe
avec des jointures externes (OUTER)
DEPARTMENTS Equijointure avec EMPLOYEES
Le service 190 ne
compte pas d'employés.
Aucun ID de service n'a été attribué
à l'employé nommé Grant.
DFo 6-9
Jointure de tables avec JOIN 27
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Jointures internes (INNER) et externes
(OUTER)
• Selon la norme SQL:1999, une jointure entre deux tables qui
ne renvoie que des lignes concordantes est appelée jointure
interne (INNER) (clauses NATURAL JOIN, USING, ON).
• Une jointure entre deux tables qui renvoie les résultats d'une
jointure interne (INNER), ainsi que les lignes sans
correspondance de la table de gauche (ou de droite) est
appelée "jointure externe (OUTER) gauche (ou droite)".
• Une jointure entre deux tables qui renvoie les résultats d'une
jointure interne (INNER), ainsi que les résultats d'une
jointure à gauche et à droite est une jointure externe (OUTER)
complète.
DFo 6-9
Jointure de tables avec JOIN 28
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
LEFT OUTER JOIN
• Ici, nous voulons afficher les enregistrements de tous les employés
(table de gauche), même s'ils ne sont pas affectés à un service.
Whalen 10 Administration
Fay 20 Marketing
Hartstein 20 Marketing
Vargas 50 Shipping
Matos 50 Shipping
Davies 50 Shipping
…
Grant - -
DFo 6-9
Jointure de tables avec JOIN 29
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
RIGHT OUTER JOIN
• Ici, nous voulons afficher les enregistrements de tous les services
(table de droite), même s'ils ne comportent aucun employé.
SELECT e.last_name, d.department_id, d.department_name
FROM employees e RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;
Whalen 10 Administration
Hartstein 20 Marketing
Fay 20 Marketing
Mourgos 50 Shipping
Rajs 50 Shipping
Davies 50 Shipping
…
- 190 Contracting
DFo 6-9
Jointure de tables avec JOIN 30
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
FULL OUTER JOIN
• Ici, nous voulons afficher les enregistrements de tous les employés
et de tous les services.
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) ;
LAST_NAME DEPARTMENT_ID DEPARTMENT_NAME
King 90 Executive
Kochhar 90 Executive
De Haan 90 Executive
Whalen 10 Administration
…
Taylor 80 Sales
…Grant - -
Fay 20 Marketing
- 190 Contracting
DFo 6-9
Jointure de tables avec JOIN 31
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Produits cartésiens
• Un produit cartésien représente toutes les
combinaisons de lignes. Toutes les lignes de la
première table sont jointes à toutes les lignes de la
seconde table.
SELECT last_name, department_name
FROM employees, departments
DFo 6-9
Jointure de tables avec JOIN 32
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Génération d'un produit cartésien
EMPLOYEES (40 lignes) DEPARTMENTS (9 lignes)
… …
Produit cartésien :
40 x 9 = 360 lignes
…
DFo 6-9
Jointure de tables avec JOIN 33
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Création de jointures croisées
DFo 6-9
Jointure de tables avec JOIN 34
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Projet - Exercice 2
DFo_6_9_2_Project
DFo 6-9
Jointure de tables avec JOIN 35
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Synthèse
Dans cette leçon, vous avez appris comment :
• écrire des instructions SELECT pour accéder aux données de
plusieurs tables à l'aide d'équijointures et de non-
équijointures ;
• utiliser une auto-jointure pour joindre une table à elle-même ;
• utiliser des jointures externes (OUTER) pour afficher des
données qui ne répondent généralement pas à une condition
de jointure ;
• générer un produit cartésien (jointure croisée) de toutes les
lignes de plusieurs tables.
DFo 6-9
Jointure de tables avec JOIN 36
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.