Vous êtes sur la page 1sur 7

Correction TP 2: MySQL

Exercice 1 :
1. Se connecter en tant que root via la console mysql
2. Créer un fichier tp2.txt qui journalise votre travail
3. Lister les schémas de Base de données existants
4. Exécuter dans l’ordre les scripts suivants : HR_mysql_schema, HR_mysql_data
5. Lister à nouveau les schémas de Base de données existants, Remarquer le nouveau schéma HR.
6. Positionner vous sur le schéma de HR, puis lister les tables du schéma de HR
7. Afficher la description des tables suivantes :
 EMPLOYEES
 DEPARTMENTS
 LOCATIONS
 JOB_GRADES

Exercice 2:
a) Afficher le nom, le salaire et la commission des employés qui ne perçoivent pas de commission.
b) Afficher le nom, le salaire et la commission des employés qui ne perçoivent pas de commission. Et
trier les données par ordre décroissant de salaire.
c) Afficher le nom, le salaire et la commission des employés qui reçoivent une commission .Et trier les
données par ordre décroissant de salaire et par ordre décroissant de commission.
d) Afficher le nom, la fonction, et la date d’embauche des cinq employés les plus anciens de
l’entreprise
e) Afficher les différentes fonctions occupées dans l’entreprise.

Solution :
mysql> #a)
mysql> select last_name,salary,commission_pct
-> from employees
-> where commission_pct is null;

mysql> #b)
mysql> select last_name,salary,commission_pct
-> from employees
-> where commission_pct is null
-> order by salary desc;

mysql> #c)
mysql> select last_name,salary,commission_pct
-> from employees
-> where commission_pct is not null
-> order by salary desc, commission_pct desc;

mysql> #d)
mysql> select last_name,job_id,hire_date
-> from employees
-> order by hire_date
-> limit 5;

mysql> #e)

1
mysql> select distinct job_id
-> from employees;

Exercice 3 :
a) Afficher le nom et la date d’embauche des employés recrutés en 1994.
b) Afficher le nom des employés dont la troisième lette est un a.
c) Afficher le nom et le numéro de département des employés qui sont dans les départements 20 ou
50.Trier le résultat par ordre alphabétique croissant suivant le nom.
d) Afficher le nom et le salaire des employés dont le salaire est compris entre 5000 et 12000.
e) Afficher le nom et le salaire des employés dont le salaire n’est pas compris entre 5000 et 12000.
f) Afficher le nom, la fonction et le salaire de tous les employés qui sont soit représentant commercial
(SA_REP) ou gestionnaire de stock (ST_CLERK). Et dont le salaire n’est ni égal à 2500, ni 3500,
ni 7000.

Solution :
mysql> #a)
mysql> select last_name,hire_date
-> from employees
-> where hire_date like '1994%';

mysql> #b)
mysql> select last_name
-> from employees
-> where last_name like '__a%';

mysql> #c)
mysql> select last_name,department_id
-> from employees
-> where department_id in (20,50)
-> order by last_name;

mysql> #d)
mysql> select last_name, salary
-> from employees
-> where salary between 5000 and 12000;

mysql> #e)
mysql> select last_name,salary
-> from employees
-> where salary not between 5000 and 12000;

mysql> #f)
mysql> select last_name,job_id,salary
-> from employees
-> where job_id in ('SA_REP','ST_CLERK')
-> and
-> salary not in (2500,3500,7000);

2
Exercice 4 :
a) Afficher pour chaque employé, le nom, le nom de département.
b) Pour chaque, afficher le nom, le numéro de département et le nom de département. Ecrire la requête
avec la version JOIN…ON et la version JOIN…USING.
c) Afficher pour chaque employé, le nom, le numéro de département et le numéro de manager du
département.
d) Afficher pour chaque employé, le nom, le nom de département et le numéro de manager de
l’employé.
e) Afficher le nom et le nom de département de tous les employés. Inclure dans le résultat les employés
qui n’ont pas de département.
f) Afficher le nom, la fonction le salaire et l’année d’embauche des employés du département
« Executive ».

Solution :
mysql> #a)
mysql> #solution 1
mysql> select last_name,department_name
-> from employees,departments
-> where employees.department_id =departments.department_id;

mysql> #solution 2
mysql> select last_name ,department_name
-> from employees e,departments d
-> where e.department_id=d.department_id;

mysql> #solution 3
mysql> select last_name ,department_name
-> from employees e join departments d
-> on(e.department_id=d.department_id);

mysql> #solution 4
mysql> select last_name ,department_name
-> from employees e join departments d
-> using(department_id);

mysql> # b)
mysql> select last_name ,department_id,department_name
-> from employees e join departments d
-> on (e.department_id=d.department_id);
ERROR 1052 (23000): Column 'department_id' in field list is ambiguous
mysql> /*
/*> La requete ci-dessus n'est pas correcte car la colonne department_id est une colonne commune à la table
employees et la table departments.
/*> Et donc, lors de la projection, il faudra preciser au moteur de base de données la colonne sur laquelle
/*> on projette (department_id de employees (e.departmetn_id )ou department_id de
department(d.department_id)
*/
mysql> select last_name ,e.department_id,department_name
-> from employees e join departments d
-> on(e.department_id =d.department_id);

3
mysql> select last_name ,department_id,department_name
-> from employees join departments
-> using(department_id);
mysql> /*
/*> La norme sql interdit que la colonne argument du USING soit précédée d'un qualificatif (nom de table).
/*> */

mysql> #c
mysql> #c --Version JOIN...ON
mysql> select last_name ,e.department_id,d.manager_id
-> from employees e join departments d
-> on(e.department_id=d.department_id);

mysql> #c --Version JOIN...USING


mysql> select last_name ,department_id,d.manager_id
-> from employees e JOIN departments d
-> USING(department_id);

mysql> #d
mysql> select last_name ,department_name,e.manager_id
-> from employees e join departments d
-> using(department_id);

mysql> #e
mysql> select last_name ,department_name
-> from employees e left outer join departments d
-> on (e.department_id =d.department_id);

mysql> #f
mysql> select last_name ,salary,hire_date,job_id
-> from employees e join departments d
-> on (e.department_id=d.department_id)
-> where department_name ='Executive';

Exercice 5 :
a) Afficher le salaire minimum des employés.
b) Afficher le salaire minimum, le salaire maximum, la somme et la moyenne des salaires.
c) Afficher le nombre total d’employés.
d) Afficher le nombre d’employés ayant une commission.
e) Afficher la moyenne des commissions.
f) Pour chaque département, afficher le numéro et la somme des salaires. Trier le résultat par ordre
croissant de numéro de département.
g) Pour chaque département, afficher le nom et la somme des salaires. Trier le résultat par ordre
alphabétique de département.
h) Afficher le nom et la somme des salaires des département dont cette somme est supérieure à 19000
Trier le résultat par ordre alphabétique de département.
i) Pour chaque département, afficher le nombre d’employés par fonction.

4
Solution :
mysql> #a)
mysql> use hr;
Database changed
mysql> select min(salary)
-> from employees;

mysql> #b)
mysql> select min(salary),max(salary),sum(salary),avg(salary)
-> from employees;

mysql> #c)
mysql> select count(*)
-> from employees;

mysql> /*
/*> ou encore:
/*> */
mysql> select count(employee_id)
-> from employees;

mysql> #d)
mysql> select count(commission_pct)
-> from employees;

mysql> #f)
mysql> select department_id,sum(salary)
-> from employees
-> group by department_id;

mysql> #g)
mysql> select department_name,sum(salary)
-> from employees JOIN departments
-> USING(department_id)
-> group by department_name
-> order by 1;

mysql> #h)
mysql> select department_name,sum(salary)
-> from employees JOIN departments
-> USING(department_id)
-> group by department_name
-> having sum(salary)>15000
-> order by department_name;

mysql> #i)
mysql> select department_name,job_id,count(employee_id) as "Nombre employes"
-> from employees JOIN departments
-> USING(department_id)
-> group by department_name,job_id;

5
Exercice 6 :
a) Afficher le nom, le salaire et la fonction des employés qui gagnent autant que l’employé Fay.
b) Afficher le nom, le numéro de département, la fonction et la date d’embauche de tous les employés
qui travaillent dans la localité (location_id) 1700. Mettre la date d’embauche sous format « Jeudi 12
Janvier 2017 ».
c) Afficher le nom et salaire de l’employé le mieux payé.
d) Afficher le nom, la fonction et le salaire des employés non programmeurs qui gagnent plus qu’un
programmeur(IT_PROG).
e) Afficher le nom, la fonction et le salaire des employés non programmeurs qui gagnent plus que tous
les programmeurs.

Solution :
mysql> #a)
mysql> select last_name,salary,job_id
-> from employees
-> where salary = (select salary
-> from employees
-> where last_name='Fay');

mysql> #a) --Pour eviter L'employe Fay dans le jeu de resultats


mysql> select last_name,salary,job_id
-> from employees e
-> where salary = (select salary
-> from employees f
-> where last_name='Fay'
-> and e.employee_id<>f.employee_id);

mysql> #b)
mysql> select last_name,department_id,job_id,
-> DATE_FORMAT(hire_date,'%W %e %M %Y') as "Date embauche"
-> from employees
-> where department_id IN (select department_id
-> from departments
-> where location_id=1700);

mysql> /*
/*> Pour que le noms des jours et des mois soient
/*> donn‚s en français, il faut exécuter la commande:
/*> lc_time_names='fr_FR';
/*> */
mysql> set lc_time_names='fr_FR';

mysql> select last_name,department_id,job_id,


-> DATE_FORMAT(hire_date,'%W %e %M %Y') as "Date embauche"
-> from employees
-> where department_id IN (select department_id
-> from departments
-> where location_id=1700);

mysql> #c)
mysql> select last_name, salary

6
-> from employees
-> where salary >= ALL (select salary
-> from employees);

mysql> /* ou encore: */
mysql> select last_name, salary
-> from employees
-> where salary=(select max(salary)
-> from employees);

mysql> #d)
mysql> select last_name,job_id,salary
-> from employees
-> where salary > ANY (select salary
-> from employees
-> where job_id='IT_PROG')
-> and job_id<>'IT_PROG';

mysql> #e)
mysql> select last_name,job_id,salary
-> from employees
-> where salary > ALL (select salary
-> from employees
-> where job_id='IT_PROG')
-> and job_id<>'IT_PROG';

Exercice 7 :
a) Afficher le numéro, le nom de tous les employés ainsi que le numéro et le nom de leur manager.
Mettre des alias appropriés pour chaque colonne.
b) Afficher le nom et la date d’embauche des employés qui sont embauchés à la même année que
« Davies ».
c) Afficher le nom et le grade des employés. Utiliser les tables EMPLOYEES et JOB_GRADES

Solution :
mysql> #a)
mysql> select e.employee_id emp ,e.last_name employe,
-> m.employee_id,m.last_name manager
-> from employees e JOIN employees m
-> ON (e.manager_id=m.employee_id);

mysql> #b)
mysql> select e.last_name,e.hire_date
-> from employees e JOIN employees d
-> ON(YEAR(e.hire_date)=YEAR(d.hire_date))
-> where d.last_name='Davies'
-> and e.employee_id<>d.employee_id;

mysql> #c)
mysql> select last_name,j.grade_level
-> from employees JOIN job_grades j
-> on salary between j.lowest_sal and j.highest_sal;

Vous aimerez peut-être aussi