-
Requête 6 :
- Faire le produit cartésien entre EMP et DEPT.
Algèbre : EMP × DEPT
SQL :
SELECT *
FROM EMP, DEPT;
- Requête 7 :
- Donner les noms des employés et les noms de leur département.
Algèbre : piENOM, DNOM (EMP DEPT)
SQL :
SELECT ENOM, DNOM
FROM EMP, DEPT
WHERE EMP.DNO=DEPT.DNO;
- Requête 8 :
- Donner les numéros des employés travaillant à BOSTON.
Algèbre : piENO (EMP sigmaVILLE='BOSTON' (DEPT))
SQL :
SELECT ENO
FROM EMP, DEPT
WHERE EMP.DNO=DEPT.DNO AND VILLE='BOSTON';
- Requête 9 :
- Donner les noms des directeurs des départements 1 et
3. Attention : directeur n'est pas une profession!
Algèbre : piENOM (sigmaDNO=1 \/ DNO=3(DEPT) DIR=ENO EMP)
SQL :
SELECT ENOM
FROM EMP, DEPT
WHERE (DEPT.DNO=1 OR DEPT.DNO=3) AND DIR = ENO;
ou
SELECT ENOM
FROM EMP, DEPT
WHERE DEPT.DNO IN (1,3) AND DIR = ENO;
- Requête 10 :
- Donner les noms des employés travaillant dans un département
avec au moins un ingénieur.
Algèbre :
R1 |
:= |
piDNO(sigmaPROF='INGENIEUR'(EMP)) |
R2 |
:= |
piENOM(EMP R1) |
SQL :
SELECT E2.ENOM
FROM EMP E1, EMP E2
WHERE E1.DNO = E2.DNO
AND E1.PROF = 'INGÉNIEUR';
- Requête 11 :
- Donner le salaire et le nom des employés gagnant plus qu'un
(au moins un) ingénieur.
Algèbre :
R1 |
:= |
rhoSAL/SAL1 (piSAL(sigmaPROF='INGENIEUR'(EMP))) |
R2 |
:= |
piENOM,SAL(EMP SAL>SAL1 R1) |
SQL :
SELECT E1.ENOM, E1.SAL
FROM EMP E1, EMP E2
WHERE E2.PROF='INGENIEUR'
AND E1.SAL > E2.SAL;
ou
SELECT ENOM, SAL FROM EMP
WHERE SAL > ANY (SELECT SAL
FROM EMP
WHERE PROF='INGENIEUR');
- Requête 12 :
- Donner le salaire et le nom des employés gagnant plus que tous les ingénieurs.
SQL :
SELECT ENOM, SAL FROM EMP
WHERE SAL > ALL (SELECT SAL
FROM EMP
WHERE PROF='INGENIEUR');
- Requête 13 :
- Donner les noms des employés et les noms de leurs
directeurs.
Algèbre :
R1 |
:= |
rhoENOM/DIRNOM(piENOM,DNO (EMP ENO=DIR DEPT)) |
R2 |
:= |
piENOM,DNO EMP |
R3 |
:= |
piENOM, DIRNOM(R1 R2) |
-
R1(DIRNOM,DNO) : les départements avec les noms de leur
directeur
- R2(ENOM,DNO) : les employés avec les numéros de leur
département
- R3(ENOM,DIRNOM) : les employés (ENOM) avec les noms de leur directeur
SQL :
SELECT E1.ENOM, E2.ENOM
FROM EMP E1, EMP E2, DEPT D
WHERE E1.DNO=D.DNO AND E2.ENO = D.DIR;
- Requête 14 :
- Trouver les noms des employés ayant le même directeur que
JIM. Attention : un employé peut être directeur de plusieurs
départements.
Algèbre :
R1 |
:= |
piDIR(sigmaENOM = 'JIM' (EMP) DEPT) |
R2 |
:= |
DEPT R1 |
R3 |
:= |
piENOM(sigmaENOM <> 'JIM' (EMP) R2) |
-
R1(DIR) : le numéro du directeur de JIM
- R2(...) : les départements avec le même directeur
- R3(ENOM) : les noms des employés ayant le même directeur
que JIM.
SQL :
SELECT ENOM
FROM EMP
WHERE ENOM <> 'JIM'
AND DNO IN (SELECT D2.DNO
FROM EMP,
DEPT D1, DEPT D2
WHERE ENOM='JIM'
AND D1.DNO = EMP.DNO
AND D1.DIR = D2.DIR);
- Requête 15 :
- Donner le nom et la date d'embauche des employés embauchés
avant leur directeur; donner également le nom et la date d'embauche
de leur directeur.
Algèbre :
R1 |
:= |
piDNO,ENOM,DATEEMB(EMP DIR=ENO DEPT) |
R2 |
:= |
rhoENOM/DIRNOM,DATEEMB/DIRDATE(R1) |
R3 |
:= |
piENOM,DATEEMB,DIRNOM,DIRDATE(sigmaDIRDATE<DATEEMB(EMP R2)) |
-
R1(DNO,ENOM,DATEEMB) : le nom et la date d'embauche du
directeur du dept. DNO.
- R2(DNO,DIRNOM,DIRDATE) : renommage des attributs
- R3(ENOM,DATEEMB,DIRNOM,DIRDATE) : résultat
SQL :
SELECT E1.ENOM, E1.DATEEMB, E2.ENOM, E2.DATEEMB
FROM EMP E1, EMP E2, DEPT D
WHERE E2.ENO=D.DIR
AND E1.DNO=D.DNO
AND E1.DATEEMB<E2.DATEEMB;
- Requête 16 :
- Donner les départements qui n'ont pas d'employés.
Algèbre : DEPT - (DEPT semijoin EMP)
SQL :
SELECT *
FROM DEPT
WHERE DNO NOT IN (SELECT DNO FROM EMP);
- Requête 17 :
- Donner les noms des employés du département COMMERCIAL
embauchés le même jour qu'un employé du département
PRODUCTION.
Algèbre :
R1 |
:= |
piDATEEMB(EMP sigmaDNOM='PRODUCTION'(DEPT)) |
R2 |
:= |
piENOM((EMP sigmaDNOM='COMMERCIAL' DEPT) R1) |
SQL :
SELECT DISTINCT ENOM
FROM EMP E1, DEPT D1, EMP E2, DEPT D2
WHERE E1.DNO=D1.DNO
AND E2.DNO=D2.DNO
AND D1.DNOM='COMMERCIAL'
AND D2.DNOM='PRODUCTION'
AND E1.DATEEMB=E2.DATEEMB
ou
SELECT ENOM
FROM EMP, DEPT
WHERE EMP.DNO=DEPT.DNO
AND DNOM='COMMERCIAL'
AND DATEEMB IN (SELECT DATEEMB
FROM EMP, DEPT
WHERE EMP.DNO=DEPT.DNO
AND DNOM='PRODUCTION');
- Requête 18 :
- Donner les noms des employés embauchés avant tous les
employés du département 1.
Algèbre :
R1 |
:= |
rhoDATEEMB/DATE1(piDATEEMB(sigmaDNO=1(EMP))) |
R2 |
:= |
piENOM(EMP - (EMP semijoinDATEEMB >= DATE1 R1)) |
SQL :
SELECT ENOM
FROM EMP
WHERE DATEEMB < ALL (SELECT DATEEMB
FROM EMP
WHERE DNO=1);
- Requête 19 :
- Donner les noms des employés ayant le même emploi et le
même directeur que JOE.
Algèbre :
R1 |
:= |
piDIR,PROF(sigmaENOM='JOE'(EMP) DEPT) |
R2 |
:= |
piENOM((EMP DEPT) R1) |
-
R1(DIR,PROF): le directeur de Joe et sa profession
- R2(ENOM): résultat
SQL :
SELECT ENOM
FROM EMP, DEPT
WHERE ENOM <> 'JOE'
AND EMP.DNO = DEPT.DNO
AND (PROF, DIR) = (SELECT PROF, DIR
FROM EMP, DEPT
WHERE ENOM='JOE'
AND EMP.DNO = DEPT.DNO);
-
Requête 20 :
- Donner la liste des employés ayant une commission.
SELECT *
FROM EMP
WHERE COMM IS NOT NULL;
- Requête 21 :
- Donner les noms, emplois et salaires des employés par emploi
croissant et, pour chaque emploi, par salaire décroissant.
SELECT ENOM, PROF, SAL
FROM EMP
ORDER BY PROF ASC, SAL DESC;
- Requête 22 :
- Donner le salaire moyen des employés.
SELECT AVG(SAL) AS 'SALAIRE MOYEN'
FROM EMP;
- Requête 23 :
- Donner le nombre d'employés du département PRODUCTION.
SELECT COUNT(EMP.*)
FROM EMP, DEPT
WHERE EMP.DNO = DEPT.DNO
AND DEPT.DNOM = 'PRODUCTION';
- Requête 24 :
- Les numéros de département et leur salaire maximum?
SELECT DNO, MAX(SAL)
FROM EMP
GROUP BY DNO;
- Requête 25 :
- Donner les noms des employés ayant le salaire maximum de
chaque département.
SELECT ENOM
FROM EMP
WHERE (DNO, SAL) IN (SELECT DNO, MAX(SAL)
FROM EMP
GROUP BY DNO);
ou
SELECT ENOM
FROM EMP E
WHERE SAL = (SELECT MAX(SAL)
FROM EMP F
WHERE F.DNO = E.DNO);
- Requête 26 :
- Les professions et leur salaire moyen?
SELECT PROF, AVG(SAL)
FROM EMP
GROUP BY PROF;
- Requête 27 :
- Le salaire moyen le plus bas (par profession)?
SELECT MIN(AVG(SAL))
FROM EMP
GROUP BY PROF;
- Requête 28 :
- Donner les emplois ayant le salaire moyen le plus bas; donnez
aussi leur salaire moyen.
SELECT PROF, AVG(SAL)
FROM EMP
GROUP BY PROF
HAVING AVG(SAL) = (SELECT MIN(AVG(SAL))
FROM EMP
GROUP BY PROF);