Académique Documents
Professionnel Documents
Culture Documents
Connectez-vous à la base de données cdb1 et vérifiez que vous accédez bien aux différentes
tables de l’utilisateur HR décrites dans le fichier Excel qui vous a été envoyé par mail.
Exemple :
select * from HR.employees ;
permet d’accéder à la table des employés.
1
TP1
Question 1 :
Lister tous les jobs en éliminant les doublons :
Question 2 :
Lister le nom et prénom, le job_id, et le salaire des employés du département 20 qui gagnent
plus de 2000:
select first_name, last_name, job_id, salary from employees where department_id=20 and
salary>2000;
Question 3 :
Trouver les employés dont le salaire est entre 1200 et 1400 :
Question 4 :
Trouver les employés qui sont soit ST_MAN soit IT_PROG :
Question 5 :
Trouver les employés dont le nom commence par M:
Question 6 :
Trouver les employés dont le nom comporte 5 caractères et se termine par la lettre N
Question 7 :
Lister les employés qui ne perçoivent pas de commission :
Question 8 :
Lister les employés dans l'ordre croissant des salaires:
2
TP1
select * from employees order by salary asc;
Question 9 :
Lister les employés d’abord dans l’ordre croissant des salaires et puis l’ordre décroissant des noms :
Question 10 :
Listez les employés qui travaillent au Canada:
select * from employees EMP, departments DEP, locations LOC, countries PAYS where
EMP.department_id=dep.department_id and dep.location_id=loc.location_id and
loc.country_id=pays.country_id and pays.country_name='Canada';
Question 11 :
Trouver le nom du département de l'employée Douglas Grant:
Question 12 :
Lister les départements qui n’ont pas encore d’employés:
Question 13 :
Lister les employés dont le salaire (sans la commission) excède celui de leurs managers:
Question 14 :
Trouver tous les employés dont le salaire excède celui d’Alexandre Hunold
3
TP1
Question 15 :
Trouvez les jobs exercés par l’employé Neela Kochhar:
Question 16 :
Trouvez tous les employés exerçant le même job que Bruce Ernst :
Sous-Requête
Question 17:
Trouvez les employés dont le salaire excède le salaire de tous les employés du département 60:
4
TP1
TP N°2 SQL – Oracle Utilisation de fonctions dans SQL
1. Afficher le nom, le job, le salaire, la commission, le total des deux qu’on appellera
« Total Compensation » des employés du département 50 et qui ont une commission
non nulle.
5. Affichez le nom des départements en n’utilisant que les 5 premiers caractères de leur
nom.
7. Affichez les employés travaillant dans le département SALES sans chercher à savoir si
SALES est écrit dans la base de données en majuscule ou en minuscule.
9. Afficher les employés qui ont été embauchés enter le 4 Janvier 1961 et le 15 avril
1981, ordonner le résultat par ordre croissant des dates.
5
TP2
TP N°2 SQL – Oracle Utilisation de fonctions dans SQL
Question 1 :
Afficher le nom, le job, le salaire, la commission, le total des deux qu’on appellera
« Total Compensation » des employés du département 50 et qui ont une commission
non nulle.
Question 2 :
Calculer le salaire journalier des employés du département 80. Afficher le résultat en
3 colonnes séparées de manière à obtenir le résultat : non arrondi, arrondi à l’unité,
et arrondi à 2 chiffres après la virgule. On suppose qu’il y a 22 jours travaillées par
mois.
Question 3 :
Calculer le salaire journalier et le salaire horaire des employés du département 50.
Arrondir le résultat à 1 chiffre après la virgule. On considère qu’il y a 22 jours
travaillés et 8 heures par jour.
Question 4 :
Concaténer le nom du département et le manager_id de la table departments en les
séparant par un tiret précédé et suivi d’un espace.
Question 5 :
Affichez le nom des départements en n’utilisant que les 5 premiers caractères de leur nom.
6
TP2
Question 6 :
Afficher le nom des employés en majuscules puis en minuscules dans la même
requête.
Question 7 :
Affichez les employés travaillant dans le département SALES sans chercher à savoir si
SALES est écrit dans la base de données en majuscule ou en minuscule.
select employee_id
from employees, departments
where employees.department_id= departments.department_id and
upper(department_name)='SALES';
Question 8 :
Afficher le nom, le job, la date d’embauche des employés du département 20.
(format de la date : Vendredi 17 décembre 1998).
Question 9 :
Afficher les employés qui ont été embauchés enter le 4 Janvier 1961 et le 15 avril
1981, ordonner le résultat par ordre croissant des dates.
7
TP2
TP 3 : SQL ORACLE : LES Sous-Requêtes
1. Lister les départements qui n'ont pas encore d'employés. Proposez une solution à base
de sous-requêtes.
2. Trouver tous les employés dont le salaire excède celui d'Alexander Hunold.
3. Trouvez tous les employés exerçant le même job que Bruce Ernst. Utiliser une sous
requête.
4. Trouvez les employés dont le salaire excède le salaire de tous les employés du
département 60.
5. Nom de l'employé le mieux payé
6. Le job le mieux payé (autre que Président).
7. Affichez pour chaque département les jobs non existants.
8. Le job le mieux payé (autre que Président) et le job le moins bien payé.
8
TP2
TP N°3 SQL ORACLE : LES SOUS-REQUÊTES
Question 1 :
Lister les départements qui n'ont pas encore d'employés.
Proposez une solution à base de sous-requêtes.
SOUS-REQUÊTE
Question 2 :
Trouver tous les employés dont le salaire excède celui de Alexander Hunold
select employee_id
from employees
where salary > (select salary from employees where lower(first_name) = 'alexander' and
lower(last_name) = 'hunold');
Question 3 :
Trouver les employés exerçant le même que Bruce Ernst. Utiliser une sous-requête:
Question 4 :
Trouvez les employés dont le salaire excède le salaire de tous les employés du département 60:
select employee_id from employees where salary > all (select salary from employees where
department_id = 60);
Question 5 :
Nom de l’employé le mieux payé :
9
TP3
Question 6 :
Le job le mieux payé autre que le président :
Question 7 :
Affichez pour chaque département les jobs non existants:
Question 7 bis:
select distinct department_id, job_id from departments, jobs minus select department_id,
job_id from employees where department_id is not null;
Question 8 :
Le job le mieux payé(autre que le président) et le job le moins bien payé:
Select * from
(
Select distinct job_title as mieux_paye from jobs, employees
where
salary = (select max(salary) from employees, jobs where employees.job_id = jobs.job_id and
job_title!='President')
and employees.job_id = jobs.job_id
)
,
(Select distinct job_title as moins_paye from jobs, employees
where
salary = (select min(salary) from employees, jobs where employees.job_id = jobs.job_id and
job_title!='President')
and employees.job_id = jobs.job_id
);
`
10
TP3
TP N°4 Requêtes Avancées Group BY
3. Lister les salaires moyens par job en excluant les jobs où il y a moins de 2 employés.
4. Donnez le salaire moyen par département et par job en excluant les petits salaires (<3000)
11
TP4
Question 1 :
Affichez pour chaque département son salaire.
Question 2 :
Affichez pour chaque département son salaire moyen par job
Question 3 :
Lister les salaires moyens par job en excluant les jobs où il y a moins de 2 employés.
Question 4 :
Donnez le salaire moyen par département et par job en excluant les petits salaires (<3000)
12
TP4
Question 5 :
Affichez pour chaque employé le nombre d’employé qu’il gère.
Question 6 :
Nom du département où il y a le plus d’employés
select department_name
from employees, departments
where employees.department_id is not NULL
and employees.department_id=departments.department_id
group by employees.department_id, department_name
having count(*)=(select max(count(*)) from employees where department_id is not NULL
group by employees.department_id);
Question 7 :
Les départements qui possèdent tous les jobs.
Question 8 :
Affichez la moyenne des salaires par intitulé de job.
jobs.job_title, AVG(salary)
SELECT DISTINCT
FROM jobs, employees WHERE jobs.job_id= employees.job_id GROUP BY jobs.job_title ORDER BY
AVG(salary);
13
TP4
Correction avec Group By
SELECT DISTINCTE1.salary
FROM employees E1, employees E2
WHERE E1.salary<=E2.salary
GROUP BY E1.salary
HAVING COUNT(DISTINCT E2.salary)<=4
ORDER BY E1.salary DESC;
14
TP4
TP N°6 en complète autonomie.
Objectifs : Création, MAJ et Interrogation BD
Considérons une application de gestion des projets des équipes de recherche. Soit la
modélisation suivante :
Les attributs en gras représentent des clés primaires. Les attributs précédés du caractère #
représentent des clés étrangères et référencent des attributs de même nom dans une autre
table.
Les tables Chercheur, Projet, et Equipe décrivent respectivement les chercheurs, les projets
et les
équipes de recherche. Un projet est rattaché à une seule équipe via l'attribut codeE dans la
table
Projet. Les participants à un projet peuvent appartenir à des équipes différentes et sont
décrits dans
la table AFF. Une équipe comprend plusieurs chercheurs. Un chercheur n'appartient qu'à
une seule
équipe. Le budget affecté à un projet est exprimé en Kilo Euros et ne doit en aucun cas être
inférieur
à 80. Le contenu des différentes tables vous est fourni en annexe.
Questions :
1. (2 pts) Proposer des requêtes SQL pour la création des différentes tables de la base de
données en tenant compte des différentes contraintes d'intégrité (clés primaires, clés
étrangères, etc.). Pour le type et la taille des attributs, inspirez-vous du contenu des tables
ci-dessous.
2. (1) Proposer une requête SQL pour modifier l'adresse des équipes parisiennes, elles
déménagent sur Lyon.
5. (1pt). Proposez des requêtes dans le bon ordre pour supprimer vos quatre tables.
Equipe Chercheur
codeE nomE adresse codeC nomC codeE
e1 SIG Lyon ch1 Jean e1
e2 SOC Paris ch2 Jacques e2
e3 LRI Paris ch3 Paul e2
ch4 Pierre e3
ch5 François e1
ch6 Mathieu e3
ch7 Jean e2
ch8 Florent e2
ch9 Michel e1
AFF. Projet
16
TP6
Question 1 :
Proposer des requêtes SQL pour la création des différentes tables de la base de
données en tenant compte des différentes contraintes d'intégrité.
Table Equipe
create table Equipe(
codeE VARCHAR2(20),
nomE VARCHAR2(20),
adresse VARCHAR2(20),
CONSTRAINT pk_Equipe primary key(codeE));
Table Chercheur
Create table Chercheur(
codeC VARCHAR2(20),
nomC varchar2(20),
codeE VARCHAR2(20),
CONSTRAINT pk_Chercheur primary key(codeC),
CONSTRAINT fk_codeE_Equipe FOREIGN key(codeE) REFERENCES Equipe(codeE));
Table Projet
create table Projet(
codeP VARCHAR2(20),
nomP VARCHAR2(20),
codeE VARCHAR2(20),
budgetP number,
constraint pk_Projet primary key(codeP),
constraint fk_projetcodeE_Equipe foreign key(codeE) REFERENCES equipe(codeE));
Table AFF
create table AFF(
codeC varchar2(20),
codeP varchar2(20),
constraint pk_AFF PRIMARY key(codeC,codeP),
constraint fk_codeC_Chercheur foreign key(codeC) REFERENCES Chercheur(codeC),
constraint fk_codeP_Projet foreign key(codeP) REFERENCES Projet(codeP));
17
TP6
Insertion des données:
insert into Equipe (codeE, nomE, adresse) VALUES ('e1', 'SIG', 'Lyon');
insert into Equipe (codeE, nomE, adresse) VALUES ('e2', 'SOC', 'Paris');
insert into Equipe (codeE, nomE, adresse) VALUES ('e3', 'LRI', 'Paris');
insert into Chercheur (codeC, nomC, codeE) VALUES ('ch1', 'Jean', 'e1');
insert into Chercheur (codeC, nomC, codeE) VALUES ('ch2', 'Jacques', 'e2');
insert into Chercheur (codeC, nomC, codeE) VALUES ('ch3', 'Paul', 'e2');
insert into Chercheur (codeC, nomC, codeE) VALUES ('ch4', 'Pierre', 'e3');
insert into Chercheur (codeC, nomC, codeE) VALUES ('ch5', 'François', 'e1');
insert into Chercheur (codeC, nomC, codeE) VALUES ('ch6', 'Mathieu', 'e3');
insert into Chercheur (codeC, nomC, codeE) VALUES ('ch7', 'Jean', 'e2');
insert into Chercheur (codeC, nomC, codeE) VALUES ('ch8', 'Florent', 'e2');
insert into Chercheur (codeC, nomC, codeE) VALUES ('ch9', 'Michel', 'e1');
insert into Projet (codeP, nomP,codeE, budgetP) VALUES ('p7', 'VACBI', 'e2', 120);
insert into Projet (codeP, nomP,codeE, budgetP) VALUES ('p5', 'SRI', 'e1', 160);
insert into Projet (codeP, nomP,codeE, budgetP) VALUES ('p1', 'HYPERMEDIA', 'e2', 130);
insert into Projet (codeP, nomP,codeE, budgetP) VALUES ('p4', 'BIG', 'e1', 110);
insert into Projet (codeP, nomP,codeE, budgetP) VALUES ('p6', 'DIABETO', 'e1', 200);
insert into Projet (codeP, nomP,codeE, budgetP) VALUES ('p8', 'QUAERO', 'e2', 500);
insert into Projet (codeP, nomP,codeE, budgetP) VALUES ('p9', 'VORTEX', 'e1', 250);
insert into Projet (codeP, nomP,codeE, budgetP) VALUES ('p2', 'IMAGE', 'e2', 140);
insert into Projet (codeP, nomP,codeE, budgetP) VALUES ('p3', 'VIDEO', 'e1', 100);
18
TP6
Question 2 :
Proposer des requêtes SQL pour la création des différentes tables de la base de
données en tenant compte des différentes contraintes d'intégrité.
Question 3a:
Le nom des chercheurs travaillant sur le projet p5:
Question 3b :
le nom des chercheurs qui ne travaillent que sur le projet "IMAGE".
Question 3c :
Le nombre de projets par chercheur
Question 3d :
Le nom des chercheurs travaillant sur le plus grand nombre de projets.
19
TP6
Question 3e :
Le nom des projets auxquels sont affectés au moins trois chercheurs.
SELECTprojet.nomP, COUNT(codec)
FROM Projet, AFF
WHERE projet.codep=aff.codep
GROUP BY projet.nomP
HAVING COUNT(codec)>=3;
Question 3f
Le nom des équipes ayant au moins un projet avec un budget supérieur à la
moyenne des budgets des projets.
Question 3 g:
Le numéro des chercheurs autre que « ch3 » travaillant sur les mêmes projets
que « ch3 » mais pouvant éventuellement en avoir d'autres.
Question 3 h:
Les codes de projets ne faisant travailler que des chercheurs de la même
20
TP6
Question 3 i :
Le code des 3 projets les plus chers (les 3 plus grandes valeurs de budgetP).
Documentez-vous sur la pseudo-colonne rownum propre au système oracle.
Remarque : mysq| propose l'utilisation de la fonction LIMIT.
select budgetp
from
(select budgetp from projet order by budgetp desc)
where rownum <=3;
Question 4 :
On souhaite maintenant supprimer le contenu de toutes les tables. Proposez, dans le
bon ordre, les requêtes SQL pour vider vos tables.
Question 5:
Proposez des requêtes dans le bon ordre pour supprimer vos quatre tables.
21
TP6