Vous êtes sur la page 1sur 21

TP N°1 SQL – Oracle

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.

Répondre en SQL aux différentes requêtes suivantes :

1. Lister tous les jobs en éliminant les doublons


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.
3. Trouver les employés dont le salaire est entre 1200 et 1400.
4. Trouver les employés qui sont soit ST_MAN soit IT_PROG.
5. Trouvez les employés dont le nom commence par M
6. Trouvez les employés dont le nom comporte 5 caractères et se termine par la lettre N
7. Lister les employés qui ne perçoivent pas de commission.
8. Lister les employés dans l’ordre croissant des salaires
9. Lister les employés d’abord dans l’ordre croissant des salaires et puis l’ordre décroissant
des noms.
10. Listez les employés qui travaillent au Canada.
11. Trouver le nom du département de l’employée Douglas Grant.
12. Lister les départements qui n’ont pas encore d’employés.
13. Lister les employés dont le salaire (sans la commission) excède celui de leurs managers.
14. Trouver tous les employés dont le salaire excède celui d’Alexandre Hunold.
15. Trouvez les jobs exercés par l’employé Neela Kochhar.
16. Trouvez tous les employés exerçant le même job que Bruce Ernst.
17. Trouvez les employés dont le salaire excède le salaire de tous les employés du
département 60.
18. Affichez le plus gros et plus petit salaire.
19. Affichez la moyenne des salaires de l’ensemble des employés
20. Affichez la moyenne des salaires par intitulé de job.

1
TP1
Question 1 :
Lister tous les jobs en éliminant les doublons :

select distinct Job_title from jobs;

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 :

select * from employees where salary between 1200 and 1400;

Question 4 :
Trouver les employés qui sont soit ST_MAN soit IT_PROG :

select * from employees where job_id='ST_MAN' or job_id='IT_PROG';

Question 5 :
Trouver les employés dont le nom commence par M:

select * from employees where last_name like 'M%';

Question 6 :
Trouver les employés dont le nom comporte 5 caractères et se termine par la lettre N

select * from employees where last_name like '____n';

Question 7 :
Lister les employés qui ne perçoivent pas de commission :

select * from employees where commission_pct is NULL;

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 :

select * from employees order by salary asc, last_name DESC;

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:

select department_name from employees, departments where


employees.department_id=departments.department_id and
employees.first_name='Douglas' and last_name='Grant';

Question 12 :
Lister les départements qui n’ont pas encore d’employés:

select department_name from departments


minus
select distinct department_name from employees, departments where
employees.department_id=departments.department_id;

Question 13 :
Lister les employés dont le salaire (sans la commission) excède celui de leurs managers:

select emp.employee_id, emp.first_name, emp.last_name from employees EMP, employees


MAN where EMP.manager_id=man.employee_id and EMP.salary>Man.salary;

Question 14 :
Trouver tous les employés dont le salaire excède celui d’Alexandre Hunold

select employee_id, job_id, last_name, first_name


from employees EMP, employees EMP2
where emp2.first_name='Alexander'and emp2.last_name='Hunold'and
emp.salary>emp2.salary order by emp.employee_id asc;

3
TP1
Question 15 :
Trouvez les jobs exercés par l’employé Neela Kochhar:

select employees.employee_id, jobs.job_title


from employees, jobs where employees.job_id=jobs.job_id and
employees.first_name='Neena' and employees.last_name='Kochhar';

Question 16 :
Trouvez tous les employés exerçant le même job que Bruce Ernst :

select emp.employee_id, emp.first_name, emp.last_name


from employees EMP, employees EMP2
where emp2.first_name='Bruce' and emp2.last_name='Ernst' and emp2.job_id=emp.job_id
and emp. last_name!='Ernst' and emp.first_name!='Bruce';

Sous-Requête

select employee_id, job_id, last_name, first_name


from employees
where job_id in(select job_id from employees where first_name= 'Bruce' and
last_name='Ernst');

Question 17:
Trouvez les employés dont le salaire excède le salaire de tous les employés du département 60:

select emp.employee_id, emp.first_name, emp.last_name, emp.salary, emp.department_id


from employees EMP, employees EMP2 where emp2.department_id=60
minus
select emp.employee_id, emp.first_name, emp.last_name, emp.salary, emp.department_id
from employees EMP, employees EMP2 where emp2.department_id=60 and
emp.salary<emp2.salary;

select employee_id, first_name, last_name


from employees
where salary> (select max(salary) from employees where department_id=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.

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.

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.

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.

5. Affichez le nom des départements en n’utilisant que les 5 premiers caractères de leur
nom.

6. Afficher le nom des employés en majuscules puis en minuscules dans la même


requête.

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.

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

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.

select first_name, last_name, job_id, salary+(salary*commission_PCT) Total_Compensation


from employees
where department_ID=50 and commission_PCT is not NULL;

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.

select first_name, last_name, (salary/22) as non_arrondi, round(salary/22,0) as


arrondi_unite, round(salary/22,2) as arrondi_2
from employees where department_ID=80;

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.

select first_name, last_name, round(salary/22,1) as salaire_jour, round((salary/22)/8,1) as


salaire_h
from employees where department_ID=50;

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.

select department_name ||' - ' || manager_id


from departments;

Question 5 :
Affichez le nom des départements en n’utilisant que les 5 premiers caractères de leur nom.

select substr(department_name,1,5) from departments;

6
TP2
Question 6 :
Afficher le nom des employés en majuscules puis en minuscules dans la même
requête.

select upper(last_name),lower(last_name) from employees;

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

select last_name, job_title, to_char(hire_date,'Day DD month yyyy')


from jobs, employees
where jobs.job_id=employees.job_id;

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.

select last_name, first_name


from employees
where hire_date between '04/01/1961' and '15/04/1981' order by hire_date asc;

7
TP2
TP 3 : SQL ORACLE : LES Sous-Requêtes

Répondre en SQL aux différentes requêtes suivantes :

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.

select department_name from departments


minus
select distinct department_name from employees, departments
where employees.department_id=departments.department_id;

SOUS-REQUÊTE

select departments.department_id from departments where departments.department_id


not in(select department_id from employees where department_id is not null)

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:

select employee_id from employees


where job_id = (select job_id from employees where lower(first_name) = 'bruce' and
lower(last_name) = 'ernst');

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

select last_name ||' - '||first_name


from employees where salary >= all (select salary from employees);

9
TP3
Question 6 :
Le job le mieux payé autre que le président :

select distinct jobs.job_id


from employees, jobs
where salary=(select max(salary) from employees, jobs where employees.job_id=jobs.job_id
and upper(jobs.job_title)not like upper('President'))
and employees.job_id=jobs.job_id;

Question 7 :
Affichez pour chaque département les jobs non existants:

select distinct department_id, job_id from (select department_id from departments)D,


(select job_id from jobs)J where (department_id, job_id) not in (select department_id,
job_id from employees where department_id is not null);

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

1. Affichez pour chaque département son salaire.

2. Affichez pour chaque département son salaire moyen par job

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)

5. Affichez pour chaque employé le nombre d’employé qu’il gère.

6. Nom du département où il y a le plus d’employés

7. Les départements qui possèdent tous les jobs.

8. Affichez la moyenne des salaires par intitulé de job.

11
TP4
Question 1 :
Affichez pour chaque département son salaire.

select department_id, round(AVG(salary),2) as salaire_moyen


from employees
where employees.department_id is not NULL
group by department_id
order by department_id;

Question 2 :
Affichez pour chaque département son salaire moyen par job

select department_id, job_id, round(AVG(salary),2) as salaire_moyen


from employees
where employees.department_id is not NULL
group by department_id,job_id
order by department_id;

Question 3 :
Lister les salaires moyens par job en excluant les jobs où il y a moins de 2 employés.

select department_id,job_id,round(AVG(salary),2) as salaire_moyen


from employees
where employees.department_id is not NULL
group by department_id,job_id
having count(employee_id)>=2
order by department_id;

Question 4 :
Donnez le salaire moyen par département et par job en excluant les petits salaires (<3000)

select department_id,job_id,round(AVG(salary),2) as salaire_moyen


from employees
where employees.department_id is not NULL
and salary>3000
group by department_id,job_id
order by department_id;

12
TP4
Question 5 :
Affichez pour chaque employé le nombre d’employé qu’il gère.

select distinct manager_id, count(employee_id) as nombre_emp_gérés


from employees
where manager_id is not null
group by manager_id
order by manager_id;

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.

SELECT DEPARTMENT _ID, COUNT ( DISTINCT JOB _ID)


FROM EMPLOYEES GROUP BY DEPARTMENT _ID
HAVING COUNT( DISTINCT JOB _ID)= ( SELECT COUNT ( DISTINCT JOB _ID) FROM EMPLOYEES);

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

Question bonus: 4 plus gros salaires

SELECT ROWNUM , first_name, last_name, salary


FROM (SELECT salary,first_name, last_name FROM employees ORDER BY salary DESC)
WHERE ROWNUM <=4;

SELECT salary,first_name, last_name FROM employees GROUP BY salary 4 DESC;

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 :

Chercheur (codeC, nomC, #codeE) V


Equipe (codeE, nomE, adresse)
Projet (codeP, nomP, #codeE, budgetP)
AFF (#codeC, #codeP)

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.

3. Proposez des requêtes SQL pour chacun des besoins suivants :


a. (1 pt) le nom des chercheurs travaillant sur le projet p5.
b. (1pt) le nom des chercheurs qui ne travaillent que sur le projet « IMAGE »
c. (1 pt) le nombre de projets par chercheur.
d. (2 pts) le nom des chercheurs travaillant sur le plus grand nombre de projets
e. (2 pts) le nom des projets auxquels sont affectés au moins trois chercheurs.
f. (2 pts) le nom des équipes ayant au moins un projet avec un budget supérieur à la
moyenne des budgets des projets.
g.(2 pts) le numéro des chercheurs autre que « ch3 » travaillant sur les mêmes projets
que « ch3 » mais pouvant éventuellement en avoir d'autres.
h. (2 pts) Les codes de projets ne faisant travailler que des chercheurs de la même
15
TP6
équipe.
i. (2 pts) 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.
4. (1 pt) On souhaite maintenant supprimer le contenu de toutes les tables. Proposez, dans
le
bon ordre, les requêtes SQL pour vider vos tables.

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

codeP nomP codeE budgetP


codeC codeP
ch1 P3 P7 VACBI e2 120
ch2 P4 P5 SRI e1 160
ch2 P5 P1 HYPERMEDIA e2 130
ch2 P6 P4 BIG e1 110
ch3 P5 P6 DIABETO e1 200
ch3 P6 P8 QUAERO e2 500
ch4 P2 P9 VORTEX e1 250
ch6 P2 P2 IMAGE e2 140
ch6 P4 P3 VIDEO e1 100
ch6 P6
ch7 P4

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

insert into AFF(codeC,codeP) VALUES ('ch1', 'p3');


insert into AFF(codeC,codeP) VALUES ('ch2', 'p4');
insert into AFF(codeC,codeP) VALUES ('ch2', 'p5');
insert into AFF(codeC,codeP) VALUES ('ch2', 'p6');
insert into AFF(codeC,codeP) VALUES ('ch3', 'p5');
insert into AFF(codeC,codeP) VALUES ('ch3', 'p6');
insert into AFF(codeC,codeP) VALUES ('ch4', 'p2');
insert into AFF(codeC,codeP) VALUES ('ch6', 'p2');
insert into AFF(codeC,codeP) VALUES ('ch6', 'p4');
insert into AFF(codeC,codeP) VALUES ('ch6', 'p6');
insert into AFF(codeC,codeP) VALUES ('ch7', 'p4');

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

update Equipe set adresse='Lyon' where adresse='Paris';


commit;

Question 3a:
Le nom des chercheurs travaillant sur le projet p5:

select chercheur.codeC, chercheur.nomC from Chercheur, AFF where


chercheur.codeC=AFF.codeC and codeP='p5';

Question 3b :
le nom des chercheurs qui ne travaillent que sur le projet "IMAGE".

select nomC, chercheur.codeC from chercheur, aff


where aff.codeC = chercheur.codeC
and aff.codeP = (select codeP from projet where upper(nomP)='IMAGE')
and aff.codeC IN (select codeC from aff group by codeC having count(codeP) = 1);

Question 3c :
Le nombre de projets par chercheur

Select aff.codec, count(aff.codep) from AFF, chercheur where chercheur.codeC=aff.codeC


group by aff.codec;

Question 3d :
Le nom des chercheurs travaillant sur le plus grand nombre de projets.

SELECT chercheur.nomC, aff.codeC


FROM chercheur,aff
WHERE chercheur.codeC=AFF.codeC GROUP BY chercheur.nomC, aff.codeC
HAVING COUNT(aff.codeP)=
(SELECT MAX (COUNT(codeP)) FROM AFF GROUP BY aff.codeC);

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.

SELECT DISTINCT equipe.nome


FROM projet, Equipe
WHERE projet.budgetp >
(SELECT AVG(budgetp) FROM projet)
AND equipe.codee=projet.codee;

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.

Création d’une vue


CREATE VIEW ProjetChercheur3 as
(SELECT codeP FROM aff WHERE codeC='ch3');
SELECT * FROM ProjetChercheur3;
Selection sur la vue
SELECT codeC
FROM aff, ProjetChercheur3
WHERE codeC !='ch3' AND aff.codeP = ProjetChercheur3.codeP
GROUP BY codec
HAVING COUNT(*)=(SELECT COUNT (*) FROM ProjetChercheur3);

Question 3 h:
Les codes de projets ne faisant travailler que des chercheurs de la même

SELECT aff. codep, COUNT(DISTINCT(codee))


FROM aff, chercheur
WHERE aff.codec=chercheur.codec
GROUP BY aff.codep
HAVING COUNT(DISTINCT (codee))=1;

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.

Delete from AFF;


Delete from Projet;
Delete from Chercheur;
Delete from Equipe;

Question 5:
Proposez des requêtes dans le bon ordre pour supprimer vos quatre tables.

Drop table AFF ;


Drop table Projet;
Drop table Chercheur ;
Drop table Equipe ;

21
TP6

Vous aimerez peut-être aussi