Vous êtes sur la page 1sur 9

TPSQL2022- Bases de Données Relationnelles

RESUME DU TP

Il était question pour nous de créer et modifier des tables pour la gestion des employés d'une
entreprise. Nous avons tout d'abord créer une base de données nommée tp_bd_MDD grâce a la
syntaxe create database tp_bd_MDD;

1. DANS LA PREMIERE PARTIE

Il était question de créer trois fichiers SQL: s1.sql, req.sql et sup.sql.

Le Script s1 nous a permit d'effectuer :

➢ Création de la table DEPARTMENT

create table if not exists DEPARTMENT(


ID Numeric(7),
NAME Varchar(25));

➢ Création de la table EMPLOYEE

create table if not exists EMPLOYEE(


ID Numeric(7),
LAST_NAME Varchar(25),
FIRST_NAME Varchar(25),
DEPT_ID Numeric(7));

➢ Création de la table EMPLOYEE2

create table if not exists EMPLOYEE2(


EMPNO Numeric(7),
ENAME Varchar(25),
DEPTNO Numeric(7));

Le Script req nous a permit d'effectuer :

➢ Remplissage de la table DEPARTMENT

insert into DEPARTMENT values (10,'ACCOUNTING');


insert into DEPARTMENT values (20,'RESEARCH');
insert into DEPARTMENT values (30,'SALES');
insert into DEPARTMENT values (40,'OPERATIONS');
➢ Modification de la table EMPLOYEE

alter table EMPLOYEE modify LAST_NAME Varchar(50);

➢ Nommage des colonnes de la table EMPLOYEE2

alter table EMPLOYEE2 change EMPNO ID Numeric(7);


alter table EMPLOYEE2 change ENAME LAST_NAME Varchar(25);
alter table EMPLOYEE2 change DEPTNO DEPT_ID Numeric(7);

➢ Renommons la table EMPLOYEE2 en EMPLOYEE

alter table EMPLOYEE2 rename to EMPLOYEE;

➢ Ajout de la contrainte PRIMARY KEY dans la table EMPLOYEE

alter table EMPLOYEE add primary key(ID);

➢ Ajout de la contrainte PRIMARY KEY dans la table DEPARTMENT

alter table DEPARTMENT add primary key(ID);

➢ Ajout d'une clé étrangère dans la table EMPLOYEE

alter table EMPLOYEE add foreign key(DEPT_ID) references


DEPARTMENT(ID);

2. DANS LA DEUXIEME PARTIE

Il était question de créer trois fichiers SQL: s2.sql et req1.sql.

Le Script s2 nous a permit d'effectuer :

➢ Création de la table MY_EMPLOYEE

create table if not exists MY_EMPLOYEE(


ID Numeric(4) NOT NULL,
LAST_NAME Varchar(25),
FIRST_NAME Varchar(25),
USERID Varchar(8),
SALARY Numeric(9,2));

Le Script req1 nous a permit d'effectuer :

➢ Ajout de la première ligne de données du tableau dans MY_EMPLOYEE

insert into MY_EMPLOYEE values(1,'Patel','Ralph','Rpatel',795);


➢ Remplissage de MY_EMPLOYEE avec la seconde ligne du tableau

insert into MY_EMPLOYEE (ID,LAST_NAME,FIRST_NAME,USERID,SALARY)


values (2,'Dancs','Betty','Bdancs',860);
insert into MY_EMPLOYEE (ID,LAST_NAME,FIRST_NAME,USERID,SALARY)
values (3,'Biri','Ben','Bbiri',1100);
insert into MY_EMPLOYEE (ID,LAST_NAME,FIRST_NAME,USERID,SALARY)
values (4,'Newman','Chad','Cnewman',750);

➢ Remplacement du nom de l'employé 3 par Drexler

update MY_EMPLOYEE set LAST_NAME='Drexler' where ID=3;

➢ Saisie du salaire 1000 pour tous les employés dont le salaire est inférieur à 900

update MY_EMPLOYEE set SALARY=1000 where SALARY<900;

➢ Suppression de Betty Dancs de la table MY_EMPLOYEE

delete from MY_EMPLOYEE where FIRST_NAME='Betty';

➢ Vidage entier de la table MY_EMPLOYEE

delete from MY_EMPLOYEE where 1=1;

3. DANS LA TROISIEME PARTIE

Il était question de créer un nouveau fichier req2.sql et d'ajouter des syntaxes au script
req1.sql.

Les syntaxes ajoutées au Script req1.sql sont :

➢ Création des tables EMP et DEPT

create table EMP(


EMPNO Numeric(7),
ENAME Varchar(25),
JOB Varchar(25),
MGR Numeric(7),
HIREDATE Date,
SAL Numeric(9,2),
COMM Numeric(9,2),
DEPTNO Numeric(7));

create table DEPT(


DEPTNO Numeric(7),
DNAME Varchar(25),
LOC Varchar(25));
➢ Insertion des données de ces tables

insert into EMP values


(7839,'KING','PRESIDENT',NULL,'81-11-17',500,NULL,10),
(7698,'BLAKE','MANAGER',7839,'81-05-01',2850,NULL,30),
(7782,'CLARCK','MANAGER',7839,'81-06-09',1500,NULL,10),
(7566,'JONES','MANAGER',7839,'81-04-02',2975,NULL,20),
(7654,'MARTIN','SALESMAN',7698,'81-09-28',1250,1400,30),
(7499,'ALLEN','SALESMAN',7698,'81-02-20',1600,300,30),
(7844,'TURNER','SALESMAN',7698,'81-09-08',1500,0,30),
(7900,'JAMES','CLERCK',7698,'81-12-03',950,NULL,30),
(7521,'WARD','SALESMAN',7698,'81-02-22',1250,500,30),
(7902,'FORD','ANALYST',7566,'81-12-03',3000,NULL,20),
(7369,'SMITH','CLERCK',7902,'80-12-17',800,NULL,20),
(7788,'SCOTT','ANALYST',7566,'82-12-09',3000,NULL,20),
(7876,'ADAMS','CLERCK',7788,'83-01-12',1100,NULL,20),
(7934,'MILLER','CLERCK',7782,'82-01-23',1300,NULL,10);
insert into DEPT values
(10,'ACCOUNTING','NEW YORK'),
(20,'RESEARCH','DALLAS'),
(30,'SALES','CHICAGO'),
(40,'OPERATIONS','BOSTON');

Enfin, le Script req2 nous a permit d'effectuer :

➢ Requête permettant d'afficher les informations des employés en commencant par leur
matricule

select EMPNO,ENAME,JOB,HIREDATE from EMP;

➢ Affichage du nom concaténé avec le poste

select concat(ENAME,', ',JOB) as 'Employee and Title' from EMP;

➢ Affichage sous forme d'une seule colonne des données la table EMP

select concat(EMPNO,',',ENAME,',',JOB,',',
case when MGR is null then ' ' else MGR end,
',',HIREDATE,',',SAL,',',
case when COMM is null then ' ' else COMM end,
',',DEPTNO) as THE_OUTPUT from EMP;

➢ Requête permettant d'afficher le nom et le dept de l'employé ayant le matricule 7566

select ename,deptno from emp where empno=7566;

➢ Noms et salaires de tous les employés dont le salaire n'est pas compris entre 1500 et 2850

select ename,sal from emp where sal not between 1500 and 2850;
➢ Affichage des informations des employés embauchés entre le 20 février 1981 et le 1er mai
1981

select ename,job,hiredate from emp where hiredate between '81-02-


20' and '81-05-01'
order by hiredate ASC;

➢ Affichage du numéro de département et les noms de tous les employés des départements
10 et 30

select deptno,ename from emp where deptno=10 or deptno=30


order by ename asc;

➢ Noms et salaires des employés gagnant plus de 1500 travaillant dans les départements 10
ou 30

select ename as 'Employee',sal as 'Monthly salary' from emp


where sal>1500 and (deptno=10 or deptno=30);

➢ Noms et salaires de tous les employés n'ayant pas de manager

select ename,job from emp where mgr is null;

➢ Noms, salaires et commissions de tous les employés qui perçoivent des commissio,s ordres
décroissant

select ename,sal,comm from emp where comm is not null and comm<>0
order by sal DESC, comm DESC;

➢ Noms de tous les employéx dont la 3e lettre est 'a'

select ename from emp where ename like '__a%';

➢ Noms de tous les employés dont le nom contient deux L et travaillant dans le département
30 ou dont le manager est 7782

select ename from emp where ename like '%l%l%' and (deptno=30 or
mgr=7782);

➢ Nom, poste et salaire de tous les ' CLERK' ou 'ANALYST' dont le salaire est différent de
$1000, $3000 ou $5000

select ename,job,sal from emp


where (job='CLERCK' or job='ANALYST') and (sal !=1000 and sal !
=3000 and sal !=5000);

➢ Nom, salaire et commission de tous les employés dont le montant de commission est de
plus de 10% supérieur au salaire

select ENAME,SAL,COMM from EMP where (COMM>1.1*SAL);


➢ Matricule, nom en minuscules concaténé à son poste, la longueur du nom, le salaire et le
salaire augmenté de 15% sous la forme d'un nombre entier

select EMPNO,concat(lower(ENAME),JOB) as Nom_Poste,length(ENAME)


longueur,SAL,round(1.15*SAL) as "New Salary" from EMP;

➢ Modification de la requête en ajoutant une colonne dans laquelle l'ancien salaire est
soustrait du nouveau salaire

select EMPNO,concat(lower(ENAME),JOB)as Nom_Poste,length(ENAME)


longueur,SAL,round(1.15*SAL) as "New Salary",round(1.15*SAL)-SAL
as Increase from EMP;

➢ Affichage des données concernant les employés dont le nom se termine par un N

select* from EMP where ENAME like '%N';

➢ Nom et date d'embauche de chaque employé ainsi que la date de révision du salaire qui
sera le premier lundi tombant après 6 mois d'activité

select ENAME,
concat (
dayname(HIREDATE),', the ',
dayofmonth(HIREDATE),' of ',
monthname(HIREDATE),',',
year(HIREDATE)) as HIREDATE,
case
when weekday(HIREDATE)=0 then
concat (
dayname(date_add(HIREDATE,interval 6 month)),', the ',
dayofmonth(date_add(HIREDATE,interval 6 month)),' of ',
monthname(date_add(HIREDATE,interval 6 month)),',',
year(date_add(HIREDATE,interval 6 month)))
else concat(
dayname(date_sub(date_add(date_add(HIREDATE,interval 6
month),interval 1 week),interval
weekday(date_add(date_add(HIREDATE,interval 6 month),interval
1 week)) day)),', the ',
dayofmonth(date_sub(date_add(date_add(HIREDATE,interval 6
month),interval 1 week),interval
weekday(date_add(date_add(HIREDATE,interval 6 month),interval
1 week)) day)),' of ',
monthname(date_sub(date_add(date_add(HIREDATE,interval 6
month),interval 1 week),interval
weekday(date_add(date_add(HIREDATE,interval 6 month),interval
1 week)) day)),',',
year(date_sub(date_add(date_add(HIREDATE,interval 6
month),interval 1 week),interval
weekday(date_add(date_add(HIREDATE,interval 6 month),interval
1 week)) day)))
end as REVIEW
from EMP;
➢ Requête affichant les informations suivantes pour chaque employé : <employee name>
earns <salary> monthly but wants <3 times salary> affiché dans la colonne Dream
Salaries

select concat(ENAME,' earns ',SAL,' monthly but wants ',3*SAL) as


'Dream Salaries' from EMP;

➢ Affichage du nom, de la date d'embauche ainsi que le jour de la semaine où l'employé à


débuté

select ENAME,HIREDATE,dayname(HIREDATE) as DAY from EMP order by


weekday(HIREDATE) asc;

➢ Requête pour afficher le nom et le montant de la commission de chaque employé. Pour


les employés ne touchant aucune commission, affichez "No Commission"

select ENAME,
case
when COMM is null then 'No Commission'
else COMM
end as COMM
from EMP;

➢ Affichage du salaire maximum, du salaire minimum, de la somme des salaires et du


salaire moyen de tous les employés

select round(max(SAL),0) as Maximum,round(min(SAL),0) as


Minimum,round(sum(SAL),0) as Sum,round(avg(SAL),0) as Average from
EMP;

➢ Requête pour afficher le nombre de personnes qui occupent le même poste

select count(EMPNO) as NOMBRE_PERSONNES,JOB from EMP group by JOB;

➢ Nombre de managers sans en donner la liste affiché dans la colonne Number of


Managers

select count(EMPNO) as 'Number of Managers' from EMP where


JOB='MANAGER';

➢ Requête pour afficher la différence existant entre le salaire maximum et le salaire


minimum. Nommez la colonne DIFFERENCE

select max(SAL)-min(SAL) as DIFFERENCE from EMP;

➢ Matricule des différents managers et le niveau de salaire le plus bas de leurs employés

select EMPNO,min(SAl) as Minimum from


((select EMPNO from EMP where JOB='MANAGER') p1
join (select MGR,SAL from EMP ) p2 on p1.EMPNO=p2.MGR)
group by EMPNO
having Minimum>1000 order by Minimum desc;
➢ Requête pour afficher le numéro du département, le nombre d'employés et le salaire
moyen pour tous les employés de ce département affichés dans les colonnes Number of
dept, Number of People et Salary, respectivement.

select DEPTNO as 'Number of dept',count(EMPNO) as 'Number of


People',avg(SAL) as Salary from EMP group by DEPTNO;

➢ Requête pour afficher le nombre total d'employés puis, parmi ces employés,ceux qui ont
été embauchés en 1980, 1981, 1982 et 1983 affichées dans les colonnes de façon
appropriée

select count(s.EMPNO) as Total_Emp, p.Total


from EMP s
cross join
(select count(p.EMPNO) as Total from EMP p
where(year(p.HIREDATE) in(1980,1981,1982,1983))) p;

➢ Requête pour afficher les postes, le salaire de ces postes par numéro de département et le
salaire total de ces postes incluant tous les départements affichées dans les colonnes de
façon appropriée

select DISTINCT e.JOB,p.SAL,k.SAL_TOTAL


from EMP e,
(select SAL from EMP group by DEPTNO) p,
(select avg(SAL) SAL_TOTAL from EMP group by DEPTNO) k;

➢ Requête pour afficher le nom, le numéro de département de tous les employés

select ENAME,DEPTNO from EMP;

➢ Création d'une liste unique de tous les postes du département 30

select JOB from EMP where (DEPTNO=30);

➢ Requête pour afficher le nom, le poste, le numéro de département et le nom du


département de tous les employés basés à DALLAS

select e.ENAME ,e.JOB ,e.DEPTNO ,d.DNAME


from EMP e,DEPT d
where(e.DEPTNO=d.DEPTNO and d.LOC='DALLAS');

➢ Affichage du nom et du matricule des employés et de leur manager. Nommez les colonnes
Employee, Emp#, Manager, et Mgr#, respectivement

select e.ENAME as 'Emp#',e.EMPNO,e.MGR as 'Mgr#',


case when MGR is null then ' '
else (select ENAME from EMP where EMPNO=e.MGR) end as Manager
from EMP e;
➢ Requête pour afficher le nom, le poste, le département, le salaire et l'échelon de tous les
employés

select ENAME,JOB,DEPTNO,SAL,
case when SAL between 700 and 1200 then 1
when SAL between 1201 and 1400 then 2
when SAL between 1401 and 2000 then 3
when SAL between 2001 and 3000 then 4
when SAL between 3001 and 9999 then 5
else null end as ECHELLON
from EMP ;

➢ Requête pour afficher le nom et la date d'embauche de tous les employés arrivés après
l'employé Blake

select e.ENAME,e.HIREDATE
from EMP e,(select HIREDATE from EMP where ENAME='BLAKE') p
where (e.HIREDATE>p.HIREDATE);

➢ Requête pour afficher le nom et la date d'embauche de tous les employés travaillant dans
le même département que Blake, à l'exclusion de Blake

select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO from EMP e


where ((e.DEPTNO in
(select DEPTNO from EMP where ENAME='BLAKE')) and
(e.EMPNO not in (select EMPNO from EMP where
ENAME='BLAKE')));

➢ Requête pour afficher le matricule et le nom de tous les employés qui gagnent plus que le
salaire moyen. Trions les résultats par ordre décroissant des salaires

select EMPNO,ENAME from EMP where SAL>(select avg(SAL) from EMP);

➢ Requête pour afficher le matricule et le nom de tous les employés qui travaillent dans le
même département que tout employé dont le nom contient un T

select EMPNO,ENAME from EMP where DEPTNO in


(select DEPTNO from EMP where ENAME like '%T%');

➢ Affichage du numéro de département, du nom et le poste de tous les employés travaillant


dans le département des ventes ('SALES')

select DEPTNO,ENAME,JOB from EMP where DEPTNO in


(select DEPTNO from DEPT where DNAME='SALES');

Vous aimerez peut-être aussi