Précédent Remonter Suivant

Chapitre 3  Algèbre - SQL: Employés - Départements

3.1  Schéma

Les exemples suivants sont tirés des sources de la société Oracle.

3.1.1  Relation des Employés (EMP)

EMP(ENO, ENOM, PROF, DATEEMB, SAL, COMM, DNO)
ENO :
numéro d'employé, clé
ENOM :
nom de l'employé
PROF :
profession (directeur n'est pas une profession)
DATEEMB :
date d'embauche
SAL :
salaire
COMM :
commission (un employé peut ne pas avoir de commission)
DNO :
numéro de département auquel appartient l'employé

3.1.2  Relation des Départements (DEPT)

DEPT(DNO, DNOM, DIR, VILLE)
DNO :
numéro de département, clé
DNOM :
nom du département
DIR :
directeur du département
VILLE :
lieu du département (ville)

3.2  Opérations Algébriques

Soit l'exemple suivant :

EMP
ENO ENOM PROF DATEEMB SAL COMM DNO
10 Joe Ingénieur 1.10.93 4000 3000 3
20 Jack Technicien 1.5.88 3000 2000 2
30 Jim Vendeur 1.3.80 5000 5000 1
40 Lucy Ingénieur 1.3.80 5000 5000 3




DEPT
DNO DNOM DIR VILLE
1 Commercial 30 New York
2 Production 20 Houston
3 Développement 40 Boston
Exercice A :
Calculer sigmasal<5000 (EMP).
ENO ENOM PROF DATEEMB SAL COMM DNO
10 Joe Ingénieur 1.10.93 4000 3000 3
20 Jack Technicien 1.5.88 3000 2000 2


Exercice B :
Calculer EMPbis = rhoENO/ENO'(piENO, COMM(EMP))
EMPbis
ENO' COMM
10 3000
20 2000
30 5000
40 5000


Exercice C :
Calculer piENO,SAL(EMP) SAL=COMM(EMPbis)
ENO SAL ENO' COMM'
20 3000 10 3000
30 5000 30 5000
40 5000 40 5000
30 5000 40 5000
40 5000 30 5000
Exercice D :
Exprimer par une phrase ce qu'on obtient en évaluant les requêtes précédentes.
Exercice E :
Quelle est l'expression de l'algèbre relationnelle qui permettrait d'obtenir le nom et la profession de l'employé de numéro 10.
piENOM, PROF(sigmaENO=10(EMP))
Exercice F :
Idem pour la liste des noms des employés qui travaillent à New York.
piENOM(EMP (sigmaVILLE='New York'(DEPT)))
Exercice G :
Idem pour avoir le nom du directeur du département ``Commercial''.
piENOM(EMP ENO=DIR piDIR(sigmaDNOM='Commercial'(DEPT)))

3.3  Requêtes

3.3.1  Interrogation d'une seule Relation

Requête 1 :
Donner tous les n-uplets de DEPT. Algèbre : DEPT

SQL :
 
      SELECT * FROM DEPT;


Requête 2 :
Donner tous les n-uplets de EMP. Algèbre : EMP

SQL :
     SELECT * FROM EMP;


Requête 3 :
Donner les noms et les salaires des employés. Algèbre : piENOM, SAL (EMP)

SQL :
     SELECT ENOM, SAL 
       FROM EMP; 


Requête 4 :
Donner les professions des employés (après élimination des duplicats). Algèbre : piPROF (EMP)

SQL :
     SELECT DISTINCT PROF 
       FROM EMP;


Requête 5 :
Donner les dates d'embauche des techniciens. Algèbre : piDATEEMB (sigmaPROF='TECHNICIEN' (EMP))

SQL :
     SELECT DATEEMB 
       FROM EMP 
      WHERE PROF='TECHNICIEN';
      

3.3.2  Jointures

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)
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)
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))
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)
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);

3.3.3  Valeurs Nulles, Tris, Groupes, Agrégats et Expressions

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);

Précédent Remonter Suivant