Vous êtes sur la page 1sur 47

République Tunisienne ‫اﻟﺠﻤﮭــــﻮرﯾﺔ اﻟﺘﻮﻧﺴﯿــﺔ‬

Ministère de l’Enseignement Supérieur ‫وزارة اﻟﺘﻌﻠﯿﻢ اﻟﻌﺎﻟﻲ‬


Université de Carthage ‫ﺟﺎﻣﻌــﺔ ﻗﺮطــﺎج‬
Institut National des Sciences Appliquées et de Technologie ‫اﻟﻤﻌﮭــــﺪ اﻟﻮطﻨﻲ ﻟﻠﻌﻠــﻮم اﻟﺘﻄﺒﯿﻘﯿﺔ‬

Fascicule de Travaux Pratiques

Base de données

Élaboré par : Ryma MAHFOUDHI

Année Universitaire : 2021-2022 Niveau : 2ème année ingénieur


TPn°1 : Bases de données

Niveau : GL2 Année universitaire : 2021-2022

Objectif : Dans ce TP, nous allons manipuler les requêtes basiques pour créer et manipuler une base
de données sous MySQL.

1 Installation de MySQL
– Accéder au site Web MySQL et télécharger la dernière
version: https://dev.mysql.com/downloads/installer/
– Durant l’installation, conserver la configuration par défaut et entrez le mot de passe racine
MySQL
– Une fois MySQL installé, lancer l’application “MySQL Workbench”

2 Lancement de requêtes SQL


Dans cet exemple, nous allons créer une base de données avec le schéma suivant :

Film(id_Film entier, titre texte)

Acteur(id_Acteur entier, nom texte, prenom texte)


Filmographie(id_Acteur entier, id_Film entier)

2.1 Lancement de requêtes à travers l’interface graphique


– Ouvrir une nouvelle connexion en cliquant sur :
1
– Créer un nouveau schéma en cliquant sur :

– Nommer ce schéma Mediatheque et cliquer sur “Apply”.

– Créer la table Films comme détaillé ci-dessous :

– Aller sur la table Films et sur “Edit Table” et ajouter les titres de films suivants, avec leurs clés
respectives :
2
{(1,‘‘Le challat de Tunis’’), (2,‘‘Shehrazade’’), (3,‘‘Dachra’’)}.

2.2 Lancement de requêtes SQL


Pour lancer des requêtes SQL, aller sur l’onglet “Query” pour créer une nouvelle requête.

1. Ecrire une requête pour afficher tous les éléments de la table Films.
2. Ecrire une requête pour ajouter les titres de films suivants {(4, ‘‘Le voyage à Tunis’’), (5, ‘‘Noura
rêve’’), (6,‘‘ Porto Farina’’)}.
3. Ecrire une requête pour afficher tous les éléments de la table Films.
4. Ecrire une requête pour afficher tous les titres de films.
5. Ecrire une requête pour créer la table Acteurs avec la colonne idActeur de type entier (en tant que clé
primaire et non null) et les colonnes nom et prénom de types texte (non null).
6. Ecrire une requête pour ajouter les acteurs suivants : {Hend Sabri, Lotfi Abdelli}.
7. Ecrire une requête qui permet de lister le nom des acteurs.
8. Ecrire une requête pour créer la table Filmographie. Ajouter les contraintes d’intégrité : idActeur et
idFilm sont des clés étrangères correspondant aux attributs Acteur(idActeur) et Film(idFilm).
9. Ecrire les requêtes pour remplir la table Filmographie. Hend Sabri a joué dans Noura rêve et Dachra,
Lotfi Abdelli a joué dans Dachra.

3
Correction TPn°1 : Bases de données

CREATE TABLE FILM (

idFilm INT NOT NULL,

titre TEXT NOT NULL,

CONSTRAINT pk1 PRIMARY KEY (idFilm)

);

INSERT INTO FILM VALUES (1, 'Le challat de Tunis');

INSERT INTO FILM VALUES (2,'Shehrazade');

INSERT INTO FILM VALUES (3,' Dachra ');

R1.

SELECT * FROM FILM;

R2.

INSERT INTO FILM VALUES (4,' Le voyage à Tunis ');

INSERT INTO FILM VALUES (5,'Noura rêve');

R3.

SELECT * FROM FILM;

R4.

SELECT titre FROM FILM;

R5.

CREATE TABLE ACTEUR ( idActeur INT NOT NULL, nom TEXT NOT NULL, prenom TEXT NOT NULL,
CONSTRAINT pk1 PRIMARY KEY (idActeur));

R6.

INSERT INTO ACTEUR VALUES (1, 'Hend', 'Sabri');

INSERT INTO ACTEUR VALUES (2, 'Lotfi', 'Abdelli');

R7.

SELECT nom FROM ACTEUR;

R8.
CREATE TABLE FILMOGRAPHIE (idActeur INT NOT NULL, idFilm INT NOT NULL, CONSTRAINT pk
PRIMARY KEY (idFilm , idActeur), CONSTRAINT fk1 FOREIGN KEY (idFilm) REFERENCES FILM (idFilm),
CONSTRAINT fk2 FOREIGN KEY (idActeur) REFERENCES ACTEUR (idActeur));

R9.

INSERT INTO FILMOGRAPHIE VALUES(1,5);

INSERT INTO FILMOGRAPHIE VALUES(1,3);

INSERT INTO FILMOGRAPHIE VALUES(2,3);


TPn°2 : Bases de données

Niveau : GL2 Année universitaire : 2021-2022

Objectif : Dans ce TP, nous allons nous familiariser avec l’utilisation des requêtes.

Question1. Créer la base de données correspondant à ce diagramme:

Question2. Insérer les données :

INSERT INTO PROJET VALUES (1,'Site Web', 'Tunisianet', 2001);


INSERT INTO PROJET VALUES (2,'PLATEFORME ELEARNING', 'Ecole Hannibal', 2015);
INSERT INTO PROJET VALUES (3,'EVAX', 'Ministère de la santé', 2020);
INSERT INTO PROJET VALUES (4,'ISTISHARA', 'PRESIDENCE', 2022);
INSERT INTO PROJET VALUES (5,'COVID', 'Ministère de la santé', 2019);

INSERT INTO INGENIEUR VALUES (1, 'Amine Ben Hariz');


INSERT INTO INGENIEUR VALUES (2, 'Sami Achour');
INSERT INTO INGENIEUR VALUES (3, 'Amira Loumi');
INSERT INTO INGENIEUR VALUES (4, 'Sawssen BOUDHIAFI');
INSERT INTO INGENIEUR VALUES (5, 'Oumaya BOUDHIAFI');

1
INSERT INTO EQUIPE VALUES(1,1, 'Architecte', 5000);
INSERT INTO EQUIPE VALUES(1,2, 'Développeur', 10000);
INSERT INTO EQUIPE VALUES(2,1, 'Responsable Marketing', 10000);
INSERT INTO EQUIPE VALUES(2,3, 'Développeur', 20000);
INSERT INTO EQUIPE VALUES(3,4, 'Architecte', 15000);
INSERT INTO EQUIPE VALUES(4,3, 'Scrum Master', 20000);

Question 3.

1. La liste de tous les projets où Amine participe

2. La liste des années où Amine a participé à un projet, ainsi que son rôle dans ce projet.

3. La liste de tous les projets du client de “Evax”. La requête ne doit pas contenir le nom de ce client

4. La liste des projets qui commencent par la chaîne de caractères “si” ou contiennent la chaîne de
caractères “te”.

5. La liste des films ordonnée par année, dans l’ordre descendant.

6. Le nombre d’ingénieurs ayant participé à “Evax”.

7. La liste des noms d’ingénieurs qui n’ont participé à aucun projet.

8. La liste des noms d’ingénieurs ayant participé, au moins à un projet avec la moyenne des salaires
qu’ils ont touché. Nommez la colonne “Moyenne”.

9. La liste des paires d’ingénieurs ayant le même salaire. Une paire d’ingénieurs ne doit pas se trouver
deux fois dans votre résultat.

10. Les salaires dans la base de données sont en dollars. Afficher ces salaires en dinars.

2
Correction TPn°2 : Bases de données

DROP SCHEMA IF EXISTS STARTUP;

CREATE SCHEMA STARTUP;

USE START-UP;

CREATE TABLE PROJET (

idprojet INT NOT NULL,

titre TEXT NOT NULL,

Client TEXT NOT NULL,

annee TEXT NOT NULL,

CONSTRAINT pk1 PRIMARY KEY (idprojet)

);

CREATE TABLE INGENIEUR (

idingenieur INT NOT NULL,

nom TEXT NOT NULL,

CONSTRAINT pk1 PRIMARY KEY (idingenieur)

);

CREATE TABLE EQUIPE (

idingenieur INT NOT NULL,

idprojet INT NOT NULL,

role TEXT NOT NULL,

salaire TEXT NOT NULL,

CONSTRAINT pk PRIMARY KEY (idprojet , idingenieur),

CONSTRAINT fk1 FOREIGN KEY (idprojet)

REFERENCES PROJET (idprojet),

CONSTRAINT fk2 FOREIGN KEY (idingenieur)

REFERENCES INGENIEUR (idingenieur)


);

INSERT INTO PROJET VALUES (1,'Site Web', 'Tunisianet', 2001);

INSERT INTO PROJET VALUES (2,'PLATEFORME ELEARNING', 'Ecole Hannibal', 2015);

INSERT INTO PROJET VALUES (3,'EVAX', 'Ministère de la santé', 2020);

INSERT INTO PROJET VALUES (4,'ISTISHARA', 'PRESIDENCE', 2022);

INSERT INTO PROJET VALUES (5,'COVID', 'Ministère de la santé', 2019);

INSERT INTO INGENIEUR VALUES (1, 'Amine Ben Hariz');

INSERT INTO INGENIEUR VALUES (2, 'Sami Achour');

INSERT INTO INGENIEUR VALUES (3, 'Amira Loumi');

INSERT INTO INGENIEUR VALUES (4, 'Sawssen BOUDHIAFI');

INSERT INTO INGENIEUR VALUES (5, 'Oumaya BOUDHIAFI');

INSERT INTO EQUIPE VALUES(1,1, 'Architecte', 5000);

INSERT INTO EQUIPE VALUES(1,2, 'Développeur', 10000);

INSERT INTO EQUIPE VALUES(2,1, 'Responsable Marketing', 10000);

INSERT INTO EQUIPE VALUES(2,3, 'Développeur', 20000);

INSERT INTO EQUIPE VALUES(3,4, 'Architecte', 15000);

INSERT INTO EQUIPE VALUES(4,3, 'Scrum Master', 20000);

R1.

SELECT titre FROM PROJET, EQUIPE

WHERE PROJET.idPROJET = EQUIPE.idPROJET

AND

idINGENIEUR = (SELECT idINGENIEUR FROM INGENIEUR WHERE nom = 'Amine Ben Hariz');

R2.

SELECT annee, Client, role as 'Role de Amine' FROM PROJET, EQUIPE

WHERE PROJET.idPROJET = EQUIPE.idPROJET

AND

idINGENIEUR = (SELECT idINGENIEUR FROM INGENIEUR WHERE nom = 'Amine Ben Hariz');
R3.

SELECT titre FROM PROJET

Where

Client = (SELECT Client FROM PROJET WHERE titre = 'Evax');

R4.

SELECT titre FROM PROJET

WHERE

(titre like 'si%') OR (titre like '%te%');

R5.

SELECT titre, annee FROM PROJET

ORDER BY annee desc;

R6.

SELECT count(idINGENIEUR) FROM EQUIPE

WHERE

idPROJET = (SELECT idPROJET FROM PROJET where titre = 'Evax');

R7.

SELECT nom FROM INGENIEUR

WHERE

idINGENIEUR NOT IN (SELECT idINGENIEUR FROM EQUIPE);

R8.

SELECT nom, AVG(salaire) FROM INGENIEUR, EQUIPE

WHERE

INGENIEUR.idINGENIEUR = EQUIPE.idINGENIEUR

GROUP BY EQUIPE.idINGENIEUR;

R9.
SELECT A1.nom, A2.nom, F1.salaire, F2.salaire

FROM INGENIEUR A1, INGENIEUR A2, EQUIPE F1, EQUIPE F2

WHERE

A1.idINGENIEUR = F1.idINGENIEUR

AND A2.idINGENIEUR = F2.idINGENIEUR

AND F1.salaire = F2.salaire

and F1.idINGENIEUR < F2.idINGENIEUR;

R10.

SELECT *, 2.5 * salaire as salaireDT FROM EQUIPE;


TPn°3 : Bases de données

Niveau : GL2 Année universitaire : 2021-2022

Objectif : Dans ce TP, nous allons nous familiariser avec l’utilisation des requêtes.

Question1. Exécuter le scipt suivant :

DROP SCHEMA IF EXISTS VOISINS; insert into VOISIN values (1, 3);
CREATE SCHEMA VOISINS; insert into VOISIN values (1, 2);
USE VOISINS; insert into VOISIN values (2, 4);
CREATE TABLE PERSONNE ( insert into VOISIN values (3, 9);
idPersonne INT primary key, insert into VOISIN values (4, 9);
nomPersonne TEXT, insert into VOISIN values (2, 6);
age INT insert into VOISIN values (6, 7);
); insert into VOISIN values (6, 10);
CREATE TABLE VOISIN ( insert into VOISIN values (6, 13);
idPersonne1 INT, insert into VOISIN values (7, 5);
idPersonne2 INT, insert into VOISIN values (7, 8);
primary key (idPersonne1 , idPersonne2), insert into VOISIN values (5, 8);
foreign key (idPersonne1) references Personne insert into VOISIN values (9, 11);
(idPersonne), insert into VOISIN values (9, 12);
foreign key (idPersonne2) references Personne insert into VOISIN values (11, 12);
(idPersonne) insert into VOISIN values (12, 15);
); insert into VOISIN values (10, 15);
insert into VOISIN values (15, 13);
CREATE TABLE COLLEGUE ( insert into VOISIN values (13, 16);
idPersonne1 INT, insert into VOISIN values (16, 14);
idPersonne2 INT,
primary key (idPersonne1 , idPersonne2),
foreign key (idPersonne1) references Personne
(idPersonne), insert into COLLEGUE values(2, 4);
foreign key (idPersonne2) references Personne insert into COLLEGUE values(4, 2);
(idPersonne) insert into COLLEGUE values(6, 4);
); insert into COLLEGUE values(11, 9);
insert into COLLEGUE values(9, 7);
insert into PERSONNE values (1, 'Soumaya', 19); insert into COLLEGUE values(8, 7);
insert into PERSONNE values (2, 'Farouk', 19); insert into COLLEGUE values(10, 13);
insert into PERSONNE values (3, 'Sami', 19); insert into COLLEGUE values(12, 15);
insert into PERSONNE values (4, 'Salma', 19); insert into COLLEGUE values(15, 12);
insert into PERSONNE values (5, 'Nadia', 14); insert into COLLEGUE values(14, 5);
insert into PERSONNE values (6, 'Adel', 12);
insert into PERSONNE values (7, 'Jamel', 10);
insert into PERSONNE values (8, 'Hanen', 16);
insert into PERSONNE values (9, 'Anis', 17);
insert into PERSONNE values (10, 'Aymen', 22);
insert into PERSONNE values (11, 'Anas', 21);
insert into PERSONNE values (12, 'Yasmine', 20);
insert into PERSONNE values (13, 'Iyed', 16);
insert into PERSONNE values (14, 'Foued', 19);
insert into PERSONNE values (15, 'Samira', 17);
insert into PERSONNE values (16, 'Ahmed', 17);

1
Question2.

1. La liste des noms des voisins de Soumaya.


2. La liste des noms des personnes avec des voisins plus jeunes qu’elles.
3. La liste des noms des personnes avec des voisins ayant le même âge. Le résultat doit être ordonné
par âge, puis par nom pour chaque tranche âge.
4. La liste des noms des personnes qui ont au moins deux collègues.
5. La liste des noms des personnes qui n’ont pas de collègue.
6. La liste des noms des voisins en commun des collègues mais qui ne sont pas voisins.
7. La différence entre le nombre des personnes et le nombre de majeures. Une personne est majeure si
elle a plus de 22 ans.
8. La liste des noms des personnes qui ont au moins un voisin et un collègue
9. Le nombre moyen des voisins par personne.
10. Le nombre des personnes qui sont voisins ou voisins des voisins de Salma.
11. Le nom et l’âge des personnes ayant le plus de voisins.
12. Pour chaque personne, la liste de ses collègues. Si A est un est un collègue de B et C un collègue de
B, C est un collègue de A.
13. La liste des trios de personnes différentes, d’âges différents, tels que la première personne est l’aînée,
la seconde est cadette et la troisième est la plus jeune. La requête doit retourner les noms de ces
personnes et non leur identifiants.
14. La liste des personnes ayant un collègue mais aucun voisin.

2
Correction TPn°3 : Bases de données
DROP SCHEMA IF EXISTS VOISINS;

CREATE SCHEMA VOISINS;

USE VOISINS;

CREATE TABLE PERSONNE (

idPersonne INT primary key,

nomPersonne TEXT,

age INT

);

CREATE TABLE VOISIN (

idPersonne1 INT,

idPersonne2 INT,

primary key (idPersonne1 , idPersonne2),

foreign key (idPersonne1) references Personne (idPersonne),

foreign key (idPersonne2) references Personne (idPersonne)

);

CREATE TABLE COLLEGUE (

idPersonne1 INT,

idPersonne2 INT,

primary key (idPersonne1 , idPersonne2),

foreign key (idPersonne1) references Personne (idPersonne),

foreign key (idPersonne2) references Personne (idPersonne)

);

insert into PERSONNE values (1, 'Soumaya', 19);

insert into PERSONNE values (2, 'Farouk', 19);

insert into PERSONNE values (3, 'Sami', 19);

insert into PERSONNE values (4, 'Salma', 19);

insert into PERSONNE values (5, 'Nadia', 14);


insert into PERSONNE values (6, 'Adel', 12);

insert into PERSONNE values (7, 'Jamel', 10);

insert into PERSONNE values (8, 'Hanen', 16);

insert into PERSONNE values (9, 'Anis', 17);

insert into PERSONNE values (10, 'Aymen', 22);

insert into PERSONNE values (11, 'Anas', 21);

insert into PERSONNE values (12, 'Yasmine', 20);

insert into PERSONNE values (13, 'Iyed', 16);

insert into PERSONNE values (14, 'Foued', 19);

insert into PERSONNE values (15, 'Samira', 17);

insert into PERSONNE values (16, 'Ahmed', 17);

insert into VOISIN values (1, 3);

insert into VOISIN values (1, 2);

insert into VOISIN values (2, 4);

insert into VOISIN values (3, 9);

insert into VOISIN values (4, 9);

insert into VOISIN values (2, 6);

insert into VOISIN values (6, 7);

insert into VOISIN values (6, 10);

insert into VOISIN values (6, 13);

insert into VOISIN values (7, 5);

insert into VOISIN values (7, 8);

insert into VOISIN values (5, 8);

insert into VOISIN values (9, 11);

insert into VOISIN values (9, 12);

insert into VOISIN values (11, 12);

insert into VOISIN values (12, 15);

insert into VOISIN values (10, 15);

insert into VOISIN values (15, 13);

insert into VOISIN values (13, 16);


insert into VOISIN values (16, 14);

insert into COLLEGUE values(2, 4);

insert into COLLEGUE values(4, 2);

insert into COLLEGUE values(6, 4);

insert into COLLEGUE values(11, 9);

insert into COLLEGUE values(9, 7);

insert into COLLEGUE values(8, 7);

insert into COLLEGUE values(10, 13);

insert into COLLEGUE values(12, 15);

insert into COLLEGUE values(15, 12);

insert into COLLEGUE values(14, 5);

R1.

SELECT nomPersonne FROM PERSONNE

WHERE idPersonne in (SELECT idPersonne2 FROM VOISIN

WHERE idPersonne1 = (SELECT idPersonne FROM PERSONNE

WHERE nomPersonne = 'Soumaya'));

R2.

SELECT nomPersonne FROM PERSONNE P

WHERE P.age > any (SELECT age FROM PERSONNE

WHERE idPersonne in (SELECT idPersonne2 FROM VOISIN

WHERE idPersonne1 = P.idPersonne)

OR idPersonne in (SELECT idPersonne1 FROM VOISIN

WHERE idPersonne2 = P.idPersonne));

R3.

SELECT distinct P1.nomPersonne, P1.age FROM PERSONNE P1, PERSONNE P2

WHERE P1.age = P2.age AND ((P1.idPersonne , P2.idPersonne) in (SELECT idPersonne1, idPersonne2


FROM VOISIN)
OR (P2.idPersonne , P1.idPersonne) in (SELECT idPersonne1, idPersonne2 FROM VOISIN))

ORDER BY P1.age , P1.nomPersonne;

R4.

SELECT idPersonne, nomPersonne FROM PERSONNE

Where (idPersonne in (SELECT idPersonne1 FROM COLLEGUE

GROUP BY idPersonne1

HAVING count(idPersonne1) >= 2))

OR (idPersonne in (SELECT idPersonne2 FROM COLLEGUE

GROUP BY idPersonne2

HAVING count(idPersonne2) >= 2))

OR (idPersonne in (SELECT idPersonne1 FROM COLLEGUE)

AND idPersonne in (SELECT idPersonne2 FROM COLLEGUE)

AND idPersonne NOT IN (SELECT P1.idPersonne1 FROM COLLEGUE P1, COLLEGUE


P2)

WHERE (P1.idPersonne1 = P2.idPersonne2

and P1.idPersonne2 = P2.idPersonne1)

OR (P2.idPersonne1 = P1.idPersonne2

and P2.idPersonne2 = P1.idPersonne1)));

R5.

SELECT nomPersonne FROM PERSONNE

where (idPersonne not in (SELECT idPersonne1 FROM COLLEGUE))

AND (idPersonne not in (SELECT idPersonne2 FROM COLLEGUE));

R6.

SELECT P3.nomPersonne as 'voisin en Commun'

FROM PERSONNE P1, PERSONNE P2, PERSONNE P3

WHERE (((P1.idPersonne , P2.idPersonne) in (SELECT idPersonne1, idPersonne2 FROM


COLLEGUE)

OR (P1.idPersonne , P2.idPersonne) in (SELECT idPersonne2, idPersonne1 FROM

COLLEGUE))

AND (P1.idPersonne , P2.idPersonne) not in (SELECT * FROM VOISIN)


AND (P2.idPersonne , P1.idPersonne) not in (SELECT * FROM VOISIN)

AND P1.idPersonne < P2.idPersonne)

AND (P3.idPersonne in (SELECT idPersonne1 FROM VOISIN where idPersonne2 = P1.idPersonne)

OR P3.idPersonne in (SELECT idPersonne2 FROM VOISIN where idPersonne1 = P1.idPersonne))

AND (P3.idPersonne in (SELECT idPersonne1 FROM VOISIN where idPersonne2 = P2.idPersonne)

OR P3.idPersonne in (SELECT idPersonne2 FROM VOISIN where idPersonne1 = P2.idPersonne));

R7.

SELECT (SELECT count(idPersonne) FROM PERSONNE) - (SELECT count(idPersonne) FROM PERSONNE

WHERE age >= 22);

-- ou tout simplement:

SELECT count(idPersonne) FROM PERSONNE

WHERE age < 21;

R8.

SELECT nomPersonne FROM PERSONNE

WHERE (idPersonne in (SELECT idPersonne1 FROM VOISIN)

OR idPersonne in (SELECT idPersonne2 FROM VOISIN)

AND (idPersonne in (SELECT idPersonne1 FROM COLLEGUE)

OR idPersonne in (SELECT idPersonne2 FROM COLLEGUE));

R9.

SELECT (SELECT count(idPersonne1) FROM VOISIN) DIV (SELECT count(idPersonne) FROM


PERSONNE) as Moyennevoisins;

R.10

SELECT count(idPersonne) FROM PERSONNE WHERE idPersonne in (SELECT idPersonne1 FROM


VOISIN WHERE idPersonne2 = (SELECT idPersonne FROMPERSONNE

WHERE nomPersonne = 'Salma'))

OR idPersonne in (SELECT idPersonne2 FROM VOISIN WHERE

idPersonne1 = (SELECT idPersonne FROM PERSONNE WHERE

nomPersonne = 'Salma'))

OR idPersonne in (SELECT idPersonne1 FROM VOISIN WHERE

idPersonne2 in (SELECT idPersonne FROM PERSONNE WHERE


idPersonne in (SELECT idPersonne1 FROM VOISIN WHERE

idPersonne2 = (SELECT idPersonne FROM PERSONNE WHERE

nomPersonne = 'Salma'))

OR idPersonne in (SELECT idPersonne2 FROM VOISIN WHERE

idPersonne1 = (SELECT idPersonne FROM PERSONNE WHERE

nomPersonne = 'Salma'))))

OR idPersonne in (SELECT idPersonne2 FROM VOISIN WHERE

idPersonne1 in (SELECT idPersonne FROM PERSONNE WHERE

idPersonne in (SELECT idPersonne1 FROM VOISIN WHERE

idPersonne2 = (SELECT idPersonne FROM PERSONNE WHERE

nomPersonne = 'Salma'))

OR idPersonne in (SELECT idPersonne2 FROM VOISIN WHERE

idPersonne1 = (SELECT idPersonne FROM PERSONNE WHERE

nomPersonne = 'Salma'))));

R11.

SELECT distinct P.nomPersonne, P.age, ((SELECT count(idPersonne1) FROM VOISIN

WHERE idPersonne1 = P.idPersonne) +

(SELECT count(idPersonne1) FROM VOISIN

WHERE idPersonne2 = P.idPersonne)) as nombrevoisins

from PERSONNE P HAVING nombrevoisins >= all (SELECT ((SELECT count(idPersonne1)

FROM VOISIN WHERE idPersonne1 = P.idPersonne) + (SELECT count(idPersonne1) FROM VOISIN

WHERE idPersonne2 = P.idPersonne)) as nombrevoisins from PERSONNE P);

R12.

SELECT P1.idPersonne, P1.nomPersonne, P2.idPersonne, P2.nomPersonne

FROM PERSONNE P1, PERSONNE P2 where P1.idPersonne < P2.idPersonne

AND (P2.idPersonne in (SELECT idPersonne2 FROM

COLLEGUE WHERE idPersonne1 = P1.idPersonne)

OR P2.idPersonne in (SELECT idPersonne1 FROM COLLEGUE

WHERE idPersonne2 = P1.idPersonne)

OR P2.idPersonne in (SELECT idPersonne1 FROM COLLEGUE


where idPersonne2 in (SELECT idPersonne2 FROM

COLLEGUE WHERE idPersonne1 = P1.idPersonne)

OR idPersonne2 in (SELECT idPersonne1 FROM COLLEGUE WHERE idPersonne2 = P1.idPersonne)

OR P2.idPersonne in (SELECT idPersonne2 FROM COLLEGUE where idPersonne1 in (SELECT

idPersonne2 FROM COLLEGUE WHERE idPersonne1 = P1.idPersonne)

OR idPersonne1 in (SELECT idPersonne1 FROM COLLEGUE WHERE idPersonne2 = P1.idPersonne))));

R13.

SELECT distinct P1.nomPersonne, P1.age, P2.nomPersonne, P2.age, P3.nomPersonne, P3.age FROM

PERSONNE P1, PERSONNE P2, PERSONNE P3 WHERE

P1.age > P2.age AND P2.age > P3.age AND P1.idPersonne < P2.idPersonne

AND P2.idPersonne < P3.idPersonne;

R14.

SELECT idPersonne FROM PERSONNE WHERE (idPersonne in (SELECT idPersonne1 FROM

COLLEGUE) OR idPersonne in (SELECT idPersonne2

FROM COLLEGUE))

AND (idPersonne not in (SELECT idPersonne1 FROM

VOISIN))

AND (idPersonne not in (SELECT idPersonne2 FROM

VOISIN));
TPn°4 : Bases de données

Niveau : GL2 Année universitaire : 2021-2022

Objectif : Dans ce TP, nous allons créer des déclencheurs SQL

Reprenons la base du TP2.

Partie 1. Les déclencheurs

1. Créer un déclencheur qui après l’insertion d’une personne dans la table PERSONNE, créer un
‘VOISIN’ entre cette personne et Soumaya. Vérifier que le déclencheur marche convenablement en
insérant une nouvelle personne et en vérifiant qu’elle devient voisine de Soumaya.

2. Créer un déclencheur qui avant l’insertion d’une personne dans la table PERSONNE, vérifie que son
nom n’existe pas. Si le nom existe, un message d’erreur s’affiche. Vérifier que le déclencheur marche
correctement.

3. Créer un déclencheur qui après l’insertion de deux personnes dans la table COLLEGUE, crée un lien
de ‘VOISIN’ entre ces deux personnes, s’il n’existe pas déjà. Si on insère la paire (P1,P2) dans la
table COLLEGUE, on doit retrouver soit la paire (P1,P2), soit la paire (P2,P1) dans la table VOISIN.
Vérifier que le déclencheur marche correctement en insérant une nouvelle ligne dans COLLEGUE.

4. Créer un déclencheur, qui avant l’insertion dans la table COLLEGUE d’une paire (P1,P2) vérifie que
cette paire n’existe pas dans la table COLLEGUE, ni sous la forme (P1,P2) ni sous la forme (P2,P1).
Si la paire existe, elle n’est pas insérée et un message d’erreur s’affiche. Vérifier que le déclencheur
est correct.

5. Créer un déclencheur qui supprime le lien de ‘VOISIN’ entre deux personnes, si le lien de
COLLEGUE entre ces deux personnes est supprimé. Si la paire (P1,P2) n’est plus dans COLLEGUE,
la paire est automatiquement supprimée de VOISIN. Vérifier que le déclencheur est correct en
supprimant une paire qui existe dans les deux tables.

6. Créer un déclencheur qui supprime toutes les références à une personne dans les deux tables
COLLEGUE et VOISIN si cette personne est supprimée.

Partie 2. Intégrité référentielle

1. Supprimer les clés étrangères de la table VOISIN.

1
2. Créer un déclencheur qui implémente le comportement des clés étrangères supprimées par la requête
précédente. Si une paire (P1,P2) est insérée dans VOISIN, le déclencheur s’assure que P1 et P2 se
trouvent dans PERSONNE.

3. Créer un déclencheur qui implémente la cascade des mises mise à jour à partir de la table PERSONNE
vers la table VOISIN. Si l’identifiant d’une personne x change et qu’elle existe dans la table VOISIN,
son identifiant est automatiquement mis à jour.

4. Créer un déclencheur qui implémente la cascade des suppressions à partir de la table PERSONNE
vers la table VOISIN. Si l’identifiant d’une personne P1 est supprimé et qu’elle existe dans la table
VOISIN, son identifiant est mis à jour automatiquement.

2
Correction TPn°4 : Bases de données

R1.

CREATE TRIGGER R1

AFTER INSERT ON PERSONNE

FOR EACH ROW

INSERT INTO VOISIN VALUES (NEW.idPersonne, 1);

-- Vérification

INSERT INTO PERSONNE VALUES (17, 'Soumaya', 17);

INSERT INTO VOISIN VALUES (17, 1);

SELECT * FROM VOISIN WHERE idPersonne2 = 1

R2.

CREATE TRIGGER R2

BEFORE INSERT ON PERSONNE

FOR EACH ROW

IF exists(SELECT nomPersonne FROM PERSONNE WHERE nomPersonne = NEW.nomPersonne)

THEN

signal sqlstate '45000' set message_text = 'Tentative d''insertion d''un nom qui existe';

END IF;

-- Vérification

INSERT INTO PERSONNE VALUES (18, 'Soumaya', 28);

SELECT

FROM

PERSONNE;

R3.

CREATE TRIGGER R31

AFTER INSERT ON COLLEGUE

FOR EACH ROW


IF

(NOT EXISTS( SELECT

idPersonne1, idPersonne2

FROM

VOISIN

WHERE

idPersonne1 = NEW.idPersonne1

AND idPersonne2 = NEW.idPersonne2))

AND

(NOT EXISTS( SELECT

idPersonne1, idPersonne2

FROM

VOISIN

WHERE

idPersonne2 = NEW.idPersonne1

AND idPersonne1 = NEW.idPersonne2))

THEN

INSERT INTO VOISIN VALUES (NEW.idPersonne1, NEW.idPersonne2);

END IF;

$$

DELIMITER ;

-- Vérification

INSERT INTO COLLEGUE VALUES (15,3);

SELECT *

FROM

VOISIN

WHERE idPersonne1 = 15;


R4.

CREATE TRIGGER R4

BEFORE INSERT ON COLLEGUE

FOR EACH ROW

IF

(EXISTS( SELECT

idPersonne1, idPersonne2

FROM

COLLEGUE

WHERE

idPersonne1 = NEW.idPersonne1

AND idPersonne2 = NEW.idPersonne2))

OR

(EXISTS( SELECT

idPersonne1, idPersonne2

FROM

COLLEGUE

WHERE

idPersonne2 = NEW.idPersonne1

AND idPersonne1 = NEW.idPersonne2))

THEN

signal sqlstate '45000'

set message_text = 'Tentative d''insertion d''une paire de personnes dans COLLEGUE


qui existe.';

END IF;

-- Vérification

INSERT INTO COLLEGUE VALUES (4,6);


R5.

CREATE TRIGGER R5

AFTER DELETE ON COLLEGUE

FOR EACH ROW BEGIN

IF

(EXISTS( SELECT

idPersonne1, idPersonne2

FROM

VOISIN

WHERE

idPersonne1 = OLD.idPersonne1

AND idPersonne2 = OLD.idPersonne2))

THEN

DELETE FROM VOISIN

WHERE

idPersonne1 = OLD.idPersonne1

AND idPersonne2 = OLD.idPersonne2;

END IF;

IF

(EXISTS( SELECT

idPersonne1, idPersonne2

FROM

VOISIN

WHERE

idPersonne2 = OLD.idPersonne1

AND idPersonne1 = OLD.idPersonne2))

THEN

DELETE FROM VOISIN


WHERE

idPersonne1 = OLD.idPersonne2

AND idPersonne2 = OLD.idPersonne1;

END IF;

END;

-- Vérification

INSERT INTO COLLEGUE VALUES (1,17);

INSERT INTO VOISIN VALUES (1,17);

DELETE FROM COLLEGUE

WHERE

idPersonne1 = 1 AND idPersonne2 = 17;

SELECT * FROM VOISIN;

R6.

CREATE TRIGGER R6

BEFORE DELETE ON PERSONNE

FOR EACH ROW BEGIN

IF exists(SELECT idPersonne1 FROM VOISIN WHERE idPersonne1 = OLD.idPersonne)

THEN

DELETE FROM VOISIN WHERE idPersonne1 = OLD.idPersonne;

END IF;

IF exists(SELECT idPersonne2 FROM VOISIN WHERE idPersonne2 = OLD.idPersonne)

THEN

DELETE FROM VOISIN WHERE idPersonne2 = OLD.idPersonne;

END IF;

IF exists(SELECT idPersonne1 FROM COLLEGUE WHERE idPersonne1 = OLD.idPersonne)

THEN

DELETE FROM COLLEGUE WHERE idPersonne1 = OLD.idPersonne;

END IF;

IF exists(SELECT idPersonne2 FROM COLLEGUE WHERE idPersonne2 = OLD.idPersonne)


THEN

DELETE FROM COLLEGUE WHERE idPersonne2 = OLD.idPersonne;

END IF;

END;

DELETE FROM PERSONNE WHERE idPersonne = 14;

-- Intégrité référentielle

R1.

ALTER TABLE VOISIN DROP FOREIGN KEY VOISIN_ibfk_1;

ALTER TABLE VOISIN DROP FOREIGN KEY VOISIN_ibfk_2;

INSERT INTO VOISIN VALUES (20,30);

SELECT * FROM VOISIN;

DELETE FROM VOISIN WHERE idPersonne1 = 20;

R2.

CREATE TRIGGER R7

BEFORE INSERT ON VOISIN

FOR EACH ROW

IF (NOT exists(SELECT idPersonne FROM PERSONNE WHERE idPersonne = NEW.idPersonne1))

OR (NOT exists(SELECT idPersonne FROM PERSONNE WHERE idPersonne = NEW.idPersonne2))

THEN signal sqlstate '45000'

set message_text = 'Tentative d''insertion d''une personne qui n''existe pas.';

END IF;

R3.

DROP TRIGGER IF EXISTS R8;

CREATE TRIGGER R8

AFTER UPDATE ON PERSONNE

FOR EACH ROW

IF (exists(SELECT idPersonne1, idPersonne2 FROM VOISIN

WHERE idPersonne1 = OLD.idPersonne OR idPersonne2 = OLD.idPersonne))

THEN

UPDATE VOISIN SET idPersonne1 = NEW.idPersonne WHERE idPersonne1 = OLD.idPersonne;

UPDATE VOISIN SET idPersonne2 = NEW.idPersonne WHERE idPersonne2 = OLD.idPersonne;


END IF;

-- Verification

UPDATE PERSONNE SET idPersonne = 20 WHERE idPersonne = 16;

SELECT * FROM VOISIN;

R4.

CREATE TRIGGER R9

AFTER DELETE ON PERSONNE

FOR EACH ROW

IF (exists(SELECT idPersonne1, idPersonne2 FROM VOISIN

WHERE idPersonne1 = OLD.idPersonne OR idPersonne2 = OLD.idPersonne))

THEN

DELETE FROM VOISIN WHERE idPersonne1 = OLD.idPersonne;

DELETE FROM VOISIN WHERE idPersonne2 = OLD.idPersonne;

END IF;

-- Verification

DELETE FROM PERSONNE WHERE idPersonne = 20;

SELECT * FROM VOISIN;


TPn°5 : Bases de données

Niveau : GL2 Année universitaire : 2021-2022

Objectif : Dans ce TP, nous allons se familiariser avec les déclencheurs SQL, découvrir les
transactions..

1. Créer la base de données suivante :

Employe(idEmp, nomEmp, dateN, salaire, idDept, dateEmbauche)

Departement(idDept, nomDept, id, nbrEmployes)

Projet(idProj, nomProj, idDept)

Travaille(idEmp, idProj, heures)

2. Désactiver le commit automatique SET autocommit = off


3. Essayer de faire des insertions et des modifications dans la base de données. L’effet de commit et de
rollback ?

Pour ce qui suit, faire un commit ou un rollback (exécution/annulation)

Créer un déclencheur pour vérifier à l’insertion que :

• un employé est majeur.


• Un manager d’un département est plus agé que ses employés.
• Le salaire d’un employé < au salaire de son manager.
• Le manager d’un département doit être un employé de ce département.
• La date de naissance < à la date d’embauche.
• Un employé travaille sur 1 ou 2 projets
• Un employé travaille entre 20 et 40 heures par semaine sur tous les projets.
• Le manager d’un département travaille sur tous les projets de son département au moins 1 heure.

1
Correction TPn°5 : Bases de données

R1.

DROP SCHEMA IF EXISTS TRAVAIL;

CREATE SCHEMA TRAVAIL;

USE TRAVAIL;

-- SELECT DATEDIFF(CURDATE(), '1986-01-17') / 365;

CREATE TABLE EMPLOYE (

id int,

nomEmp text,

dateN date,

salaire int,

idDept int,

dateEmbauche date,

PRIMARY KEY (id)

);

CREATE TABLE DEPARTEMENT (

idDept int,

nomDept text,

idEmp int,

nbrEmployes int,

PRIMARY KEY (idDept)

);

CREATE TABLE PROJET (

idProj int,

nomProj text,

idDept int,
PRIMARY KEY (idProj),

FOREIGN KEY (idDept)

REFERENCES DEPARTEMENT (idDept)

);

CREATE TABLE TRAVAILLE (

idEmp int,

idProj int,

heures int,

PRIMARY KEY (idEmp , idProj),

FOREIGN KEY (idProj)

REFERENCES PROJET (idProj)

);

R2.

set autocommit = off;

R3.

INSERT INTO EMPLOYE VALUES (1,'Janette','1965-12-12', 1000, 5,'2012-12-12');

INSERT INTO DEPARTEMENT VALUES (5, 'Informatique', 1, 1);

COMMIT;

INSERT INTO EMPLOYE VALUES (2, 'Sana', '1985-12-12', 1000, 5, '2012-12-12');

ROLLBACK;

SELECT * FROM EMPLOYE;

R4.

CREATE TRIGGER INSERT_EMPLOYE

BEFORE INSERT ON EMPLOYE

FOR EACH ROW BEGIN

IF ((DATEDIFF(CURDATE(), NEW.dateN)) < 21*365) THEN

SIGNAL SQLSTATE '45000' SET message_text = 'Employe non majeur';

ELSE IF

(SELECT DATEDIFF(CURDATE(), NEW.dateN)) > (SELECT

(DATEDIFF(CURDATE(), dateN))
FROM EMPLOYE WHERE

id = (SELECT idEmp FROM DEPARTEMENT

WHERE idDept = NEW.idDept))

THEN

SIGNAL SQLSTATE '45000' SET message_text = 'Employe plus age que son manager';

-- Le salaire d’un employe est inferieur au salaire de son manager.

ELSE IF NEW.salaire >

(SELECT salaire FROM EMPLOYE WHERE id = (SELECT

idEmp

FROM

DEPARTEMENT

WHERE

idDept = NEW.idDept))

THEN

SIGNAL SQLSTATE '45000' SET message_text = 'Le salaire de l''employe est supérieur à celui de son
manager';

-- La date d’embauche est anterieure a la date de naissance.

ELSE

IF DATEDIFF(NEW.dateN,NEW.dateEmbauche) > 0 THEN

SIGNAL SQLSTATE '45000' SET message_text = 'La date de naissance doit etre anterieure a la date
d''embauche';

END IF;

END IF;

END IF;

END IF;

-- 9. Le nombre d’employ ́es nbrEmployes d’un d ́epartement est d é duit

-- `a partir de la table Employe.

UPDATE DEPARTEMENT SET nbrEmployes = nbrEmployes + 1 WHERE idDept = NEW.idDept;

END;

$$

DELIMITER ;
DROP TRIGGER IF EXISTS UPDATE_EMPLOYE;

DELIMITER $$

CREATE TRIGGER UPDATE_EMPLOYE

BEFORE UPDATE ON EMPLOYE

FOR EACH ROW BEGIN

-- Un employe est majeur

IF ((DATEDIFF(CURDATE(), NEW.dateN)) < 21*365) THEN

SIGNAL SQLSTATE '45000' SET message_text = 'Employe non majeur';

ELSE IF

-- Un manager est plus age que ses employes

(SELECT DATEDIFF(CURDATE(), NEW.dateN)) > (SELECT

(DATEDIFF(CURDATE(), dateN))

FROM

EMPLOYE

WHERE

id = (SELECT

idEmp

FROM

DEPARTEMENT

WHERE

idDept = NEW.idDept))

THEN

SIGNAL SQLSTATE '45000' SET message_text = 'Employe plus age que son manager';

-- Le salaire d’un employe est inferieur au salaire de son manager.

ELSE IF NEW.salaire >

(SELECT salaire FROM EMPLOYE WHERE id = (SELECT

idEmp

FROM

DEPARTEMENT
WHERE

idDept = NEW.idDept))

THEN

SIGNAL SQLSTATE '45000' SET message_text = 'Le salaire de l''employe est supérieur à celui de son
manager';

-- La date d’embauche est anterieure a la date de naissance.

ELSE

IF DATEDIFF(NEW.dateN,NEW.dateEmbauche) > 0 THEN

SIGNAL SQLSTATE '45000' SET message_text = 'La date de naissance doit etre anterieure a la date
d''embauche';

END IF;

END IF;

END IF;

END IF;

-- 9. Le nombre d’employ ́es nbrEmployes d’un d ́epartement est d é duit

-- `a partir de la table Employe.

UPDATE DEPARTEMENT SET nbrEmployes = nbrEmployes + 1 WHERE idDept = NEW.idDept;

END;

$$

DELIMITER ;

-- 9. Le nombre d’employ ́es nbrEmployes d’un d ́epartement est d é duit

-- `a partir de la table Employe.

DROP TRIGGER IF EXISTS DELETE_EMPLOYE;

DELIMITER $$

CREATE TRIGGER DELETE_EMPLOYE

BEFORE DELETE ON EMPLOYE

FOR EACH ROW

UPDATE DEPARTEMENT SET nbrEmployes = nbrEmployes - 1 WHERE idDept = OLD.idDept;

$$
DELIMITER ;

-- 5 Un manager est plus age que ses employes

INSERT INTO EMPLOYE VALUES (3, 'Bonnie', '1955-01-17', 1000, 5, '2012-12-12');

-- 4 Un employe est majeur

INSERT INTO EMPLOYE VALUES (4, 'Yasmina', '1994-01-17', 1000, 5, '2012-12-12');

-- 6 Le salaire d’un employe est inferieur au salaire de son manager.

INSERT INTO EMPLOYE VALUES (4, 'Yasmina', '1966-01-17', 2000, 5, '2012-12-12');

SELECT * FROM DEPARTEMENT;

DROP TRIGGER IF EXISTS INSERT_DEPARTEMENT;

DELIMITER $$

CREATE TRIGGER INSERT_DEPARTEMENT

BEFORE INSERT ON DEPARTEMENT

FOR EACH ROW BEGIN

-- 7. Le manager d’un department doit etre un employe de ce department.

IF (SELECT idDept FROM EMPLOYE WHERE id = NEW.idEmp) <> NEW.idDept THEN

SIGNAL SQLSTATE '45000' SET message_text = 'Le manager d’un department doit etre un employe de
ce department';

END IF;

-- 9. Le nombre d’employ ́es nbrEmployes d’un d ́epartement est d é duit

-- `a partir de la table Employe.

IF ((SELECT COUNT(id) FROM EMPLOYE WHERE idDept = NEW.idDept) != NEW.nbrEmployes)

THEN

SIGNAL SQLSTATE '45000' SET message_text = 'Le nombre d''employes n''est pas correct.';

END IF;

END;

$$

DELIMITER ;
-- 7. Le manager d’un department doit etre un employe de ce department.

INSERT INTO DEPARTEMENT VALUES (1,'Info',1,0);

DROP TRIGGER IF EXISTS UPDATE_DEPARTEMENT;

DELIMITER $$

CREATE TRIGGER UPDATE_DEPARTEMENT

BEFORE UPDATE ON DEPARTEMENT

FOR EACH ROW BEGIN

-- 7. Le manager d’un department doit etre un employe de ce department.

IF (SELECT idDept FROM EMPLOYE WHERE id = NEW.idEmp) <> NEW.idDept THEN

SIGNAL SQLSTATE '45000' SET message_text = 'Le manager d’un department doit etre un employe de
ce department';

END IF;

-- 9. Le nombre d’employ ́es nbrEmployes d’un d ́epartement est d é duit

-- `a partir de la table Employe.

IF ((SELECT COUNT(id) FROM EMPLOYE WHERE idDept = NEW.idDept) != NEW.nbrEmployes)

THEN

SIGNAL SQLSTATE '45000' SET message_text = 'Le nombre d''employes n''est pas correct.';

END IF;

END;

$$

DELIMITER ;

SELECT * FROM DEPARTEMENT;

UPDATE DEPARTEMENT SET nbrEmployes = 2 WHERE idDept = 5;

INSERT INTO DEPARTEMENT VALUES (6, 'Psychologie', 1, 10);

INSERT INTO EMPLOYE VALUES (4, 'Yasmina', '1986-01-17', 1000, 5, '2012-01-17');

DELETE FROM EMPLOYE WHERE id = 4;


INSERT INTO DEPARTEMENT VALUES (5, 'Informatique', 1, 2);

-- 9. Le nombre d’employ ́es nbrEmployes d’un d ́epartement est d é duit

-- `a partir de la table Employe.

-- a chaque insertion d'employe, mettre à jour le count :-)

INSERT INTO EMPLOYE VALUES (5, 'Raphael', '1986-01-17', 1000, 5, '2011-01-17');

DELETE FROM EMPLOYE WHERE id = 5;

SELECT

FROM

DEPARTEMENT;

INSERT INTO DEPARTEMENT VALUES (6, 'Informatique', NULL, 0);

INSERT INTO EMPLOYE VALUES (6, 'John', '1986-01-17', 1000, 6, '2012-01-17');

DELETE FROM DEPARTEMENT

WHERE

idDept = 6;

-- 10. Un employe peut travailler au plus sur 4 projets

SELECT

FROM

PROJET;

INSERT INTO PROJET VALUES (1, 'Projet1', 5);

INSERT INTO PROJET VALUES (2, 'Projet2', 5);

INSERT INTO PROJET VALUES (3, 'Projet3', 5);

INSERT INTO PROJET VALUES (4, 'Projet4', 5);


INSERT INTO PROJET VALUES (5, 'Projet5', 5);

INSERT INTO TRAVAILLE VALUES (1,1,5);

DROP TRIGGER IF EXISTS INSERT_TRAVAILLE;

DELIMITER $$

CREATE TRIGGER INSERT_TRAVAILLE

BEFORE INSERT ON TRAVAILLE

FOR EACH ROW BEGIN

-- 10. Un employe peut travailler au plus sur 4 projets

IF (SELECT count(idProj) FROM TRAVAILLE WHERE idEmp = NEW.idEmp) >= 4 THEN

SIGNAL SQLSTATE '45000' SET message_text = 'L''employe travaille deja sur 4 projets.';

END IF;

-- 11. L’employ é d’un d ́epartement d1 ne peut pas travailler sur un projet du d é partement d2 si
d1 ̸= d2.

IF (SELECT idDept FROM PROJET WHERE idProj = NEW.idProj)

<> (SELECT idDept FROM EMPLOYE WHERE id = NEW.idEmp)

THEN SIGNAL SQLSTATE '45000' SET message_text

= 'L’employe d’un departement ne peut pas travailler sur un projet d''un autre departement';

END IF;

-- 12. Un employ ́e travaille au moins 20 heures par semaine et au plus 40 heures par semaine sur
tous les projets.

IF ((SELECT SUM(heures) FROM TRAVAILLE WHERE idEmp = NEW.idEmp) + NEW.heures) < 20

THEN SIGNAL SQLSTATE '45000' SET message_text

= 'Un employe travaille au moins 20 heures par semaine';

END IF;

IF ((SELECT SUM(heures) FROM TRAVAILLE WHERE idEmp = NEW.idEmp) + NEW.heures) > 40

THEN SIGNAL SQLSTATE '45000' SET message_text

= 'Un employ ́e travaille au plus 40 heures par semaine';

END IF;

END;
$$

DELIMITER ;

DROP TRIGGER IF EXISTS UPDATE_TRAVAILLE;

DELIMITER $$

CREATE TRIGGER UPDATE_TRAVAILLE

BEFORE UPDATE ON TRAVAILLE

FOR EACH ROW BEGIN

-- 10. Un employe peut travailler au plus sur 4 projets

IF (SELECT count(idProj) FROM TRAVAILLE WHERE idEmp = NEW.idEmp) >= 4 THEN

SIGNAL SQLSTATE '45000' SET message_text = 'L''employe travaille deja sur 4 projets.';

END IF;

-- 11. L’employ é d’un d ́epartement d1 ne peut pas travailler sur un projet du d é partement d2 si
d1 ̸= d2.

IF (SELECT idDept FROM PROJET WHERE idProj = NEW.idProj)

<> (SELECT idDept FROM EMPLOYE WHERE id = NEW.idEmp)

THEN SIGNAL SQLSTATE '45000' SET message_text

= 'L’employe d’un departement ne peut pas travailler sur un projet d''un autre departement';

END IF;

-- 12. Un employ ́e travaille au moins 20 heures par semaine et au plus 40 heures par semaine sur
tous les projets.

IF ((SELECT SUM(heures) FROM TRAVAILLE WHERE idEmp = NEW.idEmp) + NEW.heures) < 20

THEN SIGNAL SQLSTATE '45000' SET message_text

= 'Un employe travaille au moins 20 heures par semaine';

END IF;

IF ((SELECT SUM(heures) FROM TRAVAILLE WHERE idEmp = NEW.idEmp) + NEW.heures) > 40

THEN SIGNAL SQLSTATE '45000' SET message_text

= 'Un employ ́e travaille au plus 40 heures par semaine';

END IF;

END;

$$

DELIMITER ;
INSERT INTO TRAVAILLE VALUES (1,2,20);

INSERT INTO TRAVAILLE VALUES (1,3,1);

INSERT INTO TRAVAILLE VALUES (1,4,1);

INSERT INTO TRAVAILLE VALUES (1,1,1);

SELECT

FROM

TRAVAILLE;

-- 11. L’employ é d’un d ́epartement d1 ne peut pas travailler sur un projet du d é partement d2 si
d1 ̸= d2.

INSERT INTO TRAVAILLE VALUES (6,5,10);

-- 12. Un employ ́e travaille au moins 20 heures par semaine et au plus 40 heures par semaine sur
tous les projets.

INSERT INTO TRAVAILLE VALUES (1,4,11);

R13.

DROP TRIGGER IF EXISTS INSERT_PROJET;

CREATE TRIGGER INSERT_PROJET

AFTER INSERT ON PROJET

FOR EACH ROW BEGIN

IF NOT EXISTS (SELECT idEmp FROM TRAVAILLE WHERE idEmp = (SELECT idEmp FROM
DEPARTEMENT WHERE idDept = NEW.idDept)

and idProj = NEW.idProj)

THEN

INSERT INTO TRAVAILLE VALUES


((SELECT idEmp FROM DEPARTEMENT WHERE idDept = NEW.idDept), NEW.idProj, 2);

ELSE

IF (SELECT heures FROM TRAVAILLE WHERE idProj = NEW.idProj

AND idEmp = (SELECT idEmp FROM DEPARTEMENT WHERE idDept = NEW.idDept)) < 2

THEN

UPDATE TRAVAILLE SET heures = 1

WHERE idProj = NEW.idProj AND idEmp = (SELECT idEmp FROM DEPARTEMENT WHERE idDept =
NEW.idDept);

END IF;

END IF;

END;

DELETE FROM TRAVAILLE WHERE idProj = 4;

INSERT INTO TRAVAILLE VALUES (1,4,20);

INSERT INTO PROJET VALUES (6, 'Projet6', 5);

SELECT *FROM TRAVAILLE;

-- ALTER TABLE EMPLOYE ADD FOREIGN KEY (idDept) REFERENCES DEPARTEMENT (idDept);

-- ALTER TABLE DEPARTEMENT ADD FOREIGN KEY (idEmp) REFERENCES EMPLOYE (id);
TPn°6 : Bases de données

Niveau : GL2 Année universitaire : 2021-2022

Objectif : Dans ce TP, nous allons se familiariser les niveaux d’isolation dans SQL

Reprenons la base du TP3.

Question 1.

1. S’assurer que autocommit est à off, vérifier le niveau d’isolation et le changer en READ
COMMITTED.
2. Ouvrir une nouvelle connexion C 1 .
3. Commencer une transaction T 1 dans C 1 qui change le nom de Soumaya en ’Baya’ (sans commit)
4. Faire une sélection de la personne avec l’identifiant 1.
5. Ouvrir une seconde connexion C 2
6. Commencer une transaction T 2 dans C 2 qui sélectionne le nom de la personne avec l’identifiant 1.
Que remarquez-vous et pourquoi?
7. Dans T 2 , ajouter une requête qui change le nom de Soumaya en ’Rana’. Est-ce que cela est possible?
Justifiez votre réponse. En déduire le niveau d’isolation dans MySQL.
8. Faire un commit de T 1 dans C 1 .
9. Exécuter T 2 à nouveau. Que se passe-t-il? Justifier votre réponse.

Question 2.

1. Ouvrir une nouvelle connexion C1.


2. Commencer une transaction T1 dans C1
3. Ajouter la ligne (1,12) à la table VOISIN et supprimer la ligne (4,9).
4. Ouvrir une nouvelle connexion C2.
5. Mettre le niveau d’isolation de la transaction à “READ UNCOMMITTED”
6. Commencer une transaction T2 dans C2 qui affiche la liste des voisins. Les lignes (1,12) et (4,9) se
trouvent-elles? Justifier la réponse.
7. Mettre le niveau d’isolation à “READ COMMITTED”.
8. Commencer une transaction T3 dans C2 qui affiche la liste des voisins. Les lignes (1,12) et (4,9) se
trouvent-elles? Justifier la réponse.
9. Faire un commit de T1 dans C1.
10. Mettre le niveau d’isolation à “READ COMMITTED”.
11. Commencer une transaction T4 dans C2 qui affiche la liste des voisins. Les lignes lignes (1,12) et
(4,9) se trouvent-elles? Justifier la réponse.

1
TPn°7 : Bases de données

Niveau : GL2 Année universitaire : 2021-2022

Objectif : Dans ce TP, nous allons voir comment créer des vues et les interroger sous MySQL

1. Créer le schéma suivant :

ARTICLE(idArticle, nomArticle),

UNIVERSITE(idUniversite, nomUniversite)

CHERCHEUR(idChercheur, nomChercheur, idArticle, idUniversite)

2. Remplir les tables

3. Créer une vue INSAT qui affiche les chercheurs de L’INSAT.

4. Retourner le contenu de la vue.

5. Modifier le nom d’un des chercheurs de L’INSAT dans la table CHERCHEUR. Vérifier
que la vue a changé.

6. Insérer un nouveau chercheur de L’INSAT dans la table CHERCHEUR et vérifier le


contenu de INSAT a bien changé.

7. Modifier le nom d’un chercheur dans la vue.

8. Lister le contenu de la table CHERCHEUR, conclusion?

9. Créer une vue Universites qui affiche les noms des chercheurs avec les noms de leurs
universités et les identifiants de leurs articles.

10. Afficher le contenu de la vue.

11. Afficher les noms des chercheurs ayant contribué à un article (en utilisant la vue).

12. Afficher les noms des chercheurs travaillant à L’INSAT.

13. Afficher les noms des articles des chercheurs de L’INSAT à partir de la vue Universites et
de la table ARTICLE.
1
14. Créer une vue à partir de Universités qui affiche les noms des chercheurs, les noms de
leurs universités, ainsi que les noms de leurs articles.

15. Afficher le contenu de la vue.

Travail à rendre :

Exécuter le script Exercice.sql pour créer la base de données suivante (voir email du groupe :
ING_GL2_unicar):

ARTICLE(idArticle, titre, annee, auteur)

EXAMINATEUR(idExaminateur, nom)

DECISION(idExaminateur, idArticle, vote, dateV)

1. Créer une vue qui affiche, pour chaque article, le titre de l’article et la différence entre le meilleur
et le pire vote associés à l’article. Trier la liste.

2. Créer une vue qui affiche la différence entre la moyenne des votes des articles publiés entre
2010 et 2020 et ceux publiés après 2020.

3. Créer une vue pour les auteurs qui affiche les titres de leurs articles et leur nom. La liste doit
être triée par nom, puis par année.

4. Créer une vue qui affiche l’article qui possède la plus grande moyenne de votes.

5. Créer une vue qui affiche l’article qui possède la plus petite moyenne de votes.

6. Créer une vue qui affiche, pour chaque auteur, le nom de l’auteur avec les titres de ses articles
qui ont reçu le meilleur vote.

Vous aimerez peut-être aussi