Vous êtes sur la page 1sur 37

Database Foundations

6-9
Jointure de tables avec JOIN

Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.


Feuille de route
Data
Structured Data Definition Transaction
Introduction à Manipulation
Query Language Control
Oracle Language
Language (DDL) Language (TCL)
Application (DML)
Express (APEX) (SQL)

Tri des Jointure de


Extraction des Restriction des tables avec
données avec données avec données avec
ORDER BY JOIN
SELECT WHERE

Vous êtes ici

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

• Jointures conformes à la norme SQL:1999 :


– Jointure naturelle avec clause NATURAL JOIN
– Jointure avec clause USING
– Jointure avec clause ON
– Jointures externes (OUTER) :
• LEFT OUTER JOIN
• RIGHT OUTER JOIN
• FULL OUTER JOIN
– CROSS JOIN

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)

Remarque : consultez les notes de la diapositive pour


obtenir des conseils sur les alias de table.

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

• La clause NATURAL JOIN repose sur toutes les


colonnes des deux tables qui ont le même nom et le
même type de données.
• Elle sélectionne les lignes des deux tables ayant des
valeurs égales dans toutes les colonnes
concordantes.
• Si des colonnes portant le même nom ont des types
de données différents, une erreur est renvoyée.

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

Clé étrangère Clé primaire


DFo 6-9
Jointure de tables avec JOIN 13
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Extraction d'enregistrements avec la
clause USING
• La clause USING indique que la jointure est effectuée
avec la colonne DEPARTMENT_ID, et non
MANAGER_ID, qui est également une colonne
commune.
SELECT employee_id, last_name,
location_id, department_id
FROM employees JOIN departments
USING (department_id) ;

EMPLOYEE_ID LAST_NAME LOCATION_ID DEPARTMENT_ID

200 Whalen 1700 10

201 Hartstein 1800 20

202 Fay 1800 20

124 Mourgos 1500 50

141 Rajs 1500 50

142 Davies 1500 50



143 Matos 1500 50

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

• Une jointure naturelle (NATURAL JOIN) crée une


équijointure de toutes les colonnes avec les mêmes
nom et type de données.
• Utilisez la clause ON pour indiquer des conditions
arbitraires ou des colonnes à joindre.
• La condition de jointure est distincte des autres
conditions de recherche.

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

• La clause ON facilite la compréhension du code.


• Une clause USING crée une équijointure entre
deux tables en utilisant une colonne du même
nom, quel qu'en soit le type de données.
• Une clause ON crée une équijointure entre deux
tables en utilisant une colonne de chaque table
quel qu'en soit le nom ou le type de données.

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

200 Whalen 10 10 1700

201 Hartstein 20 20 1800

202 Fay 20 20 1800

124 Mourgos 50 50 1500

141 Rajs 50 50 1500

142 Davies 50 50 1500

143 Matos 50 50 1500



DFo 6-9
Jointure de tables avec JOIN 18
Copyright © 2017, Oracle et/ou ses affiliés. Tous droits réservés.
Création de jointures tridirectionnelles
avec la clause ON
• Deux instructions de jointure sont nécessaires pour joindre
trois tables, comme indiqué ci-dessous :
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;
EMPLOYEE_ID CITY DEPARTMENT_NAME

201 Toronto Marketing

202 Toronto Marketing

149 Oxford Sales

174 Oxford Sales

176 Oxford Sales

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;

Données extraites avec la


clause ON

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

Base de données du magasin Oracle Baseball


League
Rédiger des instructions SELECT en utilisant des
données provenant de plusieurs tables grâce à des
équijointures et des non-équijointures
- Jointures naturelles, clauses USING et ON,
jointures tridirectionnelles

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

EMPLOYEES (WORKER) EMPLOYEES (MANAGER)

… …

MANAGER_ID dans la table WORKER est l'équivalent


d'EMPLOYEE_ID dans la table MANAGER.

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.

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) ;
LAST_NAME DEPARTMENT_ID DEPARTMENT_NAME

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) ;

LAST_NAME DEPARTMENT_ID DEPARTMENT_NAME

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

• L'omission ou l'invalidité d'une condition de jointure


entraîne la formation d'un produit cartésien.
• Pour éviter un produit cartésien, incluez toujours une
condition de jointure valide.
SELECT last_name, department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id

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

• La clause CROSS JOIN génère le produit "croisé"


de deux tables.
• On parle également de produit cartésien entre les
deux tables.
SELECT last_name, department_name
FROM employees
CROSS JOIN departments ;

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

Base de données du magasin Oracle Baseball


League
Rédiger des instructions SELECT en utilisant des
données provenant de plusieurs tables grâce à des
équijointures et des non-équijointures
- Auto-jointures, jointures externes (OUTER JOIN),
produits cartésiens

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.