Académique Documents
Professionnel Documents
Culture Documents
DEPARTEMENT D’INFORMATIQUE
MASTER I INFORMATIQUE(SIR)
Introduction
Le developpement des technologies de l’information et de la communication est
plus qu’une nécéssité dans le monde mais faisant intervenir une gestion cohérente
des données qui interviennent. C’est dans cette optique, il nous a été demandé de
créer une base de données pouvant stisfaire les différentes requêtes . Dans la suite
de notre travail, nous répondrons aux questions posées dans leurs ordre.
Algèbre relationnelle
Exercice 1
Soit le schema relationnel suivant:
EMP(Matr, NomE, Poste, DatEmb, Sup, Salaire, Commission, NumDept)
DEPT(NumDept, NomDept, Lieu)
PROJET(CodeP, NomP)
PARTICIPATION(Matr,CodeP, Fonction)
Requête SQL
1. Matricules et noms des employés qui ont été embauchés avant le 1er janvier
1995
[Matr, NomE]σ(DatEmb <"01/01/1995")EMP
Q
Afin de bien texter nos commandes nous allons d’abord exécuter les commandes
suivantes pour supprimmer les tables créer lors des TD:
DROP TABLE PARTICIPATION;
DROP TABLE PROJET;
DROP TABLE EMP;
DROP TABLE DEPT;
1. Supprimez tous les employés sauf ceux du département 10.Si vous n’y ar-
rivez pas (pourquoi ?), commencez par supprimer les participations aux
projets des employés des départements de numéro différent de 10
DELETE FROM EMP
WHERE NumDept IS NOT 10;
On y arrive pas car il existe une contrainte d’intégrité de reference entre les
tables EMP et PARTICIPATION . En effet il y a des employés qui ne sont
pas dans le departement 10 et qui participent à au moins un projet.
Ainsi pour y arriver nous allons supprimer d’abord tous les employés de ces
departement qui participent à un projet
DELETE FROM EMP
WHERE NumDept!=10
AND Matr IN (SELECT Matr FROM PARTICIPATION);
Puis on relance la suppression des départements
DELETE FROM EMP
WHERE NumDept!=10;
Exercice 5: jointures
1. Affichez le produit cartésien des noms des départements par les lieux.
SELECT A.NomDept, B.Lieu FROM DEPT A, DEPT B;
2. Affichez le produit cartésien des noms des départements par les lieux.
SELECT NomE, Lieu FROM EMP NATURAL JOIN DEPT;
3. Lieu des départements (mais pas les noms des départements) dans lesquels
des employés touchent une commission, en utilisant une jointure.
SELECT Lieu FROM EMP NATURAL JOIN DEPT
WHERE Commission IS NOT NULL;
5. Noms des employés, avec le nom de leur supérieur direct quand ils en ont
un. Même les employés qui n’ont pas de supérieur doivent être affichés.
SELECT e.NomE as EMPLOYE, s.NomE AS SUPERIEUR FROM EMP e LEFT
OUTER JOIN Emp s ON e.sup=s.matr;
6. Nom des employés qui sont le supérieur d’un autre employé.
SELECT DISTINCT s.NomE as SUPERIEUR FROM EMP e, EMP s
WHERE e.Sup=s.Matr;
7. Noms des projets où sont inscrits des employés des dpartements de Tunis.
SELECT NomP FROM EMP NATURAL JOIN PARTICIPATION NATURAL
JOIN PROJET
WHERE NumDept IN (SELECT NumDept FROM DEPT
WHERE Lieu=’Tunis’);
Exercice 1: Sous-interrogations
1. Lieu des départements dans lesquels des employés touchent une commis-
sion, en utilisant cette fois une sous-interrogation et non plus une jointure.
SELECT Lieu FROM DEPT
WHERE NumDept IN (SELECT NumDept FROM EMP
WHERE Commission IS NOT NULL);
2. Noms et lieux des départements dans lesquels il y a au moins un ingénieur.
Pouvez-vous y arriver au moyen d’une jointure ? La réponse est oui:
SELECT NomDept, Lieu FROM EMP NATURAL JOIN DEPT
WHERE Poste=’Ingenieur’;
Pouvez-vous y arriver au moyen d’une sous-interrogation ? La réponse est
oui:
SELECT NomDept, Lieu FROM DEPT
WHERE NumDept IN (SELECT NumDept FROM EMP
WHERE Poste=’Ingenieur’);
3. Noms et lieux des départements dans lesquels il n’y a pas d’ingénieur.
2. Noms des employés qui gagnent plus que tous les commerciaux.
SELECT NomE FROM EMP
WHERE Salaire > ALL (SELECT Salaire FROM EMP
WHERE Poste=’Commercial’);
3. Noms des employés qui gagnent plus que tous les commerciaux de leur dé-
partement.
(a) Donner une solution qui donne le nom des employés qui sont dans
un département qui ná pas de commerciaux(ce qui est une réponse
logiquement valable, n’est-ce pas?
SELECT NomE FROM EMP x
WHERE Salaire> ALL (SELECT Salaire FROM EMP
WHERE Poste=’Commercial’
AND NumDept=x.NumDept)
AND Numdept NOT IN (SELECT NumDept FROM EMP
WHERE Poste=’Commercial’);
Cette solution affiche les employés des départements qui n’ont pas de
commerciaux. C’est logique parce qu’on ne peut trouver de commer-
ciaux dans leur département qui gagnent plus qu’eux.
(b) Donner une solution qui ne donne pas le nom des employés qui sont
dans un département qui n’a pas de commerciaux.
SELECT NomE FROM EMP x
WHERE x.Salaire>(SELECT MAX(Salaire) FROM EMP
WHERE Poste=’Commercial’
AND x.NumDept=EMP.NumDept);
Cette solution n’affiche pas les employés des dṕartements qui n’ont
pas de commerciaux. En effet, max(salaire) est égal à NULL pour les
départements qui n’ont pas de commerciaux et "salaire > null" n’est
jamais vérifié.
4. En utilisant une sous-interrogation à plusieurs colonnes, dressez la liste des
employés ayant le même poste et le même supérieur que Hammami.
SELECT NomE FROM EMP
WHERE (Poste, Sup)=(SELECT Poste, Sup FROM EMP
WHERE NomE=’Hammami’);
Exercice 3: Divisions ?
1. Numéros des départements qui participent à tous les projets (chaque projet
a au moins un employé de ces départements).
SELECT Numdept FROM DEPT
2. Liste des noms des employés qui participent à tous les projet
SELECT NomE FROM EMP e
WHERE NOT EXISTS (SELECT CodeP FROM PROJET
WHERE NOT EXISTS (SELECT NomE,CodeP FROM PARTICIPATION,EMP
WHERE PARTICIPATION.Matr=EMP.Matr
AND NomE=e.NomE
AND CodeP=PROJET.CodeP));
3. Numéro des départements dont tous les employés gagne plus de 700 DT
SELECT NumDept FROM DEPT
WHERE NumDept NOT IN (SELECT NumDept FROM EMP
WHERE Salaire<=700);
Exercice 4: fonctions
1. Pour chaque employé, affichez dans une colonne le plus grand du salaire ou
de la commission.
SELECT NomE, GREATEST(Salaire,NVL(Commission,0)) AS SALAIRE_COMMISSION
FROM EMP;
2. En utilisant la table DUAL (table bidon à une ligne et une colonne), affichez
la date du jour.
SELECT SYSDATE FROM DUAL;
Exercice 6: Regroupements
1. Nombre d’employés de chaque département.
SELECT NumDept Departement, COUNT(*) ’Nombre d’employés’ FROM emp
GROUP BY NumDept
UNION
SELECT Numdept Departement, COUNT(*) ’Nombre d’employés’ FROM dept
WHERE Numdept NOT IN (SELECT Numdept FROM EMP)
2. Total des salaires des employés qui ont le même supérieur direct que Ayachi.
SELECT SUM(Salaire) AS TOTAL FROM EMP
WHERE Sup=(SELECT Sup FROM EMP
WHERE NomE=’Ayachi’);
4. Noms des employés qui ont le plus gros salaire de leur département.
SELECT NomE, Numdept FROM EMP
WHERE (Salaire, Numdept) IN (SELECT MAX(Salaire), Numdept FROM
EMP
GROUP BY Numdept);
Et si l’on veut la liste des trois plus gros salaires de chaque département ?
SELECT NomE, Salaire, Numdept FROM EMP e
WHERE (Salaire, Numdept) IN (SELECT * FROM (SELECT Salaire, Numdept
FROM EMP
GROUP BY Numdept, Salaire
ORDER BY Salaire DESC)
WHERE ROWNUM<=3 AND Numdept=e.NumDept)
ORDER BY Numdept, Salaire DESC;
Exercice 8: Trier
1. Liste des numéros de département triés par nombres d’employés.
SELECT NumDept, count(*) "Total employÃ
s"c FROM EMP
GROUP BY NumDept
ORDER BY "Total employés";
2. Liste des employés avec, pour chaque employé, son rang dans la hiérarchie
des salaires (1 pour celui qui gagne le plus).
SELECT e.NomE as EMPLOYE, COUNT(*) "Nb gagnent plus" FROM EMP e,
EMP e1
WHERE e1.salaire > e.salaire
GROUP BY e.NomE
UNION
SELECT NomE, 0 FROM emp
WHERE salaire=(SELECT MAX(salaire) FROM EMP)
ORDER BY 2;
3. Liste des employés, triés par salaire décroissant, avec, pour chaque employé,
le nombre d’employés qui gagnent plus.
SELECT e.NomE as EMPLOYE, count(*) "EMPLOYE gagnent plus" FROM
EMP e, EMP eplus
WHERE eplus.salaire < e.salaire(+)
GROUP BY e.NomE
UNION
SELECT nome, 0 FROM emp
WHERE salaire=(SELECT MAX(salaire) FROM EMP)
ORDER BY 2;
Essayez ensuite de faire afficher en plus le salaire de l’employé.
Est-ce que vous pouvez en déduire une méthode pour résoudre les questions
de l’exercice 3 qui portent sur les 3 plus gros salaires ?
SELECT e.NomE, COUNT(e1.NomE)+1 Rang FROM EMP e, EMP e1
WHERE e.salaire<e1.salaire(+)
GROUP BY e.NomE, e.Salaire
HAVING e.salaire IN (SELECT * FROM (SELECT DISTINCT salaire FROM
EMP
ORDER BY salaire DESC)
WHERE ROWNUM<=3)
ORDER BY 2;
2. Liste des numéros de départements dont tous les employés touchent une
commission.
SELECT NumDept FROM EMP
WHERE NumDept NOT IN (SELECT NumDept FROM EMP
WHERE NVL(Commission,0)=0)
GROUP BY Numdept;
Conclusion
Au terme du travail sur ce projet, nous sortons enrichis en bases de données. En
effet avec les testes de nos requêtes nous avons eu le nécéssaire sur l’écriture et
la manupilation en SQL. Cependant notre travail n’a pas la prétention d’avoir
cerné tous les contours de manupilation. Nous espérons que d’autre travaux nous
permettons de voir ce qui nous a été échappé.