You are on page 1of 15

/*--Suppression de tables existantes

virgule: alter table prestataires_services modify rue_adresse double


number(3(nombre dechiffre entier),2(apres la virgule));
insert into prestataires_services values(2.33);

drop table membres cascade constraints;


drop table categories cascade constraints;
drop table prestataires_services cascade constraints;
drop table achats cascade constraints;
drop table deals cascade constraints;

alter table emp disable constraint cp_checksalary;


alter table Projet disable constraint cp_checkdate;

date entre deux dates

alter table Projet add constraint cp_checkdate check


( (DateP<To_Date('01/12/2012','dd/mm/yyyy')) and
(dateP>To_Date('01/12/2010','dd/mm/yyyy') ));

Commence par une lettre

alter table dept add CONSTRAINT cp_checkletter check ( Regexp_like(NomDept,'^[A-


Z]') or Regexp_like(NomDept,'^[a-z]'));

--creation des tables


--1
create table employees2 as select * from employees where 0=1;
--2
insert into employees2(select * from employees where extract(year from
hire_date)=2000);

create table membres


(
login varchar2(15) constraint pk_membres primary key,
mdp varchar2(50),
nom varchar2(50) not null,
prenom varchar2(50) not null,
constraint ck_mdp check (login<>nom and login<>prenom)
);

>>>>>>>>>>>>>>>>>>>>>>>>contains digit maj et


min<<<<<<<<<<<<<<<<<<<

constraint mdp_digit_ck check(Regexp_like(mdp,'[[:digits:]]')),


constraint mdp_upper_ck check(Regexp_like(mdp,'[[:upper:]]')),
constraint mdp_lower_ck check(Regexp_like(mdp,'[[:lower:]]'))

create table categories


(
nom_categorie varchar2(20) constraint pk_categories primary key,
descriptionC varchar2(80)
);

create table prestataires_services


(
nom_prest varchar2(50) constraint pk_prest_services primary key,
num_adresse number,
rue_adresse varchar2(20),
ville varchar2(20) not null,
CP number,
tel number not null,
email varchar2(50) constraint ck_email check(email like '%@%.%'),
page_fb varchar2(150) UNIQUE constraint ck_page_fb check(page_fb like 'https://%')
);

num_dep number constraint fk_emp_departtt references departementss (num_dep) on


delete cascade;

create table deals


(
intitule varchar2(150) constraint pk_deals primary key,
description_D varchar2(150) not null,
prix_i number,
prix_d number,
reduction number not null,
date_d date not null,
period_v number not null,
noteD integer constraint ck_noted check(noted between 0 and 5),
expire varchar2(3) default 'NON' constraint ck_expire check(expire='OUI' OR
expire='NON'),
nom_catg varchar2(20) constraint fk_deals_categories references
categories(nom_categorie),
nom_prestataire varchar2(50) constraint fk_deals_prestServices references
prestataires_services(nom_prest)
);

create table achats


(
intitule varchar2(150) constraint fk_achats_deals references deals(intitule),
login varchar2(15) constraint fk_achats_membres references membres(login),
nbcoupon number not null,
constraint pk_achats primary key(intitule, login)
);
--Les modifications

/* ***** Le mot de passe (MDP) ne contient ni le nom ni le pr�nom du membre


***** */

alter table deals modify prix_i not null;


alter table membres add constraint ck_mdp4 check (mdp not like '%'||nom||'%' and
mdp not like '%'||prenom||'%');
alter table deals drop(prix_d);
alter table achats add(date_achat date);
alter table achats drop constraint pk_achats;
alter table achats add constraint pk_achats primary key(intitule,login,date_achat);
alter table achats add constraint ck_nbcoupon check (nbcoupon in (1,2,3,4,5));

--Les insertions

insert into membres values ('Hello2017','H17test','gharbi','salma');


insert into membres values ('Ahmed1617','A132bc','ben chaabene','ali');
insert into membres values ('Daddou123','B098tt','Ben mahmoud','taoufik');

--il faut apporter certaines


modifications sur la d?finition de la table pour faire les insertions

alter table prestataires_services modify rue_adresse varchar2(40);


alter table prestataires_services modify page_fb varchar2(100);

insert into prestataires_services values ( 'Square Optical L''Aouina',2,'Residence


Mesk Jinen Ain zaghouan','Ariana', 2036,
71100001,'Square.optical@hotmail.tn','https://www.facebook.com/Square-
optical396558407144821/?fref=ts');
insert into prestataires_services values ( 'Forever Beauty',2,'rue Taher el Memmi 1
er etage','Tunis', 2091,
71234098,'Forever.beauty@hotmail.com','https://www.facebook.com/foreverbeautycenter
/?fref=ts');
insert into prestataires_services values ( 'Le Parador la Goulette',9,'Immeuble
Labrise Tour','Tunis', 2060,
71893425,'Parador.Goulette@gmail.com','https://www.facebook.com/pages/Parador-La-
Goulette-Restaurant/725375497514325?fref=ts');
alter table categories modify nom_categorie varchar2(30);

insert into categories values ('Restaurant et cafe', 'Deals relatifs aux


restaurants et cafes et salons de th?');
insert into categories values ('Beaut?', 'Deals relatifs aux salons de coiffure et
SPA');
insert into categories values ('H?tel', 'Deals relatifs aux h?tels');
insert into categories values ('Life style et accessoires', 'Deals relatifs aux
accessoires bijoux lunettes montres ...');

alter table deals modify intitule varchar2(100);


alter table deals modify description_d varchar2(150);
alter table achats modify intitule varchar2(100);

insert into deals values ('Square Optical L''Aouina : Un bon d''achat de valeur de
250 DT', 'L''offre comprend: - Un bon d''achat de valeur de 250 DT - 30% de r?
duction sur tout achat des lentilles de couleur', 250,60, to_date('12/10/2016
9','dd/mm/yyyy hh'), 5, 2,'NON',null, 'Square Optical L''Aouina');
insert into deals values ('Le Parador la Goulette : un menu de d?jeuner ou de d?ner
? partir de 49 DT Seulement', 'L''offre vous propose des mets qui vont vous ouvrir
l''app?tit et donner ? vos papilles de grandes envies! Choisissez l''offre qui vous
convient...',131,63,to_date('10/10/2016 9','dd/mm/yyyy hh'),3,5,'NON',null, 'Le
Parador la Goulette');

insert into achats values ('Square Optical L''Aouina : Un bon d''achat de valeur de
250 DT','Hello2017', 2, to_date('13/10/2016 15/10','dd/mm/yyyy hh24/mi'));
insert into achats values ('Square Optical L''Aouina : Un bon d''achat de valeur de
250 DT','Ahmed1617', 4, to_date('14/10/2016 10/03','dd/mm/yyyy hh24/mi'));
insert into achats values ('Square Optical L''Aouina : Un bon d''achat de valeur de
250 DT','Daddou123', 3, to_date('12/10/2016 11/00','dd/mm/yyyy hh24/mi'));
insert into achats values ('Le Parador la Goulette : un menu de d?jeuner ou de d?
ner ? partir de 49 DT Seulement','Hello2017', 5, to_date('12/10/2016
14/05','dd/mm/yyyy hh24/mi'));
commit;

update PRESTATAIRES_SERVICES set tel=71100123 where upper(nom_prest)='SQUARE


OPTICAL L''AOUINA';
update prestataires_services set tel=71899425,email='Parador.Goulette@gmail.com'
where(nom_prest)='Le Parador la Goulette';
update membres set mdp='h198test' where upper(login)='hello2017';
delete from prestataires_services where upper(nom_prest)='square optical l''aouna'
select * from prestataires_services WHERE upper(ville) LIKE '%TUNIS%';
select nom,intitule,date_achat from achats A JOIN membres M ON A.login = M.login
WHERE date_achat LIKE '12-OCT%';
select * from achats order by date_achat desc;
*/
select extract (day from date_d) jour,
to_char(date_d,'mm')mois,to_char(date_d,'HH24') heure,prix_i-(prix_i*reduction)
"prix apr�s r�duction" from deals;
/*
--tp1
--1Cr�er la table EMPLOYEES2 copie sur la table EMPLOYEES. (la table
devrait �tre vide)

create table employees2 as select * from employees where 0=1;

--2Remplir la table EMPLOYEES2 � partir de la table EMPLOYEES en


ins�rant la liste des
employ�s embauch�s pendant l�ann�e 2000.

insert into employees2(select * from employees where extract(year from


hire_date)=2000);

--3Afficher le nombre des employ�s embauch�s pendant l�an 2000.

select count(*) from employees2;

--4Ajouter une colonne nomm�e DEPARTMENT_NAME � la table EMPLOYEES2 et


mettre �
jour le contenu de cette colonne � partir de la table DEPARTMENTS (le nom du
d�partement
doit �tre en MAJUSCULE).

alter table employees2 add (department_name varchar2(30));


update employees2
set department_name=
(select upper(department_name) from departments
where department_id=employees2.department_id);

--5Afficher la liste des employ�s, l�ann�e, le semestre, le trimestre


de leur date
d�embauche par ordre d�croissant de l�ann�e. (utilisez la Table EMPLOYEES)

select
employees.*,
extract(year from hire_date) Annee,
to_char(hire_date,'q') Trimestre,
case(to_char(hire_date,'q'))
when '1' then 1
when '2' then 1
else 2
end Semestre
from employees
order by extract(year from hire_date) desc;
--6-aAfficher la somme des nombres de mois travaill�s par tous les
employ�s de chacun des
d�partements. (arrondir la valeur obtenue � 2 chiffres apr�s la virgule)
- Afficher la somme + la colonne Department_id

select department_id, round(sum(months_between(sysdate,hire_date)),2) somme


from employees group by department_id;

--6-b- Afficher la somme + la colonne Department_name

select department_name, round(sum(months_between(sysdate,hire_date)),2) somme


from employees E join departments D on D.department_id=E.department_id
group by department_name;

--7Afficher la liste des d�partements auxquels aucun employ� n�est


affect�. (affichez le nom du
d�partement en utilisant dans la requ�te un op�rateur ensembliste)

select department_name Nom


from departments
where department_id in
(
select department_id
from departments
minus
select department_id
from employees
);

--Q7: Afficher la liste des d�partements auxquels aucun employ� n�est


affect�.

--(affichez le nom du d�partement en utilisant dans la requ�te un op�rateur


ensembliste)
select department_name
from departments D
left join employees E
on D.department_id=E.department_id
where E.employee_id is null;

--Q8:Afficher la liste des employ�s et respectivement le nom de


leur JOB.
(�crire la requ�te de 2 mani�res diff�rentes : jointure/sous requ�te)
--avec une Jointure

select
E.*,
job_title
from
employees E
join
Jobs J
on E.job_id=J.job_id;

--avec SousRequete

select
E.*,
(
select job_title
from Jobs
where job_id=E.job_id
)
from employees E;

--Q9:Afficher les colonnes suivantes : department_name,


country_name, region_name. Le
r�sultat doit �tre tri� par nom de d�partement. Cette liste doit �tre num�rot�e.

select row_number() over


(order by department_name) as N,
department_name,country_name,region_name
from departments D
join locations L
on D.location_id=L.location_id
join countries C
on C.country_id=L.country_id
join regions r
on r.region_id=c.region_id;

--Q10:Afficher les d�tails relatifs aux employ�s qui ont le m�me


manager que l�employ� dont le
nom de famille est � Jones �.

select *
from employees
where
manager_id=
(
select manager_id
from employees
where upper(last_name)='JONES'
)
and upper(last_name)!='JONES';

--Q11Afficher les d�tails des employ�s dont le salaire est �gal


au salaire minimum.

select *
from employees
where salary=(select min(salary)from employees);
*/

/***BONUS***
--Q1:nbr Total d'employ�s

select count(*) from employees;

--Q2:nbr d'employ�s par d�partement

select department_id id,count(*) moy


from employees
group by department_id;

--Q3: Ajouter departement_name

select E.department_id id,department_name nom, count(*) nbr


from employees E join departments D
on E.department_id=D.department_id
group by E.department_id,department_name;

-select destinct

SELECT DISTINCT(commission_pct)
FROM employees;

--ajouter un mois
add_months(to_date ('2012/03/01', 'yyyy/mm/dd'),3) "ajouter 3 mois"
--Afficher la liste des employ�s, leur nom, pr�nom et salaire.
Cette liste doit �tre
num�rot�e pour chaque d�partement et selon un ordre descendant du salaire.
(Comparez entre les diff�rentes fonctions de num�rotation

select row_number() over


(partition by department_id order by salary desc ) as N,
first_name,last_name,salary
from employees;

--Q4: Afficher les d�partements qui contiennent au moin 20 employ�s

select E.department_id id,department_name nom, count(*) nbr


from employees E join departments D
on E.department_id=D.department_id
group by E.department_id,department_name
having count(*)>=20;

--

select department_name,last_name,first_name
from employees E
left join departments D
on E.department_id=D.department_id;
from employees E;

--Q9Afficher les colonnes suivantes : department_name,


country_name, region_name. Le
r�sultat doit �tre tri� par nom de d�partement. Cette liste doit �tre num�rot�e.

select rank() over (partition by department_id order by salary) N,


last_name,salary
from employees;

UPDATE PRESTATAIRES_SERVICES SET tel=71100123 WHERE (NOM_prest='Square Optical


L''Aouina '); changer un tel

--Q11Afficher les d�tails des employ�s dont le salaire est �gal


au salaire minimum.

select *
from employees E
where
salary <(
select avg(salary)
from employees
where department_id=E.department_id
);
*/

--12 Afficher les noms des employ�s et un statut d��valuation tel


que si l�ann�e d�embauche
est 1998 affichez le statut � NEEDS REVIEW � sinon affichez � NOT THIS YEAR �,
nommez
la colonne du statut d��valuation REVIEW.

select last_name,case(extract(year from hire_date))


when 1998 then 'needs review'
else 'not this year'
end review
from employees;

--13-a(fix it)

select department_name,min(salary) minimum,max(salary) maximum


from departments D
left join employees E
on D.department_id=E.department_id
group by departement_name
order by 2;

--13-b

select * from employees


where salary>all
(select salary from employees where job_id='SA_MAN');

--14Affiche la liste des employ�s qui gagnent moins que le


salaire moyen de leur
d�partement.

select *
from employees E
where salary<(select avg(salary)from employees where
department_id=E.department_id);

---0Afficher les employ�s qui touche un salaire sup�rieur � celui


de tous les directeurs
commerciaux (job_id=�SA_MAN�)

select *
from employees
where salary>(select max(salary) from employees where job_id='SA_MAN');
--1Afficher la liste des employ�s qui n�ont pas de commission.
Cette liste doit �tre
ordonn�e selon un ordre descendant de leur nom.

select *
from employees
where commission_pct is NULL
order by last_name desc;

--3Afficher le nom prenom et le nemero de departement

select concat(concat(last_name,' '),first_name) "nom et prenom",department_id


"numero de departement"
from employees
where department_id=30;

--4 upper first char

select department_id "id


dept",concat(substr(initcap(department_name),1,3),'.')"nom dept",location_id
"location",
from departments
where department_id
between 10 and 50;

--4+nbr d'employ�s par department

select e.department_id "id


dept",concat(substr(initcap(department_name),1,3),'.')"nom dept",location_id
"location",count(*)
from departments d
join employees e
on e.department_id=d.department_id
where e.department_id BETWEEN 10 and 50
group by e.department_id,location_id,department_name;

--1Afficher le salaire maximum et minimum � partir de la table


EMPLOYEES.
select min(salary),max(salary)
from employees;

--2Afficher le salaire moyen par d�partement en arrondissant la


valeur � 2 chiffres apr�s
la virgule. (Afficher l�identifiant du d�partement)

select department_id,
round (avg(salary),2) moy
from employees
group by department_id;

--3Afficher pour chaque d�partement le nombre des employ�s qui


lui sont affect�s.
Le r�sultat doit s�afficher de cette mani�re

select department_id "identifiant",count(*) "nbr employees"


from employees
group by department_id
order by 1;

--4Modifier la requ�te pr�c�dente pour avoir ces deux r�sultats :

select department_id "identifiant",count(*) "nbr employees"


from employees
group by department_id
having count(*)<10
order by 1;

--p3--5Afficher pour chaque employ�, son nom et pr�nom, et


respectivement le nom et
pr�nom de son manager.
--we create too copies of the employees table M and E
--we take name of manger of M table and name of employee of E table

select e.last_name||' '||e.first_name "employees",M.last_name||' '||M.first_name


"manager"
from employees E
join employees M
on E.manager_id=M.employee_id;

--p4--3Afficher les d�tails relatifs aux employ�s qui ont le m�me


manager que l�employ� dont
l�identifiant est �gal � 110.
select *
from employees
where manager_id=(select manager_id from employees
where (employee_id)=110)

-4Afficher le r�sultat suivant :

select null liste,region_name


from regions
union all
select 'total',to_char(count(*))
from regions;

--1Cr�er la vue V1, en mode lecture seulement, permettant de


lister les noms et pr�noms des
employ�s. (cette vue sera accessible par le responsable Marketing qui n�a pas
besoin de
voir que les noms et pr�noms des employ�s en mode lecture)

create view v1
as select first_name,last_name
from employees
with read only;

--2Cr�er la vue V2, permettant de lister les employ�s du


d�partement 60. (cette vue sera
accessible par le responsable du d�partement IT). Il peut �galement faire des mises
� jour
sur ces lignes.

create view v2
as select *
from employees
where department_id=60
with check option;

--3Cr�er un synonyme priv� sur la table EMPLOYEES nomm� EMP.


create synonym
emp for employees;

--p2--1Cr�er la s�quence SEQ1 permettant d�avoir la suite enti�re


suivante :
1..3..5..7..9..11..13..15 jusqu�� 95. Cette s�quence doit �tre cyclique et est une
valeur
initiale �gale � 11.

create SEQUENCE seq1


start with 11
increment by 2
minvalue 1
maxvalue 95
cycle
nocache;
select seq1.currval from Dual

--2Cr�er la table Personnes et ins�rer les 3 lignes comme


suit : (sachant que la colonne
MatriculePersonne est aliment�e par les valeurs produites par la s�quence SEQ1)

create table personnes


(matriculepersonne varchar2(20) constraint pk_personnes Primary KEY,
nompersonne varchar2(20),prenompersonne varchar2(20),age number);
insert into personnes VALUES
('MP'||seq1.nextval,'bensalah','sana',Null);
insert into personnes VALUES
('MP'||seq1.nextval,'sahli','mohamed',28);
insert into personnes VALUES
('MP'||seq1.nextval,'feki','salah',Null);

--3Afficher la valeur courante de la s�quence SEQ1

create UNIQUE index ind1


on employees(salary);

--- Delete cascade


num_dep number constraint fk_emp_departtt references departementss (num_dep) on
delete cascade

----on delete set null


num_dep number constraint fk_emmp_depart references deepartementss (num_dep) on
delete set null
-c. Afficher pour chaque deal les informations suivantes : le
jour, le mois et
l�heure du deal, le prix initial du deal et le prix apr�s r�duction.

select extract (day from date_d ) jour ,extract (month from date_d ) mois,
to_char(date_d,'hh') heure,prix_i,prix_i-prix_i*reduction "prix reduction" from
deals;

You might also like