Vous êtes sur la page 1sur 50

Système de Gestion de Bases de Données

Langage d’interrogation des données


Préparé par : Mme Olfa DRIDI

© Olfa DRIDI
Plan

1. Les jointures
2. Les sous-interrogations

2 ©
Requêtes sur plusieurs tables

Plusieurs clauses du langage SQL permettent de manipuler


simultanément plusieurs tables et d’exprimer des
opérations binaires de l’algèbre relationnelle :
• Produit cartésien
• Jointure
• Union
• Intersection
• Différence

3 ©
Génération d'un Produit Cartésien
EMP (14 lignes) DEPT (4 lignes)
EMPNO ENAME ... DEPTNO DEPTNO DNAME LOC
------ ----- ... ------ ------ ---------- --------
7839 KING ... 10 10 ACCOUNTING NEW YORK
7698 BLAKE ... 30 20 RESEARCH DALLAS
... 30 SALES CHICAGO
7934 MILLER ... 10 40 OPERATIONS BOSTON

ENAME DNAME
------ ----------
KING ACCOUNTING
"Produit BLAKE ACCOUNTING
cartésien : ...
KING RESEARCH
14*4=56 lignes" BLAKE RESEARCH
...
56 rows selected.

©
Qu'est-ce qu'une Jointure ?
• Une jointure sert à extraire des données de plusieurs tables.

SELECT table1.column, table2.column


FROM table1, table2
WHERE table1.column1 = table2.column2;

• Ecrivez la condition de jointure dans la clause WHERE.


• Placez le nom de la table avant le nom de la colonne lorsque
celui-ci figure dans plusieurs tables.

©
Types de jointures
En extrayant des données provenant de plusieurs tables, nous
devons les joindre. Plusieurs types de jointures sont définis
selon la nature de la condition:
• une équijointure ou simple jointure ou jointure interne : permet
de réaliser une liaison logique entre 2 tables (l’égalité entre la
CP d’une table et la CE de l’autre)
• une inéquijointure ou thêta jointure : est une jointure dont
l’expression du pivot utilise des opérateurs autre que
l’égalité(<,>,!=,>=,<=, BETWEEN)
• une auto jointure : jointure d’une table à elle-même
• une jointure externe : est une jointure qui favorise une table
sur une autre

6 ©
Extraction d'Enregistrements avec les Equijointures
Donner pour chaque employé son nom et son lieu de travail.

SQL> SELECT emp.empno, emp.ename, emp.deptno,


2 dept.deptno, dept.loc
3 FROM emp, dept
4 WHERE emp.deptno=dept.deptno;

EMPNO ENAME DEPTNO DEPTNO LOC


----- ------ ------ ------ ---------
7839 KING 10 10 NEW YORK
7698 BLAKE 30 30 CHICAGO
7782 CLARK 10 10 NEW YORK
7566 JONES 20 20 DALLAS
...
14 rows selected.

©
Extraction d'Enregistrements avec les Equijointures
• Le rapprochement de chaque ligne de la table emp avec la
ligne de la table dept ayant même numéro de département
permet d'obtenir la liste des employés avec la localité dans
laquelle ils travaillent.
• Ce rapprochement entre deux colonnes appartenant à deux
tables différentes mais ayant le même sens (ici le numéro de
département) et venant vraisemblablement d'une relation 1-
n lors de la conception (ici 1 entité département pour n entités
employés) est assez naturel. C'est pourquoi ce type de jointure
porte le nom de jointure naturelle ou d'équi-jointure.

8 ©
Différencier les noms de Colonne Ambigus

• Préfixer avec le nom de la table pour différencier les noms


de colonnes appartenant à plusieurs tables.
• Ces préfixes de table améliorent les performances.
• Différencier des colonnes de même nom appartenant à
plusieurs tables en utilisant des alias de colonne.

©
Utilisation d'Alias de Table
• Simplifiez les requêtes avec les alias de table.

SQL> SELECT emp.empno, emp.ename, emp.deptno,


2 dept.deptno, dept.loc
3 FROM emp, dept
4 WHERE emp.deptno=dept.deptno;

SQL> SELECT e.empno, e.ename, e.deptno,


2 d.deptno, d.loc
3 FROM emp e, dept d
4 WHERE e.deptno=d.deptno;

©
Non-Equijointures
• C’est une jointure dont l’expression du pivot utilise des
opérateurs autre que l’égalité (<,>,!=,>=,<=, BETWEEN)
EMP
EMPNO ENAME SAL SALGRADE
------ ------- ------ GRADE LOSAL HISAL
7839 KING 5000 ----- ----- ------
7698 BLAKE 2850 1 700 1200
7782 CLARK 2450 2 1201 1400
7566 JONES 2975 3 1401 2000
7654 MARTIN 1250 4 2001 3000
7499 ALLEN 1600 5 3001 9999
7844 TURNER 1500
7900 JAMES 950
... "Les salaires (SAL) de la table
14 rows selected. EMP sont compris entre le
salaire minimum (LOSAL) et le
salaire maximum (HISAL) de la
table SALGRADE"
©
Extraction d'Enregistrements avec les Non-Equijointures

SQL> SELECT e.ename, e.sal, s.grade


2 FROM emp e, salgrade s
3 WHERE e.sal
4 BETWEEN s.losal AND s.hisal;

ENAME SAL GRADE


---------- --------- ---------
JAMES 950 1
SMITH 800 1
ADAMS 1100 1
...
14 rows selected.

©
Jointures externes
• Lorsqu'une ligne d'une table figurant dans une jointure n'a pas
de correspondant dans les autres tables, elle ne satisfait pas
au critère d'équi-jointure et donc ne figure pas dans le résultat
de la jointure.
• Une option permet de faire figurer dans le résultat les lignes
satisfaisant la condition d'équi-jointure plus celles n'ayant pas
de correspondant.
• Cette option s'obtient en accolant (+) au nom de colonne de la
table dans laquelle manquent des éléments, dans la condition
d'équi-jointure.

13 ©
Jointures externes

• La jointure externe favorise une table appelé dominante


par rapport à l’autre appelé table subordonnée
• Les lignes de la table dominante sont affichées même si
la condition de jointure n’est pas réalisée
• L’opérateur (+) placé après le nom d’une des deux tables
indique la table subordonnée(dans laquelle il manque des
éléments)
SELECT table.column, table.column
FROM table1, table2
WHERE table1.column(+) = table2.column;

SELECT table.column, table.column


FROM table1, table2
WHERE table1.column = table2.column(+);
14 ©
Jointures Externes
EMP DEPT
ENAME DEPTNO DEPTNO DNAME
----- ------ ------ ----------
KING 10 10 ACCOUNTING
BLAKE 30 30 SALES
CLARK 10 10 ACCOUNTING
JONES 20 20 RESEARCH
... ...
A 40 OPERATIONS

Pas d'employés dans le


département OPERATIONS

©
Utilisation des Jointures Externes

SQL> SELECT e.ename, d.deptno, d.dname


2 FROM emp e, dept d
3 WHERE e.deptno(+) = d.deptno
4 ORDER BY e.deptno;

ENAME DEPTNO DNAME


---------- --------- -------------
KING 10 ACCOUNTING
CLARK 10 ACCOUNTING
...
40 OPERATIONS
15 rows selected.

à Le département 40 ne figurait pas dans le résultat du SELECT précédent. Par contre, il


figurera dans le résultat du SELECT suivant.

©
Utilisation des Jointures Externes
• Retrouver les départements n'ayant aucun employé.

SQL> SELECT e.ename, d.dname


2 FROM emp e, dept d
3 WHERE d.deptno= e.deptno(+)
4 AND e.ename IS NULL;

17 ©
Auto-jointure: Liaison d'une Table à Elle-même
ü L’auto-jointure est utilisée lorsqu’on est emmené à comparer
entre les valeurs d’une même colonne d’une même table.
ü Il peut être utile de rassembler des informations venant d'une
ligne d'une table avec des informations venant d'une autre
ligne de la même table.
ü Dans ce cas, il faut impérativement renommer au moins l'une
des deux occurrences de la table (ici emp) en lui donnant un
synonyme, afin de pouvoir préfixer sans ambiguïté chaque
nom de colonne.

©
Auto-jointure: Liaison d'une Table à Elle-même

Donner pour chaque employé le nom de son supérieur hiérarchique.

SQL> SELECT worker.ename||' works for '||manager.ename


2 FROM emp worker, emp manager
3 WHERE worker.mgr = manager.empno;

WORKER.ENAME||'WORKSFOR'||MANAG
-------------------------------
BLAKE works for KING
CLARK works for KING
JONES works for KING
MARTIN works for BLAKE
...
13 rows selected.

©
Résumé

SELECT table.column, table.column


FROM table1, table2
WHERE table1.column1 = table2.column2;

Equijointure Jointure externe

Non-équijointure Autojointure

©
Opérateurs ensemblistes
• On construit deux requêtes dont les résultats ont même arité
(même nombre de colonnes et mêmes types d'attributs), et on
les relie par un des mots-clés UNION, INTERSECT ou EXCEPT.
• L'union s'effectue grâce à UNION.
• L'intersection et la différence s'effectuent respectivement grâce
à INTERSECT et EXCEPT.
Exemple :
Donnez tous les noms de région dans la base.
Requête :
SQL> SELECT region FROM Station
UNION
SELECT region FROM Client ;
21 ©
Opérateurs ensemblistes
• Donnez les régions où l'on trouve à la fois des clients et des
stations.
SQL> SELECT region FROM Station
INTERSECT
SELECT region FROM Client ;
• Quelles sont les régions où l'on trouve des stations mais pas
des clients ?
SQL> SELECT region FROM Station
EXCEPT
SELECT region FROM Client ;

22 ©
Syntaxe SQL99

• CROSS JOIN : retourne un produit cartésien entre 2 tables


• NATURAL JOIN: permet de joindre deux tables selon une colonne qui a le
même nom dans les deux tables
• JOIN table USING column_name : permet d’exécuter une équijointure sur la
même colonne
• JOIN table2 ON (table1.column_name=table2.column_name): permet
d’exécuter une équijointure sur la condition définit au niveau de la clause ON
23 ©
Les jointures SQL99
Il y a plusieurs méthodes pour associer 2 tables ensemble. Voici
la liste des différentes techniques qui sont utilisées :
• INNER JOIN: jointure interne pour retourner les
enregistrements quand la condition est vrai dans les 2 tables.
C’est l’une des jointures les plus communes.
• CROSS JOIN: jointure croisée permettant de faire le produit
cartésien de 2 tables. En d’autres mots, permet de joindre
chaque lignes d’une table avec chaque lignes d’une seconde
table. Attention, le nombre de résultats est en général très
élevé.
• NATURAL JOIN: jointure naturelle entre 2 tables s’il y a au
moins une colonne qui porte le même nom entre les 2 tables
SQL
24 ©
Les jointures SQL99
• LEFT JOIN: (ou LEFT OUTER JOIN) : jointure externe pour
retourner tous les enregistrements de la table de gauche (LEFT
= gauche) même si la condition n’est pas vérifié dans l’autre
table.
• RIGHT JOIN: (ou RIGHT OUTER JOIN) : jointure externe pour
retourner tous les enregistrements de la table de droite (RIGHT
= droite) même si la condition n’est pas vérifié dans l’autre
table.
• FULL JOIN: (ou FULL OUTER JOIN) : jointure externe pour
retourner les résultats quand la condition est vrai dans au
moins une des 2 tables.
• SELF JOIN: permet d’effectuer une jointure d’une table avec
elle-même comme si c’était une autre table.
25 ©
Exemples

26 ©
Sous-Interrogations

© Olfa DRIDI
Définition

• Une Sous-interrogation est un ordre SELECT imbriqué


dans une clause d’un autre ordre SELECT .
• Elles permettent de sélectionner des lignes d’une table
lorsque la condition dépend des données de la table elle-
même .
• Peuvent être placées dans les clauses SQL suivantes :
• WHERE
• HAVING
• FROM

©
Utilisation d'une Sous-Interrogation pour Résoudre un
Problème

• "Qui a un salaire supérieur à celui de Ahmed ?"

Requête principale

"Quel employé a un salaire supérieur à celui


? de Ahmed ?"

sous-interrogation

?
"Quel est le salaire de Ahmed ?"

©
Sous-Interrogations

SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);

• La sous-interrogation (requête interne) est exécutée une fois


avant la requête principale.
• Le résultat de la sous-interrogation est utilisé par la requête
principale (externe).

©
Utilisation d'une Sous-Interrogation
SQL> SELECT ename
2 FROM emp 2975
3 WHERE sal >
4 (SELECT sal
5 FROM emp
6 WHERE empno=7566);

ENAME
----------
KING
FORD
SCOTT

©
Conventions d'Utilisation des Sous-Interrogations
• Placez les sous-interrogations entre parenthèses.
• Placez les sous-interrogations à droite de l'opérateur de
comparaison.
• N'ajoutez jamais de clause ORDER BY à une sous-
interrogation.
• Utilisez les opérateurs mono-ligne avec les sous-interrogations
mono-ligne.
• Utilisez les opérateurs multi-ligne avec les sous-interrogations
multi-ligne.

©
Types de Sous-Interrogations
• Sous-interrogation mono-ligne
Requête principale
Job
ramène
sous-interrogation CLERK (employé)

• Sous-interrogation multi-ligne
Requête principale Job
ramène CLERK (employé)
sous-interrogation
MANAGER (directeur)
• Sous-interrogation multi-colonne
Job Salaire
Requête principale
CLERK 7900
ramène
sous-interrogation MANAGER 7698
©
Sous-Interrogations Mono-ligne
• Ne ramènent qu'une seule ligne
• Utilisent des opérateurs de comparaison mono-ligne

Opérateur Signification
= Egal à
> Supérieur à
>= Supérieur ou égal à
< Inférieur à
<= Inférieur ou égal à
<> Différent de

©
Sous-Interrogations Mono-ligne
Afficher les employés occupant le même poste que l’employé
No. 7369 ?

SELECT ename, job


FROM emp
WHERE job = (SELECT job
FROM emp
WHERE empno=7369 );

©
Exécution de Sous-Interrogations Mono-ligne

SQL> SELECT ename, job


2 FROM emp
3 WHERE job = CLERK
4 (SELECT job
5 FROM emp
6 WHERE empno = 7369)
7 AND sal > 1100
8 (SELECT sal
9 FROM emp
10 WHERE empno = 7876);

ENAME JOB
---------- ---------
MILLER CLERK

©
Utilisation de Fonctions de Groupe dans une Sous-
Interrogation

SQL> SELECT ename, job, sal


800
2 FROM emp
3 WHERE sal =
4 (SELECT MIN(sal)
5 FROM emp);

ENAME JOB SAL


---------- --------- ---------
SMITH CLERK 800

©
Clause HAVING avec Sous-Interrogations
• Oracle Server exécute les sous-interrogations en premier.
• Oracle Server ramène les résultats dans la clause HAVING de
la requête principale.

SQL> SELECT deptno, MIN(sal)


2 FROM emp
3 GROUP BY deptno 800
4 HAVING MIN(sal) >
5 (SELECT MIN(sal)
6 FROM emp
7 WHERE deptno = 20);

©
Exemple
• Trouver le poste ayant le salaire moyen le moins élevé .

SELECT job, AVG(sal)


FROM emp
GROUP BY job
HAVING AVG(sal) = ( SELECT MIN(AVG(sal))
FROM emp
GROUP B job )

©
Qu'est-ce Qui ne Va pas dans cet Ordre ? n e
l i g
tl i-
u
m
SQL> SELECT empno, ename
ti on
2 FROM emp
g a
3 WHERE sal =
r ro
4 (SELECT te
MIN(sal)
n
5 FROM - i
emp
s
6 GROUP BYou deptno);
s
ec
av
ERROR: n e
ig
ORA-01427: single-row -lsub-query returns more than
one row n o
o
r m
no rows selectedu
te
ra
p é
O
©
Sous-Interrogation Multi-ligne

• Ramène plusieurs lignes


• Utilise des opérateurs de comparaison multi-ligne

Opérateur Signification
IN Egal à un élément quelconque de la liste
Renvoie TRUE si la comparaison avec au
moins un des tuples de la sous
ANY
interrogations renvoie TRUE.
Compare la valeur à toutes les valeurs
ALL ramenées par la sous-interrogation

©
Exemple
• Trouver les employés qui gagnent l’équivalent d’un salaire
minimum de département .
SELECT ename, sal, deptno
FROM emp
WHERE sal IN ( SELECT MIN(sal)
FROM emp
GROUP BY deptno )

©
Utilisation de l'Opérateur ANY dans les Sous-
Interrogations Multi-ligne

SQL> SELECT empno, ename, job 1300


2 FROM emp 1100
800
3 WHERE sal < ANY 950
4 (SELECT sal
5 FROM emp
6 WHERE job = 'CLERK')
7 AND job <> 'CLERK';

EMPNO ENAME JOB


--------- ---------- ---------
7654 MARTIN SALESMAN
7521 WARD SALESMAN

©
Utilisation de l'Opérateur ALL dans les Sous-
Interrogations Multi-ligne

SQL> SELECT empno, ename, job 1566.6667


2 FROM emp 2175
2916.6667
3 WHERE sal > ALL
4 (SELECT avg(sal)
5 FROM emp
6 GROUP BY deptno)

EMPNO ENAME JOB


--------- ---------- ---------
7839 KING PRESIDENT
7566 JONES MANAGER
7902 FORD ANALYST
7788 SCOTT ANALYST

©
Résumé
• Les sous-interrogations sont utiles lorsqu'une requête fait
appel à des valeurs inconnues.

SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);

©
Questions??

46 ©
JOIN INNER

Intersection de 2 ensembles
SELECT *
FROM A
INNER JOIN
B ON A.key = B.key

LEFT JOIN

Jointure gauche (LEFT JOINT)


SELECT *
FROM A
LEFT JOIN
B ON A.key = B.key

47 ©
Jointure gauche (LEFT JOINT sans l’intersection B)
SELECT *
FROM A
LEFT JOIN
B ON A.key = B.key
WHERE B.key IS NULL

RIGHT JOIN

Jointure droite (RIGHT JOINT)


SELECT *
FROM A
RIGHT JOIN
B ON A.key = B.key

48 ©
Jointure droite (RIGHT JOINT sans l’intersection A)
SELECT *
FROM A
RIGHT JOIN
B ON A.key = B.key
WHERE B.key IS NULL

49 ©
FULL JOIN

Union de 2 ensembles
SELECT * FROM A FULL JOIN B ON A.key = B.key

FULL JOIN sans intersection

Jointure pleine (FULL JOINT sans intersection)


SELECT * FROM A FULL JOIN B ON A.key = B.key
WHERE A.key IS NULL OR B.key IS NULL

50 ©

Vous aimerez peut-être aussi