Le Langage SQL – Corrigé des exercices
1
Exercice
2
3
Exercice
CREATE TABLE DEPT (
DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
DNAME VARCHAR2(14) ,
LOC VARCHAR2(13) ) ;
CREATE TABLE EMP (
EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT);
4
Exercice
INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES (30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON’);
INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP VALUES (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP VALUES (7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP VALUES (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP VALUES (7788,'SCOTT','ANALYST',7566,to_date('13-07-1987'),3000,NULL,20);
INSERT INTO EMP VALUES (7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP VALUES (7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP VALUES (7876,'ADAMS','CLERK',7788,to_date('13-07-1987'),1100,NULL,20);
INSERT INTO EMP VALUES (7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP VALUES (7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES (7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
5
Exercice
CREATE TABLE DEPT (
DEPTNO NUMERIC(2) CONSTRAINT PK_DEPT PRIMARY KEY,
DNAME VARCHAR(14) ,
LOC VARCHAR(13) ) ;
CREATE TABLE EMP (
EMPNO NUMERIC(4) CONSTRAINT PK_EMP PRIMARY KEY,
ENAME VARCHAR(10),
JOB VARCHAR(9),
MGR NUMERIC(4),
HIREDATE DATE,
SAL NUMERIC(7,2),
COMM NUMERIC(7,2),
DEPTNO NUMERIC(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT);
6
Exercice
INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES (30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON’);
INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,convert(date, '17-12-1980'),800,NULL,20);
INSERT INTO EMP VALUES (7499,'ALLEN','SALESMAN',7698,convert(date,'20-2-1981'),1600,300,30);
INSERT INTO EMP VALUES (7521,'WARD','SALESMAN',7698,convert(date,'22-2-1981'),1250,500,30);
INSERT INTO EMP VALUES (7566,'JONES','MANAGER',7839,convert(date,'2-4-1981',104),2975,NULL,20);
INSERT INTO EMP VALUES (7654,'MARTIN','SALESMAN',7698,convert(DATE,'28-9-1981',104),1250,1400,30);
INSERT INTO EMP VALUES (7698,'BLAKE','MANAGER',7839,CONVERT(DATE,'1-5-1981'),2850,NULL,30);
INSERT INTO EMP VALUES (7782,'CLARK','MANAGER',7839,CONVERT(DATE,'9-6-1981'),2450,NULL,10);
INSERT INTO EMP VALUES (7788,'SCOTT','ANALYST',7566,CONVERT(DATE,'13-07-1987'),3000,NULL,20);
INSERT INTO EMP VALUES (7839,'KING','PRESIDENT',NULL,CONVERT(DATE,'17-11-1981'),5000,NULL,10);
INSERT INTO EMP VALUES (7844,'TURNER','SALESMAN',7698,CONVERT(DATE,'8-9-1981'),1500,0,30);
INSERT INTO EMP VALUES (7876,'ADAMS','CLERK',7788,CONVERT(DATE,'13-07-1987'),1100,NULL,20);
INSERT INTO EMP VALUES (7900,'JAMES','CLERK',7698,CONVERT(DATE,'3-12-1981'),950,NULL,30);
INSERT INTO EMP VALUES (7902,'FORD','ANALYST',7566,CONVERT(DATE,'3-12-1981'),3000,NULL,20);
INSERT INTO EMP VALUES (7934,'MILLER','CLERK',7782,CONVERT(DATE,'23-1-1982'),1300,NULL,10);
7
Exercice
1. Les employés des départements 10 et 30.
2. Les employés qui ont des commissions.
3. Nom et le job des employés dont le nom commence par ‘M’.
4. Numéro et le nom des employés dont le nom est composé de 5 caractères dont le
premier est ‘J’ et le dernier ‘S’.
5. Noms, job et salaire des employés triés par job croissant et par salaire décroissant.
6. Noms, salaires et commissions des employés ayant un salaire inférieur à 2000 triés par
8
Exercice
1. Les employés des départements 10 et 30.
SELECT * FROM EMP WHERE deptno in (10, 30);
2. Les employés qui ont des commissions.
SELECT * FROM EMP WHERE comm is not null;
3. Nom et le ename,
SELECT job des job
employés
FROMdont
EMPleWHERE
nom commence par ‘M’.
ename like 'M%';
4. Numéro et le nom des employés dont le nom est composé de 5 caractères dont le premier est ‘J’ et
leSELECT empno, ename FROM EMP WHERE ename like 'J___S';
dernier ‘S’.
SELECT ename, job, sal FROM EMP ORDER BY job ASC, sal DESC;
5. Noms, job et salaire des employés triés par job croissant et par salaire décroissant.
6. Noms, salaires et commissions des employés ayant un salaire inférieur à 2000 triés par ordre
SELECT ename, sal, comm FROM EMP WHERE sal < 2000 ORDER BY comm ASC;
croissant de commission.
9
Exercice
7. Liste des départements qui n’ont aucun employé.
8. Liste des employés. Pour chaque employé, son nom et celui de son manager.
9. Nom des employés qui ne travaillent pas dans le même département que leur manager.
10. Liste des employés travaillant à "DALLAS"
11. Donner la liste des employés avec le nom de leur manager et la localité dans laquelle ils
travaillent.
10
Exercice
7. Liste des départements qui n’ont aucun employé.
SELECT DEPT.deptno, dname FROM DEPT LEFT JOIN EMP ON DEPT.deptno =
EMP.deptno
WHERE EMP.empno IS NULL;
SELECT deptno, dname FROM dept
MINUS
SELECT Dept.deptno, dname FROM EMP, DEPT WHERE EMP. deptno = DEPT.deptno;
8. Liste des employés. Pour chaque employé, son nom et celui de son manager.
SELECT SUBALTERNE.ENAME, SUPERIEUR.ENAME
FROM EMP SUBALTERNE INNER JOIN EMP SUPERIEUR
ON SUBALTERNE.MGR = SUPERIEUR.EMPNO;
9. Nom des employés qui ne travaillent pas dans le même département que leur manager.
SELECT SUB.ENAME FROM EMP SUB, EMP SUP
WHERE SUB.MGR = SUP.EMPNO AND SUB.DEPTNO <> SUP.DEPTNO;
11
Exercice
10. Liste des employés travaillant à "DALLAS"
SELECT EMP.* FROM EMP JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO
WHERE LOC='DALLAS'
11. Donner la liste des employés (sans le président) avec le nom de leur manager et la localité dans laquelle
ils travaillent.
SELECT E.EMPNO, E.ENAME, Manager.ENAME, D.LOC
FROM EMP E JOIN EMP Manager ON E.MGR = Manager.EMPNO JOIN DEPT D ON
E.DEPTNO = D.DEPTNO;
11-modifié 🡺 Donner la liste de tous les employés avec le nom de leur manager et la localité dans laquelle
ils travaillent.
SELECT E.EMPNO, E.ENAME, Manager.ENAME, D.LOC
FROM EMP E LEFT OUTER JOIN EMP Manager ON E.MGR = Manager.EMPNO JOIN DEPT D ON
E.DEPTNO = D.DEPTNO;
12
Exercice
12. Nombre d’employés par département.
13. Masse salariale et somme des commissions par département.
14. Nombre de fonctions (JOB) différentes.
15. Nombre d’employés et masse salariale par département uniquement pour les départements
ayant un nombre d’employés supérieur à 3.
16. Nom des vendeurs dont la commission est inférieure à 25 % de leur salaire.
17. Nombre d'employés ayant une commission.
18. Salaire moyen par fonction (sans tenir compte des commissions).
19. Total des salaires du département SALES.
20. Nom, fonction et salaire de l'employé qui a le salaire le plus grand.
21. Afficher les managers (MGR) de plus d’une personne
22. Quel est le département ayant le plus d'employés? 13
Exercice
12. Nombre d’employés par département.
SELECT e.deptno, dname , count(*) FROM DEPT d, EMP e
WHERE d.deptno = e.deptno GROUP BY e.deptno, dname;
13. Masse salariale et somme des commissions par département.
SELECT e.deptno, dname , sum(sal) Salaires, sum(nvl(comm, 0)) Commissions
FROM DEPT d, EMP e WHERE d.deptno = e.deptno
GROUP BY e.deptno, dname;
14. Nombre de fonctions (JOB) différentes.
SELECT COUNT(DISTINCT JOB) FROM EMP;
15. Nombre d’employés et masse salariale par département uniquement pour les départements
ayant un nombre
SELECT d’employés
E.DEPTNO, DNAME supérieur à 3.
, COUNT(*) "NBRE EMPLOYÉS", SUM(SAL) SALAIRES
FROM DEPT D JOIN EMP E ON D.DEPTNO = E.DEPTNO
GROUP BY E.DEPTNO, DNAME
HAVING COUNT(*) > 3;
14
Exercice
16. Nom des vendeurs dont la commission est inférieure à 25 % de leur salaire.
SELECT ENAME FROM EMP WHERE COMM < .25 * SAL;
17. Nombre d'employés ayant une commission.
SELECT COUNT(EMPNO) FROM EMP WHERE COMM IS NOT NULL;
18. Salaire
SELECT moyen
JOB,par fonctionFROM
AVG(SAL) (sans tenir
EMPcompte
GROUPdes
BYcommissions).
JOB;
19. SELECT
Total des SUM(SAL) FROM EMP SALES.
salaires du département E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND DNAME = 'SALES';
SELECT ENAME, JOB, SAL
20. Nom, fonction et salaire de l'employé qui a le salaire le plus grand.
FROM EMP WHERE SAL = (SELECT MAX(SAL) FROM EMP); Solution1
SELECT * FROM (
Select EMPNO, JOB, SAL AS Salaire, Rank() OVER (ORDER BY SAL desc) AS Rang FROM EMP)
WHERE rang =1
Solution2 15
Exercice
21. Afficher les managers (MGR) de plus d’une personne
SELECT MGR, COUNT(*) MGR COUNT(*)
FROM EMP 7788 1
GROUP BY MGR
7782 1
HAVING COUNT(*) > 1;
7698 5
MGR COUNT(*) 7566 2
---------------------- ---------------------- 7902 1
7839 3 - 1
7698 5
7839 3
7566 2
22. Quel est le département ayant le plus d'employés?
SELECT DEPTNO, COUNT(*)
FROM EMP
GROUP BY DEPTNO
DEPTNO COUNT(*)
HAVING COUNT(*) = (SELECT MAX(COUNT(*))
FROM EMP 30 6
GROUP BY DEPTNO) ;
16
Exercice
23. Lister les noms et numéros des employés n'ayant pas de subordonnés
SELECT ENAME, EMPNO FROM EMP X WHERE NOT EXISTS (SELECT MGR
FROM EMP WHERE X.EMPNO = MGR)
17
Exercice
24. Liste des départements qui n’ont aucun employé.
25. Nom des employés qui gagnent plus que JONES.
26. Nom des employés qui ont la même fonction que JONES.
27. Nom des employés qui ont le même manager que CLARK.
28. Nom et fonction des employés qui ont la même fonction et le même manager que TURNER.
29. Nom des employés qui ont été embauchés avant tous les employés du département n° 10.
30. Nom et le salaire des employés ayant un salaire supérieur à celui de leur manager.
18
Exercice
24. Liste des départements qui n’ont aucun employé.
SELECT deptno, dname FROM DEPT WHERE deptno not in ( SELECT distinct deptno
FROM EMP);
25. Nom des employés qui gagnent plus que JONES.
SELECT ENAME FROM EMP WHERE SAL > (SELECT SAL FROM EMP WHERE
ENAME='JONES');
26. Nom des employés qui ont la même fonction que JONES.
SELECT ENAME FROM EMP
WHERE JOB = (SELECT JOB FROM EMP WHERE ENAME='JONES’)
AND ENAME <> 'JONES';
27. Nom desENAME
SELECT employésFROM
qui ont
EMPle même manager que CLARK.
WHERE MGR = (SELECT MGR FROM EMP WHERE ENAME='CLARK’)
AND ENAME <> 'CLARK';
19
Exercice
28. Nom et fonction des employés qui ont la même fonction et le même manager que TURNER.
SELECT ENAME FROM EMP WHERE (JOB, MGR) IN (SELECT JOB, MGR FROM
EMP WHERE ENAME = 'TURNER') AND ENAME <> 'TURNER';
29. Nom des employés qui ont été embauchés avant tous les employés du département n° 10.
SELECT ENAME FROM scott.EMP
WHERE HIREDATE < ALL (SELECT HIREDATE FROM EMP WHERE DEPTNO = 10);
30. Nom et salaire des employés ayant un salaire supérieur à celui de leur manager.
SELECT ENAME, SAL FROM EMP E1 WHERE SAL >= (SELECT SAL
FROM EMP E2 WHERE E1.MGR =E2.EMPNO) ORDER BY SAL;
20