0% found this document useful (0 votes)
89 views

SGBD

This document contains SQL statements to: 1. Create tables to store data about employees, departments, members, categories, deals etc. 2. Add, modify and drop constraints on the tables. 3. Insert sample data into the tables. 4. Perform updates, deletes and selects on the data.

Uploaded by

Mohamed Dhibi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
89 views

SGBD

This document contains SQL statements to: 1. Create tables to store data about employees, departments, members, categories, deals etc. 2. Add, modify and drop constraints on the tables. 3. Insert sample data into the tables. 4. Perform updates, deletes and selects on the data.

Uploaded by

Mohamed Dhibi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 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

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy