Vous êtes sur la page 1sur 27

Ministère de l’Enseignement Supérieur et de recherche scientifique

Université de Sousse

Séance de Cours

Chapitre 2
SQL : Jointure & Requêtes
imbriquées

2022-2023
PLAN
I. Produit cartésien
II. Jointure
II.1 Jointure naturelle
II.2 Auto-jointure
II.3 Jointure Externe
II.4 Thêtajointure
III. Les requêtes imbriquées
III.1 Sous-requête indépendante renvoyant une seul ligne
III.2 Sous-requête indépendante renvoyant plusieurs lignes
III.3 Sous-requête synchronisée avec la requête principale
III.4 Sous-requête avec plusieurs colonnes
V. Les Opérateurs ensemblistes
V.1 Opérateur UNION
V.2 Opérateur INTERSECT
V.3 Opérateur MINUS 2
I. Produit cartésien
 Opération permettant de combiner des informations venant de plusieurs tables

 Se formule en spécifiant plusieurs tables dans la clause FROM


Aucune condition de jointure n'est précisée dans la clause Where

 Résultat : une nouvelle table obtenu en multipliant chaque ligne de la


première table par toutes les ligne de la deuxième table

Exemple
EMP(EMPNO, ENAME, JOB, HIREDATE , MGR, SAL, COMM, #DEPTNO)
DEPT(DEPTNO, DNAME, LOC)
PROJET(CodeP, NomP)
PARTICIPATION(EMPNO#, CodeP#, Fonction)
SALGRADE(GRADE, LOSAL, HISAL )

3
I. Produit cartésien
Exemple Produit cartésien

SQL> select *
from dept, emp;
4
5
II. Les Jointures
 Opération permettant de combiner des informations venant de plusieurs tables.
 On peut joindre jusqu'à 256 tables.
 Se formule en spécifiant :
1) plusieurs tables dans la clause FROM
2) une condition de jointure dans la clause Where
SELECT ...
FROM nom_table1, nom_table2...
WHERE condition de jointure et prédicat;
 Plusieurs types de jointures sont définis selon la nature de la condition de sélection.
 Jointure naturelle (condition de jointure est une égalité =),

Auto-jointure (Jointure d'une table avec elle-même),

Jointure externe,

 Thêtajointure.
6
II. Les Jointures
II.1 Jointure naturelle
C'est une opération qui permet de réaliser une liaison logique entre deux tables.

La condition de jointure est une égalité de valeurs entre une colonne de la première
table et une colonne de la deuxième.
Exemple 2 :
EMP(EMPNO, ENAME, JOB, HIREDATE , MGR, SAL, COMM, #DEPTNO)
DEPT(DEPTNO, DNAME, LOC)
PROJET(CodeP, NomP)
PARTICIPATION(EMPNO#, CodeP#, Fonction)
Donner les noms des employés et les noms des départements dans les quels ils
travaillent.
ENAME DNAME
SELECT ENAME, DNAME ---------- --------------
SMITH RESEARCH
FROM EMP, DEPT ALLEN SALES
WHERE EMP.DEPTNO = DEPT.DEPTNO; WARD SALES…… 7
II. Les Jointures
II.1 Jointure naturelle
Exemple 3 :
JOURNAL(CODE_J, TITRE, PRIX, TYPE, PERIODE, ADR_J)
DEPOT (N_DEP, NOM_DEP, ADR )
LIVRAISON(N_DEP#, CODE_J, DATE_L, QTE_L, QTE_R )0
Donner le titre des journaux dont le prix>5 et les numéros des dépositaires
auxquels ils sont livrés.

Select titre, n_dep Condition de


From journal, livraison sélection

Where prix >5


and Condition de
journal.code_j = livraison.code_j; jointure
8
II. Les Jointures
II.1 Jointure naturelle
Exemple 4 :
JOURNAL(CODE_J, TITRE, PRIX, TYPE, PERIODE, ADR_J)
DEPOT (N_DEP, NOM_DEP, ADR )
LIVRAISON(N_DEP#, CODE_J, DATE_L, QTE_L, QTE_R )
Donner les Codes et titres des journaux livrés au dépositaire nommé Bures

Select distinct code_j, titre


From depot, livraison, journal
Where depot.n_dep = livraison.n_dep and
journal.code_j = livraison. code_j
and NOM_DEP like 'BURES';

9
II. Les Jointures
II.2 Auto-jointure (Jointure d'une table avec elle-même)
 Une même table peut figurer plusieurs fois dans un ordre SELECT.
 SQL construit la requête en considérant plusieurs copies de la même table.

Il faut renommer au moins l'une des deux tables en lui attribuant un synonyme
Exemple 5 :
Afficher sur une même ligne les codes et les titres des journaux qui ont
le même prix

Select j1.code_j, j1. titre, j2.code_j, j2.titre


From journal j1 , journal j2
where j1.prix = j2.prix;

10
II. Les Jointures
II.2 Auto-jointure naturelle (Jointure d'une table avec elle-même)
Exemple 6:

EMP(EMPNO, ENAME, JOB, HIREDATE , MGR, SAL, COMM, #DEPTNO)


DEPT(DEPTNO, DNAME, LOC)
PROJET(CodeP, NomP)
PARTICIPATION(EMPNO#, CodeP#, Fonction)

Donner la lister les employés qui ont un supérieur, en indiquant pour chacun le nom
de son supérieur

SELECT EMP.ENAME as "EMPLOYE" , SUPE.ENAME as "SUPERIEUR"


FROM EMP, EMP SUPE
WHERE EMP.MGR = SUPE.EMPNO;

11
EMP EMP SUPE

SELECT EMP.ENAME as "EMPLOYE" , EMPLOYE SUPERIEUR


---------- ----------
SUPE.ENAME as "SUPERIEUR" SMITH FORD
FROM EMP, EMP SUPE ALLEN BLAKE
WARD BLAKE … 12
WHERE EMP.MGR = SUPE.EMPNO;
II. Les Jointures
II. 3 Jointure Externe
Dans l'exécution d'une jointure, les lignes des tables qui ne vérifient pas la condition
exprimée par la condition de jointure ne sont pas affichées dans le résultat.

Une jointure externe favorise une table, appelée table dominante, par rapport
à l'autre appelée table subordonnée

Les lignes de la table dominante sont affichées même si la condition de


jointure n'est pas vérifiée.

L'opérateur (+) placé après le nom d'une des deux table indique la table
subordonnée (dans la quelle il manque des éléments).

13
II. Les Jointures
II.3 Jointure Externe
Exemple 7:
EMP(EMPNO, ENAME, JOB, HIREDATE , MGR, SAL, COMM, #DEPTNO)
DEPT(DEPTNO, DNAME, LOC)
PROJET(CodeP, NomP)
PARTICIPATION(EMPNO#, CodeP#, Fonction)

Donner la liste des divers départements, avec leurs employés s'ils en ont, sans omettre
les départements sans employés
SELECT ENAME, DNAME ENAME DNAME
FROM EMP (+), DEPT ---------- --------------
CLARK ACCOUNTING
WHERE EMP.DEPTNO= DEPT.DEPTNO; KING ACCOUNTING
MILLER ACCOUNTING
OPERATIONS
……………

14
II. Les Jointures
II.4 Thêtajointure
Est une jointure dont l'expression de la condition de jointure utilise des opérateurs
autre que l'égalité, tel que <, >, <=, >=, !=, between, in..
Exemple 8 :
Liste des journaux avec tous les journaux ayant un prix plus chère

SELECT j1.code_j, j1.titre, j2.code_j, j2.titre


FROM journal j1, journal j2
WHERE j1.prix < j2.prix;

15
II. Les Jointures
II.4 Thêtajointure
Exemple 9:
EMP(EMPNO, ENAME, JOB, HIREDATE , MGR, SAL, COMM, #DEPTNO)
DEPT(DEPTNO, DNAME, LOC)
PROJET(CodeP, NomP)
PARTICIPATION(EMPNO#, CodeP#, Fonction)

Donner la liste des employés, avec tous les employés qui gagnent plus

SELECT EMP.ENAME, EMP.SAL, EMPPLUS.ENAME, EMPPLUS.SAL


FROM EMP, EMP EMPPLUS ENAME SAL ENAME SAL
WHERE EMP.SAL < EMPPLUS.SAL ---------- --------- ---------- ---------
SMITH 800 ALLEN 1600
ORDER BY EMP.SAL; SMITH 800 WARD 2500
SMITH 800 JONES 2975
SMITH 800 MARTIN 1250
…… 16
III. Les Sous-Requêtes (Requête Imbriquées)
 Une expression utilisée dans la clause WHERE peut être le résultat d'une
autre requête appelée sous-requête.
 C'est une requête incluse dans une expression SQL.

 On parle de Requête Imbriquées .


Exemple 10 :
Donner les journaux ayant le même prix que le journal " LE MONDE"
On ne connait pas le prix du journal " LE MONDE"
Il faut le chercher par une sous requête.

Select * from journal


where prix = (select prix from journal where upper(titre) like('LE MONDE'));

Il existe plusieurs types de requêtes imbriquées : une sous-requête peut renvoyer


soit une ligne, soit plusieurs lignes
17
III. Les Sous-Requêtes (Requête Imbriquées)
III.1 Sous-requête indépendante renvoyant une seul ligne
 La sous requête retourne une et une seule ligne.
 Dans le cas où plusieurs lignes, ou pas de ligne sont ramenées, un message
d'erreur sera affiché et l'interrogation sera abandonnée

Exemple :
Donner les journaux ayant un prix supérieur au prix moyen
On ne connait pas le prix moyen
Il faut le chercher par une sous requête.

Select * from journal


where prix > (select AVG(prix) from journal);

18
III. Les Sous-Requêtes (Requête Imbriquées)
III.2 Sous-requête indépendante renvoyant plusieurs lignes
Une sous-interrogation peut ramener plusieurs lignes à condition que
l'opérateur de comparaison admet à sa droite un ensemble de valeurs.
Les opérateurs permettant de comparer une valeur à un ensemble de valeurs sont :
IN, ANY ou ALL placés à la suite des opérateurs de comparaison classique
=, !=, <, >, <=, >=.

IN : la condition prend la valeur vraie si elle est vérifiée pour une des valeurs
renvoyées par la sous-requête;

ANY : la comparaison prend la valeur vraie si elle est vraie pour au moins un
élément de l'ensemble (elle est donc fausse si l'ensemble est vide).

ALL : la comparaison prend la valeur vraie si elle est vraie pour tous les
éléments de l'ensemble (elle est vraie si l'ensemble est vide).
19
III. Les Sous-Requêtes (Requête Imbriquées)
Exemples
JOURNAL(CODE_J, TITRE, PRIX, TYPE, PERIODE, ADR_J)
DEPOT (N_DEP, NOM_DEP, ADR )
LIVRAISON(N_DEP#, CODE_J, DATE_L, QTE_L, QTE_R )

1) Codes des journaux livrés à Bures

select distinct code_j from livraison


where n_dep IN (select n_dep from depot where upper(adr) like'BURES');

2) Codes des journaux qui ne sont pas livrés à Bures

select distinct code_j from livraison


where n_dep NOT IN (select n_dep from depot where upper(adr) like
'BURES');
20
III. Les Sous-Requêtes (Requête Imbriquées)
Exemples
JOURNAL(CODE_J, TITRE, PRIX, TYPE, PERIODE, ADR_J)
DEPOT (N_DEP, NOM_DEP, ADR )
LIVRAISON(N_DEP#, CODE_J, DATE_L, QTE_L, QTE_R )

3) titres des journaux plus chères que tous les journaux de PARIS

select distinct titre from journal


where prix > ALL (select prix from journal where upper(adr_j) like
'PARIS');

4) titres des journaux plus chères que au moins un des journaux de PARIS
select distinct titre from journal
where prix > ANY (select prix from journal where upper(adr_j )like
'PARIS');
21
III. Les Sous-Requêtes (Requête Imbriquées)
III.3 Sous-requête synchronisée avec la requête principale
 Il est possible de synchroniser une sous-interrogation avec l'interrogation
principale
 C'est une sous-interrogation faisant référence à une colonne de la table de
l'interrogation principale.
Exemple
Liste des journaux dont le prix supérieur à tous les prix des journaux ayant la
même adresse

select *
from journal j1
where prix > ALL (select prix from journal j2 where j2.adr_j = j1.adr_j );

22
III. Les Sous-Requêtes (Requête Imbriquées)
III.4 Sous-requête avec plusieurs colonnes
 Il est possible de comparer le résultat d'un ordre select renvoyant plusieurs
colonnes à une liste d'attributs

 La liste de colonnes figure alors entre parenthèses à gauche de l'opérateur de


comparaison sous la forme

Where (colonne1, colonne2, …) = select (colonne1, colonne2, …)

Exemple
Liste des journaux ayant le même type et la même période que le journal 115
Select * from journal
where (type, periode) = (select type, periode from journal where code_j = 115);

23
IV. Utilisation des requêtes dans d'autres commandes SQL
IV.1 Création d'une table obtenu comme résultat d'une requête
Syntaxe :
CREATE TABLE table (col type......)
AS SELECT .....

Exemple1
Création d'une table contenant les numéros et les noms des employés ayant un
salaire supérieur à 10000
Create table emp1 as select EMPNO, ENAME from EMP where SAL>10000;
Exemple2
Création d'une table contenant les numéros et les noms des employés ayant
un salaire supérieur au salaire moyen.
CREATE TABLE EMP2 AS SELECT EMPNO, ENAME
FROM EMP
WHERE SAL > (SELECT AVG(SAL) FROM EMP);
24
IV. Utilisation des requêtes dans d'autres commandes SQL
IV.2 Insertion dans une table des enregistrements obtenus comme
résultat d'une requête.
Exemple1

1 -- création d'une table ancienneté


CREATE TABLE Anciennete
(EMPNO number(4),
ancienneté NUMBER(6,4));

2-- insertion de données.


INSERT INTO Anciennete
(SELECT EMPNO, ceil((sysdate-HIREDATE)/365) FROM EMP);

25
V. Les Opérateurs ensemblistes
V.1 Opérateur UNION
 Permet de fusionner deux sélections de tables pour obtenir un ensemble
de lignes égal à la réunion des lignes des deux sélections.
 Les lignes communes n'apparaîtront qu'une seule fois.
 Si on veut conserver les doublons, on peut utiliser la variante UNION ALL

Exemple
Liste des
Liste des journaux de PARIX et de ceux de type TELE journaux
de PARIS
Select titre from journal where adr_j like( 'PARIS')
UNION
Select titre from journal where type like( 'TELE'); Liste des
journaux de
type TELE
26
V. Les Opérateurs ensemblistes
V.2 Opérateur INTERSECT
 Permet d'obtenir l'ensemble des lignes communes à deux interrogations.
Exemple
Liste des journaux de PARIX et en même temps de type TELE
Select titre from journal where adr_j like( 'PARIS')
INTERSECT
Select titre from journal where type like( 'TELE');
V.3 Opérateur MINUS
Permet d'obtenir des lignes qui appartiennent à la première requête mais pas
à la seconde
Exemple Liste des
 numéros des dépôts ne recevant aucun journal dépôts

Select n_dep from depot


Liste des dépôts
MINUS recevant des
Select distinct (n_dep) from livraison; journaux 27

Vous aimerez peut-être aussi