Vous êtes sur la page 1sur 14

UNIVERSITE OUAGA I Pr JOSEPH KI-ZERBO

UNITÉ DE FORMATION ET DE RECHERCHE


EN SCIENCES EXACTE ET APPLIQUÉE
UFR-SEA

DEPARTEMENT D’INFORMATIQUE

PROJET DE BASE DE DONNÉES

MASTER I INFORMATIQUE(SIR)

PRESENTÉ PAR: Enseignant :


DABIRÉ Namwinwelbère Dr TIENDREBEOGO
HIÉ Diakalia Telesphore

Mai- Juin 2017


Projet de Base de Données 2017

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

2. Nom des employés qui ont le poste Secrétaire


Q
[NomE]σ(Poste="Secrétaire")EMP
3. Noms des employés avec le nom du département où ils travaillent
Q
[NomE, NomDept](EMP./DEPT)
4. Noms des employés qui travaillent dans le département FINANCE
Q
[NomE]σ(NomDept="FINANCE")(EMP./ Dept)
5. Numéro de département qui ont des Ingénieurs
Q
[NumDept]σ(Poste="Ingénieur")EMP
6. Noms des employés qui gagnent plus que leur supérieur.
Q
[e1.NomE]σ(e1.Salaire>e2.Salaire)(e1 EMP./(e1.S up=e2.Matr) e2 EMP)
7. Matricules des employés qui participent à tous les projets.
Q Q
[Matr,CodeP](EMP./PARTICIPATION)÷ [CodeP]PROJET
8. Noms des employés qui participent à tous les projets.
Q Q
[NomE,CodeP](EMP./PARTICIPATION)÷ [CodeP]PROJET
9. Numéros des départements qui participent à tous les projets.
Q Q
[NumDept,CodeP](DEPT./PARTICIPATION)÷ [CodeP]PROJET
10. Noms de départements qui ont tous les postes.
Q Q
[NomDept,CodeP](DEPT./PARTICIPATION)÷ [CodeP]PROJET

Dabire Namwinwelbère et Hié Diakalia 1 Projet de Base de Données 2017


Projet de Base de Données 2017

11. Noms des employés qui ne participent à aucun projet.


Q Q
[NomE]EMP- [NomE](EMP./PARTICIPATION)
12. Noms des départements qui ont des ingénieurs et des secrétaires.
Q
[NumDept](Poste="ingenieur"∨Poste="secretaire")(EMP./DEPT)

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;

Exercice 2: Création des tables


Au niveau de cet exercice nous allons donner les requêtes pour la définition des
différents relations/tables de l’exercice 1

• Création de la table DEPT


CREATE TABLE DEPT(
NumDept NUMBER(3),
NomDept VARCHAR(15) NOT NULL,
Lieu VARCHAR(15),
CONSTRAINT pk_departement PRIMARY KEY (NumDept)
);
• Création de la table PROJET
CREATE TABLE PROJET(
CodeP NUMBER(4),
NomP VARCHAR(15) NOT NULL,
CONSTRAINT pk_projet PRIMARY KEY (CodeP)
);
• Création de la table EMP
CREATE TABLE EMP(
Matr NUMBER(4),
NomE VARCHAR(15) NOT NULL,
Poste VARCHAR(15),
DatEmb DATE,
Sup NUMBER(4),
Salaire NUMBER(10,2),
Commission NUMBER(10,2),
NumDept NUMBER(4) CONSTRAINT fk_emp_numdept REFERENCES DEPT(NumDept),
CONSTRAINT pk_employe PRIMARY KEY (Matr),
CONSTRAINT sup_emp FOREIGN KEY (Sup) REFERENCES EMP(Matr),
CONSTRAINT emp_sup CHECK(Sup!=Matr)
);

Dabire Namwinwelbère et Hié Diakalia 2 Projet de Base de Données 2017


Projet de Base de Données 2017

• Création de la table PARTICIPATION


CREATE TABLE PARTICIPATION(
Matr NUMBER(4) CONSTRAINT fk_part_matr REFERENCES EMP(Matr),
CodeP NUMBER(4) CONSTRAINT fk_part_codep REFERENCES PROJET(CodeP),
Fonction VARCHAR(15),
CONSTRAINT pk_part_matr_codep PRIMARY KEY (Matr, CodeP)
);
NB: Pour pouvoir visualiser les résultats des requêtes, nous avons inseré des
données dans les tables ci-dessus .

Exercice 3: Quelques interrogations simples


1. Sélectionner toutes les colonnes de toutes les rangées dela table EMP.
SELECT * FROM EMP;
2. Afficher la liste des matricules.
SELECT Matr FROM EMP;
3. Afficher les noms des employés du département 20.
SELECT NomE FROM EMP
WHERE NumDept=20;
4. Trouver le poste des employés dont le salaire est supérieur à 1300 DT.
SELECT Poste FROM EMP
WHERE Salaire > 1300;
5. Afficher le nom des commerciaux, et la somme totale perçue (salaire + com-
mission).
SELECT NomE, salaire + NVL(Commission,0) as TOTAL FROM EMP
WHERE Poste=’Commercial’;

Exercice 4: interrogations sur une seule table


1. Liste des divers postes, en n’affichant chaque poste qu’une seule fois.
SELECT DISTINCT Poste FROM EMP;
2. On considèrera qu’une commission NULL correspond à un employé qui ne
touche aucune commission (donc commission = 0).
Noms des employés dont le salaire est inférieur à la commission.
SELECT NomE FROM EMP
WHERE Salaire>NVL(Commission,0);
Noms des employés dont le salaire est supérieur à la commission.
SELECT NomE FROM EMP
WHERE Salaire<NVL(Commission,0);
3. Noms des employés qui ne touchent pas de commission.
SELECT NomE FROM EMP
WHERE Commission IS NULL;
4. Noms des employés dont la 2me lettre est un E.
SELECT NomE FROM EMP
WHERE NomE LIKE ’_E%’;

Dabire Namwinwelbère et Hié Diakalia 3 Projet de Base de Données 2017


Projet de Base de Données 2017

5. Numéros de département dont au moins un employé touche une commis-


sion.
SELECT NumDept FROM EMP NATURAL JOIN DEPT
WHERE Commission IS NOT NULL;

6. Noms des employés qui touchent entre 600 DT et 1000 DT


SELECT NomE FROM EMP
WHERE Salaire BETWEEN 600 AND 1000;

Exercice 1: Modification des données


1. Créer un nouveau département : 50, COMPTABILITE, TUNIS
INSERT INTO DEPT
VALUES(50,’COMPTABILTE’,’TUNIS’);
2. Créer un nouveau département : 60, DIRECTION
INSERT INTO DEPT(NumDept,NomDept)
VALUES(60,’DIRECTION’);

3. Dupliquer l’enregistrement du département 20, en lui donnant le numéro


de département 25 (en utilisant un select pour récupérer les informations
sur le département 20).
INSERT INTO DEPT
SELECT 25,NomDept, Lieu FROM DEPT
WHERE NumDept=20;

4. Le département 60 s’est maintenant établi dans la ville de MONASTIR.


Enregistrer le fait dans la table DEPT.
UPDATE DEPT
SET Lieu =’MONASTIR’
WHERE NumDept=60;

5. Promouvoir Mr. Ayachi au poste de PDG, dans le département 60.


UPDATE EMP
SET Poste=’PDG’,
NumDept=60
WHERE NomE=’Ayachi’;

6. Éliminer de la table EMP la ligne de Mr. Ayadi qui prend sa retraite.


DELETE FROM EMP
WHERE NomE=’Ayadi’;
7. Augmenter de 10% le salaire de tous les employés du département 10.
UPDATE EMP
SET Salaire= Salaire*1.10
WHERE NumDept=10;
8. Mr. Hammanmi vient d’être embauché comme commercial au salaire de
1000 DT. L’enregistrer sous le matricule 7910 dans le département 30.
INSERT INTO EMP (Matr,NomE,Poste,DatEmb,Salaire,NumDept)
VALUES(’7910’,’Hammami’,’Commercial’,sysdate,1000,30);

Dabire Namwinwelbère et Hié Diakalia 4 Projet de Base de Données 2017


Projet de Base de Données 2017

Exercice 2: Modification un peu plus compliquées


Les enregistrements des projets SPORTS et QUALITE vont se faire comme suite:
INSERT INTO PROJET
VALUES(10,’SPORTS’);
INSERT INTO PROJET
VALUES (11,’QUALITE’);

1. Enregistrez les participations suivantes aux projets :


(a) Au projet SPORTS (vous supposerez que vous connaissez les matricules
et le code du projet SPORTS) : Ayadi, Hammami
INSERT INTO PARTICIPATION(Matr,CodeP)
VALUES(7909,10);
INSERT INTO PARTICIPATION(Matr,CodeP)
VALUES(7910,10);
(b) Au projet QUALITE (sans connaître ni les matricules des employés,
ni le code du projet SPORTS) : Ben Arab, Hammami
INSERT INTO PARTICIPATION(Matr,CodeP)
SELECT Matr,CodeP FROM EMP,PROJET
WHERE NomP=’QUALITE’ AND NomE IN =’Ben Arab’;
Et
INSERT INTO PARTICIPATION(Matr,CodeP) SELECT Matr,CodeP
FROM EMP,PROJET WHERE NomE=’Hammami’AND
NomP=’QUALITE’;
2. Enregistrez les nominations de
Il s’agit d’une mise à jour des transactions réaliser en 1, et pour cela nous aurons
les requêtes suivants:
(a) Ayadi comme chef du projet SPORTS,
UPDATE PARTICIPATION
SET Fonction=’Chef’
WHERE CodeP=(SELECT CodeP FROM PROJET
WHERE NomP=’Sport’)
AND Matr=(SELECT Matr FROM EMP
WHERE NomE=’Ayadi’);
(b) Hammami comme trésorier.
UPDATE PARTICIPATION
SET Fonction=’Tresorier’
WHERE CodeP IN (SELECT CodeP FROM PROJET
WHERE NomP=’Sport’ OR NomP=’Qualite’)
AND Matr=(SELECT Matr FROM EMP
WHERE NomE=’Hammami’);
3. Les départements de SFAX sont supprimés et leurs employés sont réaffectés
au département 40. Mettre à jour les tables DEPT et EMP.
UPDATE EMP
SET NumDept=40
WHERE NumDept IN (SELECT NumDept FROM DEPT
WHERE Lieu=’SFAX’);

Dabire Namwinwelbère et Hié Diakalia 5 Projet de Base de Données 2017


Projet de Base de Données 2017

DELETE FROM DEPT


WHERE Lieu=’SFAX’;

Exercice 3: Transactions et contraintes


Comme il est question de faire une nouvelle transaction nous aurons la requête
suivante:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

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;

2. Affichez nom, poste, département, salaire, commission pour tout le person-


nel. Conservez votre requête dans un fichier emp.sql .
SELECT NomE, Poste, NumDept, Salaire, Commission FROM EMP;
SAVE emp.sql;
3. Annulez la transaction en cours. Récupérez la requête conservée dans le
fichier emp.sql et relancez la.
ROLLBACK
GET emp.sql;
RUN;

Exercice 4: contraintes d’intégrité


1. Essayez de supprimer le département 10. Expliquez ce qui sepasse.
DELETE FROM DEPT
WHERE NumDept=10;
La suppression à échouer car il est en relation avec d’autre tables qui ont
des enregistrement ou le département 10 est reférencié, cela donne le code
d’erreur suivant:
ERREUR à la ligne 1 :
ORA-02292: violation de contrainte (DOMI.FK1) d’intégrité - enregistrement
fils existant.

Dabire Namwinwelbère et Hié Diakalia 6 Projet de Base de Données 2017


Projet de Base de Données 2017

2. Modifiez la définition des tables pour que la suppression du département 10


soit autorisée et entraine automatiquement la suppression des employés de
ce département.
Dans la création de la table EMP, l’attribut NumDept est une clé etrangère
referenciée dans la table DEPT dont le nom de la contrainte est fk_emp_numdept,
et l’attribut Sup est referencié par l’attribut Matr da la même table EMP
dont le nom de la contrainte est sup_emp.
SUPPRESSION DES CONTRAINTES
ALTER TABLE EMP
DROP CONSTRAINT fk_employe;
ALTER TABLE EMP
DROP CONSTRAINT sup_emp;
MODIFICATION DE LA CONTRAINTE POUR PERMETTRE LA SUP-
PRESSION:

ALTER TABLE EMP


MODIFY NumDept CONSTRAINT fk_employe REFERENCES DEPT(NumDept)
ON DELETE CASCADE;
3. Supprimez le département 10 et vérifiez ce qui séstpassé pour les employés
du département 10.
DELETE FROM DEPT
WHERE NumDept=10;On constate que les employés qui étaient affecté au
département 10 on été supprimé.
4. Annulez la transaction et changez les définitions des contraintes pour que le
comportement soit le même qu’au début de l’exercice.
Initialiser les contraintes:
ALTER TABLE EMP
DROP CONSTRAINT fk_employe;
ALTER TABLE EMP
MODIFY NumDept CONSTRAINT fk_employe REFERENCES DEPT(NumDept);
ALTER TABLE EMP
MODIFY Sup CONSTRAINT sup_emp REFERENCES EMP(Matr);
ANNULATION DES TRANSACTIONS:
ROLLBACK;

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;

Dabire Namwinwelbère et Hié Diakalia 7 Projet de Base de Données 2017


Projet de Base de Données 2017

4. Noms des supérieurs directs de chaque employé qui a un supérieur (nom


des employés qui ont un supérieur, suivi du nom du supérieur).
SELECT e.NomE AS EMPLOYE, s.NomE AS SUPERIEUR FROM emp e IN-
NER JOIN emp s ON S.Matr=e.SUP

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.

4. Pouvez-vous y arriver au moyen d’une jointure ? La réponse est non:


puisque la jointure fera le produit cartésien de la table EMP avec la table DEPT
puis sélectionnera les ligne où le Numdept est le même et donc si une condition
sur le poste venait à être posé alors les lignes qui respect cette condition seront
retenues.
Pouvez-vous y arriver au moyen d’une sous-interrogation ? La reponse est
oui:
SELECT NomDept, Lieu FROM DEPT
WHERE NumDept NOT IN (SELECT NumDept FROM EMP
WHERE Poste=’Ingenieur’);

Dabire Namwinwelbère et Hié Diakalia 8 Projet de Base de Données 2017


Projet de Base de Données 2017

Exercice 2: Sous-interrogations avancées


1. A l’aide d’une sous-interrogation synchronisée, dressez la liste des employés
qui gagnent moins de 50% du salaire de leur supérieur direct.
SELECT NomE FROM EMP e
WHERE salaire<0.5*(SELECT salaire FROM EMP
WHERE e.Sup=matr);

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

Dabire Namwinwelbère et Hié Diakalia 9 Projet de Base de Données 2017


Projet de Base de Données 2017

WHERE NOT EXISTS (SELECT CodeP FROM PROJET


WHERE NOT EXISTS (SELECT NumDept,CodeP FROM PARTICIPATION,EMP
WHERE PARTICIPATION.Matr=EMP.Matr
AND Numdept=DEPT.NumDept
AND CodeP=PROJET.CodeP));

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 5: Mettons un peu d’ordre!


En une seule requête, liste des employés, présentés selon cet ordre (vous pourrez
utiliser la fonction decode) :

• d’abord les directeurs par ordre alphabétique,


• puis les autres employés par date d’embauche la plus récente.
SELECT NomE FROM EMP
ORDER BY DECODE(RTRIM(Poste), ’Directeur’,’1’||NomE,’2’), DatEmb desc;

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)

Dabire Namwinwelbère et Hié Diakalia 10 Projet de Base de Données 2017


Projet de Base de Données 2017

ORDER BY Nombre d’employés;

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

3. Nom de l’employé qui a le plus gros salaire.


SELECT NomE, Salaire FROM EMP
WHERE Salaire =(SELECT MAX(Salaire) FROM EMP);
Et si l’on veut les noms des employés qui ont les trois plus gros salaires (avec
leur salaire) ?
SELECT NomE, Salaire FROM EMP
WHERE Salaire IN (SELECT * FROM (SELECT Salaire FROM EMP
GROUP BY Salaire
ORDER BY Salaire DESC)
WHERE ROWNUM<=3)
ORDER BY Salaire DESC;

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 7:Toujours plus


1. Liste des numéros des départements qui ont plus d’employés que le départe-
ment 10.
SELECT Numdept FROM EMP
GROUP BY NumDept
HAVING count(*)> (SELECT count(*) FROM EMP
WHERE Numdept=10);
2. Trouver le nom du (ou des) département(s) qui a le plus d’employés.
SELECT NomDept FROM DEPT
WHERE NumDept IN (SELECT NumDept FROM EMP
GROUP BY NumDept

Dabire Namwinwelbère et Hié Diakalia 11 Projet de Base de Données 2017


Projet de Base de Données 2017

HAVING count(*) IN (SELECT MAX(COUNT(*)) FROM EMP


GROUP BY NumDept));

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;

Exercice 9: Quelques compléments


1. Liste des noms d’employés dont la 3me lettre n’est ni un R ni un E ni un A.
SELECT NomE FROM emp
WHERE SUBSTR(NomE,3,1) NOT IN (’R’,’r’,’E’,’e’,’A’,’a’);

Dabire Namwinwelbère et Hié Diakalia 12 Projet de Base de Données 2017


Projet de Base de Données 2017

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;

3. Dessinez l’histogramme des salaires : pour chaque employé, on dessinera


horizontalement un nombre de ’*’ proportionnel à la valeur du salaire(vous
pourrez utiliser les fonctions LPAD et ROUND ).
SELECT NomE, LPAD(’ ’,ROUND(Salaire*5/100000)+1,’*’) Hist FROM EMP;
4. Utilisez une intersection pour trouver les numéros des départements qui ont
à la fois des secrétaires et des ingénieurs(attribut poste).
SELECT NumDept FROM EMP WHERE Poste=’Secretaire’ INTERSECT SE-
LECT NumDept FROM EMP WHERE Poste=’Ingenieur’;

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é.

Dabire Namwinwelbère et Hié Diakalia 13 Projet de Base de Données 2017