Vous êtes sur la page 1sur 12

Corrigé TPs Oracle niveau de base

a) Quels sont les noms des pilotes qui conduisent un Airbus ?


Donnez une solution prédicative et une solution ensembliste.

select distinct plnom


from pilote, avion, vol
where (pilote.plnum = vol.plnum) AND
(vol.avnum = avion.avnum) AND (upper(avnom) like 'A%')

select plnom
from pilote
where plnum in (select plnum from vol where avnum in
(select avnum from avion
where upper(avnom)like 'A%')
);

b) Quels sont les noms des avions avec leurs numéros et leurs localisations
(autre que Nice), ayant une capacité supérieure à 200 avec un tri
décroissant sur le numéro d'avion?

select avnum, avnom, localisation


from avion
where capacite between > 200
order by avnum desc;

c) Quels sont les noms des pilotes qui assurent au moins un vol au départ de
Paris?
Exprimez cette requête de 7 manières différentes.

select plnom
from pilote, avion
where (pilote.plnum=vol.plnum) AND
(upper(villedep) = 'PARIS');

select plnom
from pilote
where plnum in (select plnum
from vol
where upper(villedep) = 'PARIS');

select plnom
from pilote
where plnum = any (select plnum
from vol
where upper(villedep) = 'PARIS');

select plnom
from pilote
where 'PARIS' in ( select upper(villedep)

1
from vol
where pilote.plnum=vol.plnum);

select plnom
from pilote
where 'PARIS' = any ( select upper(villedep)
from vol
where pilote.plnum=vol.plnum);

select plnom
from pilote
where exists (select *
from vol
where (pilote.plnum=vol.plnum) AND
(upper(villedep) = 'PARIS'));

select plnom
from pilote
where 0 < ( select count(*)
from vol
where (pilote.plnum=vol.plnum)
and (upper(villedep) = 'PARIS'));

d) Noms des pilotes dont le salaire est le même que celui de MIRANDA ou de
LAHIRE?
select x.plnom
from pilote x, pilote y
where (x.salaire = y.salaire) AND
(upper(y.plnom) in ('MIRANDA', 'LAHIRE')AND
(upper(x.plnom) not in ('MIRANDA', 'LAHIRE'));

e) Quels sont les noms des avions dont la capacité est supérieure à toutes
les capacités des avions localisées à NICE?
select avnom
from avion
where capacite > (select max(capacite)
from avion
where upper(localisation) = 'NICE');

f) Quels sont les noms des avions dont la capacité est supérieure à la
capacité d'au moins un avion localisé à NICE?
select avnom
from avion
where capacite > (select min(capacite)
from avion
where upper(localisation) = 'NICE');

g) Donnez toutes les paires de pilotes habitant la même ville.

select x.plnom, y.plnom

2
from pilote x, pilote y
where (x.ville = y.ville) and (x.plnom < y.plnom);

h) Quels sont les numéros des pilotes qui conduisent tous les Airbus de la
compagnie?

select plnom
from pilote
where not exists
(select *
from avion
where (upper(avnom) like 'A%') and
not exists (select *
from vol
where (vol.plnum = pilote.plnum)
and (vol.avnum = avion.avnum)));

i) Créez la liste des logins des pilotes construits avec les sept premières
lettres du nom de famille concaténées à l’initiale du prénom.

j) Donnez le nom et prénoms des pilotes et pour ceux qui sont en service le
numéro du vol qu’ils assurent.

select plnom, plprenom from pilote, vol


where pilote.plnum=vol.plnum(+);

k) Quelle est la commande SQL qui permet de créer une table TEMP identique en
intention à PILOTE et telle que son extension est vide.

create table copiePilote


select * from pilote where 1=2 ;

1) MANIPULATION DES DONNEES (LID PARTITIONNEMENT)

m) Modifiez la date de recrutement de l'employé MILLER et la porter à la date


du jour.

update emp set hiredate=sysdate where upper(ename)=’MILLER’;

n) Quelle est la moyenne des commissions ?

select avg(nvl(comm, 0.00)) from emp;

o) Quels sont les noms des employés qui ont été recrutés dans la journée ?

select ename from emp where to_char(hiredate) = to_char(sysdate);

p) Quelles sont les fonctions exercées par les employés qui travaillent dans
un des départements situés à 'CHICAGO' ?

3
select distinct job from emp
where deptno in (select deptno from dept where upper(loc)='CHICAGO');

q) Pour chaque employé travaillant dans un département ayant plus de 3


employés, quels sont son nom, son salaire et sa date d'entrée ?

select empno, salaire, hiredate


from emp
where deptno in ( select deptno
from emp
group by deptno
having count(*) > 3);

r) Rechercher le poste qui présente le salaire moyen le plus faible?

Select job, avg(salaire)


from emp
group by job
having avg(salary) = (select min(avg(salary)
from emp
group by job)

s) Quel est l'employé qui a la plus faible commission non nulle?

select empno
from emp
where comm = ( select min(comm)from emp
where comm is not null and comm>0
);

t) Quels sont les numéros et nom du dernier employé embauché?

select empno, ename, to_char(hiredate, 'MM/YY') "mois"


from emp
where hiredate = (select min(hiredate)from emp);

u) Donner la liste des employés embauchés le même mois et la même année que
l'employé numéro 7844?

select empno, ename


from emp
where empno <> 7844
and trunc(hiredate,'MM') =
(select trunc(hiredate,'MM') from emp where empno=7844);

4
Corrigé TP fournisseurs / Pieces
Gestion des utilisateurs et des privileges

conn system/manager@xepdb1
grant connect, resource to ref identified by ref quota unlimited on
users ;
grant connect, resource to approv identified by approv quota unlimited on
users ;
grant create session, create synonym to user3 identified by user3 ;

conn ref/ref@xepdb1
create table f (
fno varchar2(4) constraint f_pk primary key,
fnom varchar2(10) ,
statut number(2),
ville varchar2(20),
datenais date
);

create table p (
pno varchar(4) constraint p_pk primary key,
pnom varchar2(10) ,
couleur varchar2(10),
poids number(3),
ville varchar2(20)
);

insert into f values ('F1', 'SMITH', 20, 'LONDRES', '11/02/1953');


insert into f values ('F2', 'SALAH', 10, 'TUNIS', '11/02/2019');

insert into p values ('P1', 'ECROU', 'ROUGE', 12, 'LONDRES');


insert into p values ('P2', 'PINCE', 'GRIS', 36, 'NICE');

grant references(fno) on f to approv;


grant references(pno) on p to approv;
grant select on f to user3;
grant select on p to user3;

conn approv/approv@xepdb1

create table fp (
fno varchar2(4),
pno varchar2(4),
qtee number(3),
constraint fp_pk primary key (fno, pno),
constraint fp_f_fk foreign key (fno) references ref.f(fno),
constraint fp_p_fk foreign key (pno) references ref.p(pno));

insert into fp values ('F1', 'P1', 10);


insert into fp values ('F1', 'P2', 30);

5
grant select on fp to user3;

conn user3/user3@xepdb1
create synonym f for ref.f;
create synonym p for ref.p;
create synonym fp for approv.fp;

select count(*) from f ;

select count(*) from approv.fp where pno= 'P2';

select sum(qtee) from fp where pno= 'P2';

select fno
from f
where statut < (select avg(statut) from f);

select fno
from f x
where statut >= (select avg(statut)
from f y
where upper(x.ville)=upper(y.ville));

select fno, pno


from f x , p y
where upper(x.ville)=upper(y.ville));

select x.fno, y.fno


from f x , f y
where (upper(x.ville)=upper(y.ville))
and (x.fno < y.fno);

select pno, sum(qtee)


from fp
group by pno;

select pnom
from fp, p
where fp.pno=p.pno
group by pnom
having(count(fno)>1);

select fnom
from f
where fno in (select distinct fno
from fp
where pno in (select distinct pno
from p
where upper(couleur)=’ROUGE’

6
)
);

select fno
from fp
where pno in (select distinct pno
from fp
where upper(fno)=’F2’
);

select fnom
from fp, f
where fp.fno = f.fno;

select fno
from f
minus
select fno
from fp, f
where fp.fno = f.fno;

7
Corrigé TP Parcours hiérarchique sous Oracle

conn scott/tiger@xepdb1

select LPAD(' ', 2*level) || empno || '--'|| ename "HIERARCHIE"


from emp
connect by PRIOR EMPNO = MGR
start with upper(ename) = 'KING';

HIERARCHIE
--------------------
KING
JONES
SCOTT
ADAMS
FORD
SMITH
BLAKE
ALLEN
WARD
MARTIN
TURNER
JAMES
CLARK
MILLER

--- Les supérieurs hiérarchiques de 'FORD' :

select ename "FORD_SUP"


from emp
connect by EMPNO = PRIOR MGR
start with upper(ename) = 'FORD';

FORD_SUP
-------------------
FORD
JONES
KING

8
--- Les supérieurs hiérarchiques direct de 'FORD' :

select ename "FORD_SUP_DIRECT"


from emp
where level = 2
connect by EMPNO = PRIOR MGR
start with upper(ename) = 'FORD';

FORD_SUP
-------------------
JONES

--- Tous les subordonnés de 'KING' :

select ename "SUB_KING"


from emp
WHERE UPPER(ename) <> 'KING'
connect by PRIOR EMPNO = MGR
start with upper(ename) = 'KING'
order by ename;

SUB_KING
----------
ADAMS
ALLEN
BLAKE
CLARK
FORD
JAMES
JONES
MARTIN
MILLER
SCOTT
SMITH
TURNER
WARD

--- Tous les subordonnés de 'KING' à part 'FORD' :

select ename "SUB_KING"


from emp
where upper(ename) not in ('KING', 'FORD')
connect by PRIOR(EMPNO) = MGR
start with upper(ename) = 'KING'
order by ename;

9
SUB_KING
-------------------
ADAMS
ALLEN
BLAKE
CLARK
JAMES
JONES
MARTIN
MILLER
SCOTT
SMITH
TURNER
WARD

--- Tous les subordonnés de 'KING' à part 'FORD' et ses subordonnés :

Première solution

select ename "SUB_KING"


from emp
connect by PRIOR EMPNO = MGR and upper(ename) <> 'FORD'
start with upper(ename) = 'KING'

Deuxième solution

select ename "SUB_KING"


from emp
where empno not in (select empno
from emp
connect by PRIOR EMPNO = MGR
start with upper(ename) = 'FORD')
connect by PRIOR EMPNO = MGR
start with upper(ename) = 'KING';

SUB_KING
----------
ADAMS
ALLEN
BLAKE
CLARK
JAMES
JONES
KING
MARTIN
MILLER
SCOTT
TURNER
WARD

10
--- Les employés avec la valeur de CONNECT_BY_ISLEAF

SELECT empno, ename, CONNECT_BY_ISLEAF as dirigeant


FROM EMP
CONNECT BY PRIOR EMPNO=MGR
START WITH MGR IS NULL
ORDER BY level;

--- Les employés qui gèrent une équipe

SELECT empno, ename, CONNECT_BY_ISLEAF as dirigeant


FROM EMP
WHERE CONNECT_BY_ISLEAF =0
CONNECT BY PRIOR EMPNO=MGR
START WITH MGR IS NULL
ORDER BY level;

--- Les employés en fin de la hiérarchie

SELECT empno, ename, LEVEL


FROM EMP
WHERE CONNECT_BY_ISLEAF =1
CONNECT BY PRIOR EMPNO=MGR
START WITH MGR IS NULL
ORDER BY level;

---
select empno, ename, connect_by_root ename as Chef
from emp
connect by prior empno = mgr
start with mgr is null;

select empno, ename, connect_by_root ename as Chef


from emp
connect by prior empno = mgr
start with empno=7566;

UPDATE emp SET mgr = 7902 WHERE empno = 7566;

select sys_connect_by_path(rtrim(ename), '/'), CONNECT_BY_ISCYCLE


"Cycle"
from emp
connect by nocycle prior empno = mgr
start with empno=7566

--- salaire total des emploèés de chaque supérieur hiérarchique

11
SELECT name, SUM(sal) "Total_Salary"
FROM ( SELECT CONNECT_BY_ROOT ename as name, Sal
FROM emp
CONNECT BY PRIOR empno = mgr)
GROUP BY name;

--- Salaire total de JONES et de ses subordonnées

SELECT name, SUM(sal) "Total_Salary"


FROM ( SELECT CONNECT_BY_ROOT ename as name, Sal
FROM emp
CONNECT BY PRIOR empno = mgr
start with upper(ename)='FORD')
GROUP BY name;

--- toutes les destinations au départ de Nice :

select CONNECT_BY_ISCYCLE "Cycle", volnum,


substr(SYS_CONNECT_BY_PATH(volnum, '/'), 1, 30)"Path"
from vol
connect by NOCYCLE villedep = PRIOR villearr
start with upper(villedep) = 'NICE';

-- toutes les destinations possibles :

select CONNECT_BY_ISCYCLE "Cycle", volnum,


substr(SYS_CONNECT_BY_PATH(volnum, '/'), 1, 30)"Path"
from vol
connect by NOCYCLE villedep = PRIOR villearr;

12

Vous aimerez peut-être aussi