CORRIGE REVISIONS-1 – CAS EMPLOYES
Manipulation des données et langage de définition de données
Création des tables :
create table dept
(deptno numeric(2) constraint pk_dept primary key,
dname varchar(30) not null,
loc varchar(20) not null);
create table emp
(empno numeric(4) constraint pk_emp primary key,
ename varchar(30) not null,
job varchar(30) not null,
mgr numeric(4),
hiredate date not null,
sal numeric (8,2) not null,
comm numeric(8,2),
deptno numeric(2) not null constraint fk_emp references dept(deptno));
Ecrire et exécuter les requêtes ci-dessous :
1) Obtenir les départements (numéro, nom) ayant des employés.
Select d.deptno, dname
From dept d, emp e
Where e.deptno = d.deptno ;
Ou
Select d.deptno, dname
From dept d
Inner join emp e On e.deptno = d.deptno;
2) Donner la liste des employés (numéro, nom) non vendeurs.
Select empno, ename
From emp
Where job != 'SALESMAN';
3) Donner les employés embauchés entre le 01-01-1981 et le 30-06-81.
Select empno, ename
From emp
Where hiredate between '1981-01-01' and '1981-06-30';
4) Donner le salaire le plus élevé et le salaire le plus bas par département et job.
Select dname, job, max(sal) as Maximum, min(sal) as Minimum
From emp e
Inner join dept d On e.deptno = d.deptno
Group by dname, job;
5) Donner pour chaque département : son nom, le nombre d’employés et la moyenne des salaires.
Select dname, count(*), avg(sal)
From emp e
Inner join dept d On e.deptno = d.deptno
Where e.deptno = d.deptno
Group by dname;
6) Donner le montant total des commissions des vendeurs.
Select sum(comm) as
Total_Commissions
From emp
Where job = ' SALESMAN';
7) Donner La liste des employés (son nom, sa fonction et le nom de son département) par ordre alphabétique.
Select ename, job, dname
From emp e
Inner Join dept d On e.deptno = d.deptno
Order by ename;
8) Donner le nom et le job de la dernière personne embauchée dans le département ‘ACCOUNTING’.
Select ename, job
From emp e
Inner Join dept d On e.deptno = d.deptno
And dname='ACCOUNTING'
And hiredate =
(select max(hiredate)
From emp e
Inner Join dept d On e.deptno = d.deptno
And dname='ACCOUNTING');
9) Lister les employés (no, nom) dont le salaire est supérieur à la moyenne des salaires.
Select empno, ename
From emp
Where sal >
(select avg(sal)
from emp);
10) Donner le nombre d’employés n’ayant pas de responsable.
Select count(*)
From emp
Where mgr is null;
11) Donner la liste des employés (numéro, nom et job) avec le nom de leur responsable.
Select e1.empo, e1.ename, e1.job, e2.ename
From emp e1
Inner Join emp e2 On e1.mgr = e2.empo
12) On peut constater que le chef ne figure pas dans la liste de la question précédente (c'est logique car il n'a pas de responsable), il est demandé de l'ajouter dans cette liste (penser à UNION).
Select e1.empo, e1.ename, e1.job, e2.ename
From emp e1
Inner Join emp e2 On e1.mgr = e2.empo
Union
Select empno, ename, job, NULL
From emp
Where mgr is NULL;
13) Donner la liste des employés dont le nom commence par A.
Select empno, ename
From emp
Where ename like ' A%';
14) Donner la liste des employés (numéro, nom) avec leur salaire total ordonnée sur le nom de l'employé ; attention si on ajoute NULL à un nombre, le résultat vaut NULL.
Select empno, ename, sal
From emp
Where job != ' SALESMAN'
Union
Select empno, ename, sal + comm
From emp
Where job = ' SALESMAN'
Order by ename;
15) Augmenter les salaires des vendeurs de 1%.
Update emp
Set sal = sal *1.01
Where job = 'SALESMAN';
16) Insérer un département (la seule contrainte est que le numéro doit être égal au dernier + 10).
Insert into dept values(
(Select (max(d.deptno) + 10) from dept d), 'INFORMATIQUE', 'NEW-YORK');