Vous êtes sur la page 1sur 12

Université de Sousse

Ecole nationale d’ingénieurs de Sousse

Module : Bases de données réparties Département : Génie informatique appliquée


Chargé du cours : Dr. Ghassen HAMDI Classes : IA-3-1
Chargé des TPs : Dr. Ghassen HAMDI AU : 2022/2023
TP2 : Interroger la base de données (Langage de requêtes)
1. Langage de requêtes structuré SQL
 Select :
Sélecte des lignes et de colonnes à partir d’une ou plusieurs tables.
Syntaxe simplifiée :
Select {col1, col2, …,coln|}
FROM nom-table
[WHERE condition] ; Option
 Sélectionner lignes et/ou colonnes
 Jointure
 Trie
 Utilisé des fonctions standards intégrés
 Traiter des valeurs nulles
 Connecter des n-uplets en structures arborescente (hiérarchique).
Exemples :
Numéros et noms des employés du département 10 ?
Select EMPNO, ENAME FROM EMP WHERE DEPTNO = 10;
Lister toutes les colonnes et toutes les lignes ?
Select * FROM EMP ;
NB. SQL n’élimine pas automatiquement les doubles. Utiliser l’option Distinct.
Opérateurs de Comparaison :
Where peut utiliser les opérateurs :
= ; != ; > ; >= ; < ; <=
Between…And Plage de valeurs
[NOT] | IN Appartient
Like ressemblance ch. Caract
IS NULL valeur indéfinie

1/12
IS NOT NULL présence de valeur
ANY et ALL utilisables pour des comparaisons entre un élément et un ensemble.
Exemples :
Nom, Salaire et Commission des employés ayant une commission excédent le salaire ?
Select ENAME, SAL, COMM FROM EMP WHERE COMM > SAL;
Nom, Salaire des employés ayant un salaire entre 1200 et 1300 ?
Select ENAME, SAL FROM EMP WHERE SAL BETWEEN 1200 AND 1300;
L’opérateur IN compare une valeur à un ensemble de valeurs.
Numéro, NOM et Salaire de tous les employés ‘CLERK’ ou ‘ANALYST’ ?
Select ENAME, JOB, SAL FROM EMP WHERE JOB IN (‘CLERK’, ‘ANALYST’) ;
L’opérateur LIKE :
Comparaison de chaînes de caractères :
Employés dont le nom commence par ‘M’ ?
Select ENAME FROM EMP WHERE ENAME LIKE ‘M%’;
% denote une chaîne pouvant être nulle.
Employés ayant ‘A’ en troisième position dans leurs noms ?
SELECT ENAME FROM EMP WHERE ENAME LIKE ‘--A%’;
Le – denote un caractère unique.
Tri du résultat :
SELECT col1, col8, col5
FROM nom de table
[WHERE expression]
ORDER BY col8, col5 [ASC | DESC]
Ou bien
ORDER BY 2, 3[ASC | DESC]
NB. ORDER BY est toujours la dernière.
Exemple :
Ename, job et salaire de tous les employés. Trier le résultat par job (Alphabétiquement) et par sal en
décroissant.
SELECT ename, job, sal
FROM emp
ORDER BY job, sal DESC;

SELECT ename, job, sal


FROM emp
ORDER BY 2, 3 DESC;

2/12
Jointure de tables :
Combiner des n-uplets issues à partir de deux ou plusieurs tables en vue de retrouver des données associés.
Syntaxe :
Select
From table1, table2
Where prédicat
Exemple :
Localité des départements où travaille l’employé SMITH ?
Select loc
From emp, dept
Where ename = ‘SMITH’
AND emp. Deptno = dept.Deptno ;
Jointure d’une table avec elle-même :
Exemple :
Ename du chef de l’employé ‘AHMED’.
Select e2.ename
From emp e1, emp e2
Where e1.ename = ‘AHMED’
AND e1. mgr = e2.empno;
Opérateur ensembliste :
UNION, INTERSECT, MINUS.
Syntaxe :
Select ….
From ….

{UNION|INTERSECT|MINUS}

Select ….
From ….

{UNION|INTERSECT|MINUS}

Select ….
From …. ;

3/12
Exemple opérateur UNION :
Select empno, ename, sal, comm, deptno
From emp
Where sal < 1500
UNION
Select empno, ename, sal, comm, deptno
From emp
Where comm. is not null;
Exemple opérateur MINUS :
Select deptno
From dept
MINUS
Select deptno
From emp;
Exemple opérateur INTERSECT :
Select empno, ename, sal, comm, deptno
From emp
Where sal < 1500
INTERSECT
Select empno, ename, sal, comm, deptno
From emp
Where comm. is not null;
Requêtes imbriquées :
Les requêtes imbriquées sont des requêtes à l’intérieur d’autres requêtes.
On a 2 types de requêtes imbriquées :
- Requêtes imbriquées simples : la requête interne est indépendante de la requête externe dans le sens où
elle est évaluée une seule fois avant la requête externe qui utilisera ensuite le résultat.
- Requêtes corrélés : la requête interne et la requête externe ont une variable inter-bloc commune de telle
sorte que le SELECT interne doit être évalué plus qu’une fois.
Syntaxe d’une requête imbriquée
Select ….
From table-name
Where (col1, col2, …) opérateur (Select col1, col2 From table-name Where …..);
NB. - Maximum 16 niveaux d’imbrications.
- Sous requête vide  erreur.
4/12
Exemple :
Ename, Sal et Job des employés ayant un salaire > salaire de ‘JONES’ ?
Select Ename, Sal, Job
From emp
Where Sal > (Select Sal From emp Where ename = ‘JONES’);
Sous requête retourne plusieurs colonnes : no_vol qui assure le même trajet que celui du vol V101 mais 2
jours plus tard?
Select no_vol
From vols
WHERE (V_d, V_a, D_d, D_a) =
(SELECT (V_d, V_a, D_d+2, D_a+2)
FROM vols
WHERE no_VOL = ’V101’ ) ;
Sous requête retourne plusieurs lignes :
Syntaxe
SELECT ...
FROM nom de table
WHERE expr NOT IN
(SELECT (...
FROM · · · ) ;

SELECT ...
FROM nom de table
WHERE expr op ANY | ALL
(SELECT ( ...
FROM · · · ) ;
op ∈ { = , <>, < , <= , > , >= }
Pour connaître les vols qui sont assurés par un pilote qui habite à Paris.

SELECT no_VOL FROM vols


WHERE no_PIL IN
(SELECT no_PIL
FROM pilotes
WHERE VILLE = ’Paris’ ) ;
Exemple sous requête corrélées :
Lister chaque employé (ENAME) travaillant dans un département autre que celui de son chef (mgr) ?
Select ENAME
From emp X  nom de corrélation (variable n-uplet)
Where Deptno != (Select Deptno From emp Where X.mgr = empno) AND mgr is not null;
5/12
L’opérateur exists :
Syntaxe
Select …
From...
Where [NOT] EXISTS (Select … FROM where …);
NB. EXISTS n’est pas vide.
NOT EXISTS est vide.
Exemple
Employés travaillant dans des départements où existe au moins un ‘ANALYST’ ?
Select *
From EMP E
Where exists ( Select * From emp Where job = ‘ANALYST’ AND E.Deptno = Deptno);
La clause Group By : divise l’ensemble des lignes d’une table en groupes.
Syntaxe
Select
From
[Where…]
GROUP BY exp ;
Exemple
Nombre d’employé dans chaque fonction ?
Select job, count(*)
From emp
GROUP BY JOB ;
La clause HAVING : Pour demander une condition sur un groupe (construit avec group by).
Syntaxe
Select colonne(s)
From table(s)
GROUP BY exp
HAVING colonne(s)
Exemple
Salaire moyen dans les départements ayant plus que 3 employés ?
Select deptno, AVG (sal)
From emp
GROUP BY deptno HAVING COUNT(*)>3 ;

6/12
Exercice :
Soit une partie du schéma de la base « gestion des employés » suivante :

DEPT(DEPTNO, DNAME, LOC)

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

SALGRADE(# DEPTNO, # EMPNO , GRADE, LOSAL, HISAL)

Le contenu de ces Tables est le suivant :

Tables des employés : EMP

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


7360 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 09-DEC-82 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 12-JAN-83 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
Tables des départements : DEPT

DEPTNO DNAME LOC


10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

Tables des grades de salaire : SALGRADE

GRADE LOSAL HISAL


1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999

Remarque : EMP.EMPNO et EMP.MGR sont définis sur le même domaine sémantique, MGR représente
l’identifiant du séparateur hiérarchique d’un employé.

1- Ecrire les commandes LDD pour créer les tables aves toutes les contraintes d’intégrité.
2- Exprimer les requêtes suivantes en SQL :
Interrogation d’une seule relation
7/12
 Tous les n-uplets de la table DEPT.
 Les noms et les salaires des employés.
 Les professions des employés (après élimination des doublons).
 Les dates d’embauches des analystes.
 ENAME, JOB, COMM, COMM+SAL, en affichant le mot ‘sans’ pour ceux qui n’ont pas de
commission.
 Liste de tous les employés en remplaçant les noms par « **** » dans le département 10.
 Affichage du nom, fonction, salaire des employés sans afficher le salaire des président et
manager (les remplacer respectivement par « *** » et « ### »).

Jointures et imbrications

 Les employés et les noms de leurs départements.


 Les employés ayant le même emploie et la même date de recrutement que « FORD ».
 Les employés ayant le même chef que ‘CLARK’.
 Les employés ayant pour chef direct le ‘Président’.
 Les employés ayant un salaire qui dépasse celui de leurs chefs (noms et salaire de l’employé,
ainsi que le nom et salaire de son chef.
 Les employés travaillent dans le département ‘RESEARCH’ et ayant un grade de salaire = 4.
 Numéros des employés ayant des subordonnés.
 Les employés du département ‘RESEARCH’ recrutés en même temps qu’un employé dans le
département ‘SALES’.

Opérateurs ensemblistes

 Les numéros des départements sans employés.


 Les employés EMPNO, ENAME n’ayant pas de subordonnés.

Tris, Groupes et agrégats

 Nombre d’employés de chaque département.


 Total des salaires des employés qui ont le même supérieur direct que FORD ;
 Nom de l’employé (ou des employés) qui a le plus gros salaire.
 Nom des employés qui ont le plus gros salaire de leur département.
 Totaux des salaires par poste et par département sous la forme suivante :

Poste Dept 10 Dept 20 Dept 30

Secrétaire 100000 20000 150000

Ingénieur 80000 130000 200000

 Liste des numéros de département triés par nombres d’employés.


 Liste des employés, triés par salaire décroissant, avec, pour chaque employé, le nombre
d’employés qui gagnent plus.
 Liste des employés avec, pour chaque employé, son rang dans la hiérarchie des salaires (1 pour
celui qui gagne le plus). Essayez ensuite de faire afficher en plus le salaire de l’employé.
8/12
Correction
Interrogation d’une seule relation

 Tous les n-uplets de la table DEPT.


select * from dept ;
 Les noms et les salaires des employés.
select ename, sal from emp;
 Les professions des employés (après élimination des doublons).
select distinct job from emp;
 Les dates d’embauches des analystes.
select hiredate from emp where job = ‘analyst’;
 ENAME, JOB, COMM, COMM+SAL, en affichant le mot ‘sans’ pour ceux qui n’ont pas de
commission.
select ename, job, NVL (to_char(comm.), ‘sans’) as commission, NVL (comm., 0) + sal as
revenue from emp;
 Liste de tous les employés en remplaçant les noms par « **** » dans le département 10.
select empno, decode (deptno, ‘10’, ‘****’,ename) as ename from emp;
 Affichage du nom, fonction, salaire des employés sans afficher le salaire des président et
manager (les remplacer respectivement par « *** » et « ### »).
select ename, job, decode (job, ‘PRESIDENT’, ‘***’, ‘MANAGER’, ‘###’, sal) as sal from
emp;

NB. La définition de deux fonctions nvl et decode est comme suit :

 Nvl (exp1, exp2) : convertit exp1 susceptible d’être null en une valeur réelle exp2.
Exemple : nvl (grade, ‘aucun’) retourne ‘aucun’ si grade est null.
 Decode (colonne, recherche, resultat [,recherche, resultat] …) : programme un case.

Jointures et imbrications

 Les employés et les noms de leurs départements.


Select ename, dname from emp, dept where emp.deptno = dept.deptno;
 Les employés ayant le même emploie et la même date de recrutement que « FORD ».
Select * from emp where (hiredate,job) in (select hiredate, job from emp where ename =
‘FORD’) and ename <> ‘FORD’;
 Les employés ayant le même chef que ‘CLARK’.
 Select * from emp where mgr in (select mgr from emp where ename = ‘CLARK’) and
ename <> ‘CLARK’;
 Les employés ayant pour chef direct le ‘Président’.
 Select * from emp where mgr = (select empno from emp where job = ‘PRESIDENT’);
 Les employés ayant un salaire qui dépasse celui de leurs chefs (noms et salaire de l’employé,
ainsi que le nom et salaire de son chef.
Select e1.ename, e1.sal, e2.ename, e2.sal from emp e1, emp e2 where (e1.sal> e2.sal and
e1.mgr = e2.empno);
 Les employés travaillent dans le département ‘RESEARCH’ et ayant un grade de salaire = 4.

9/12
Select * from emp, dept, salgrade where emp.deptno = dept.deptno and dname =
‘RESEARCH’ and grade = 4 and sal between losal and hisal;
 Numéros des employés ayant des subordonnés.
Select empno from emp where mgr is not null;
 Les employés du département ‘RESEARCH’ recrutés en même temps qu’un employé dans le
département ‘SALES’.
Select emp.* from emp, dept where emp.deptno = dept.deptno and dname = ‘RESEARCH’
and hiredate in (select hiredate from emp, dept where emp.deptno = dept.deptno and

dname = ‘SALES’); EXCEPT

Opérateurs ensemblistes

 Les numéros des départements sans employés.


Select deptno from dept minus (select deptno from emp);
 Les employés EMPNO, ENAME n’ayant pas de subordonnés.
Select empno, ename from emp minus (select e1.mgr, e2.ename from emp e1, emp e2
where e2.empno = e1.mgr);

Tris, Groupes et agrégats

 Nombre d’employés de chaque département.


Select emp.deptno, count(*) as nbEmp from emp group by emp.deptno;
 Total des salaires des employés qui ont le même supérieur direct que FORD.
Select sum(sal) from emp where mgr = (select mgr from emp where emp.ename = ‘FORD’);
 Nom de l’employé (ou des employés) qui a le plus gros salaire.
Select ename from emp where sal in (select max(sal) from emp);
 Nom des employés qui ont le plus gros salaire de leur département.
Select ename, deptno, sal from emp where (sal,deptno) in (select max(sal), deptno from emp
group by deptno);
 Totaux des salaires par poste et par département sous la forme suivante :

Poste Dept 10 Dept 20 Dept 30


Secrétaire 100000 20000 150000
Ingénieur 80000 130000 200000

Select job, sum(decode(deptno,10,sal,0)) as “Dept10”, sum(decode(deptno,20,sal,0)) as


“Dept20”, sum(decode(deptno,30,sal,0)) as “Dept30” from emp group by job;
 Liste des numéros de département triés par nombres d’employés.
Select deptno, count (*) from emp group by deptno order by count (*);
 Liste des employés, triés par salaire décroissant, avec, pour chaque employé, le nombre
d’employés qui gagnent plus.
Select E.ename, E.sal, count (Eplus.empno) from emp E, emp Eplus where E.sal < Eplus.sal
group by E.ename, E.sal
Union
10/12
Select ename, sal, 0 from emp where sal = (select max(sal) from emp) order by 2 DESC;
 Liste des employés avec, pour chaque employé, son rang dans la hiérarchie des salaires (1 pour
celui qui gagne le plus). Essayez ensuite de faire afficher en plus le salaire de l’employé.

Exercice 2

Soit la base de données relationnelle des vols quotidiens d’une compagnie aérienne qui contient les tables
Avion, Pilote et Vol.

Table Avion (NA : numéro avion de type entier (clé primaire),

Nom : nom avion de type texte (12),

Capacite : capacité avion de type entier,

Localite : ville de localité de l’avion de type texte (10) )

Table Pilote (NP : numéro pilote de type entier,

Nom : nom du pilote de type texte (25),

Adresse : adresse du pilote de type texte (40) )

Table Vol (NV : numéro de vol de type texte (6),

NP : numéro de pilote de type entier,

NA : numéro avion de type entier,

VD : ville de départ de type texte (10),

VA : ville d’arrivée de type texte (10),

HD : heure de départ de type entier,

HA : heure d’arrivée de type entier)

1) Insérer les avions suivants dans la table Avion :


(100, AIRBUS, 300, RABAT), (101, B737,250, CASA), (101, B737,220,RABAT)
2) Afficher tous les avions
3) Afficher tous les avions par ordre croissant sur le nom
4) Afficher les noms et les capacités des avions
5) Afficher les localités des avions sans redondance
6) Afficher les avions dans la localité et Rabat ou Casa
7) Modifier la capacité de l’avion numéro 101, la nouvelle capacité et 220
8) Supprimer les avions dans la capacité et inférieure à 200
9) Afficher la capacité maximale, minimale, moyenne des avions
10) Afficher les données des avions dont la capacité et la plus basse
11) Afficher les données des avions dont la capacité et supérieure à la capacité moyenne
12) Afficher le nom et l’adresse des pilotes assurant les vols IT100 et IT104

11/12
13) Afficher les numéros des pilotes qui sont en service
14) Afficher les numéros des pilotes qui ne sont pas en service
15) Afficher les noms des pilotes qui conduisent un AIRBUS
Correction

1. Insert into avion values (100, 'AIRBUS', 300, 'RABAT'); Insert into avion values (101,'B737',250,'CASA'); Insert into
avion values (101, 'B737',220,'RABAT');

2. select * from avion;

3. select * from avion order by Nom asc;

4. select nom, Capacite from avion;

5. select distinct Localite from avion;

6. select * from avion where Localite='Rabat' or Localite='Casa' ;

7. Update avion set Capacite=220 where NA=101;

8. Delete from avion where Capacite <200;

9. Select Max(Capacite), Min(Capacite), Avg(Capacite) from avion;

10. Select * from avion where Capacite=min(Capacite);

11. Select * from avion where Capacite>=avg(Capacite);

12. Select Nom, Adresse from Pilote, Vol where Pilote.NP= Vol.NP and NV='IT100' and NV='IT104';

13. Select NP from Vol;

14. Select NP from Pilote where NP not in (select NP from Vol);

15. Select Pilote.NOM from Pilote, Vol, Avion where Pilote.NP= Vol.NP and Avion.NA=Vol.NA and
Avion.NOM='AIRBUS';

12/12

Vous aimerez peut-être aussi