Académique Documents
Professionnel Documents
Culture Documents
Base de données
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”
– 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’’)}.
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
);
R1.
R2.
R3.
R4.
R5.
CREATE TABLE ACTEUR ( idActeur INT NOT NULL, nom TEXT NOT NULL, prenom TEXT NOT NULL,
CONSTRAINT pk1 PRIMARY KEY (idActeur));
R6.
R7.
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.
Objectif : Dans ce TP, nous allons nous familiariser avec l’utilisation des requêtes.
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.
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”.
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
USE START-UP;
);
);
R1.
AND
idINGENIEUR = (SELECT idINGENIEUR FROM INGENIEUR WHERE nom = 'Amine Ben Hariz');
R2.
AND
idINGENIEUR = (SELECT idINGENIEUR FROM INGENIEUR WHERE nom = 'Amine Ben Hariz');
R3.
Where
R4.
WHERE
R5.
R6.
WHERE
R7.
WHERE
R8.
WHERE
INGENIEUR.idINGENIEUR = EQUIPE.idINGENIEUR
GROUP BY EQUIPE.idINGENIEUR;
R9.
SELECT A1.nom, A2.nom, F1.salaire, F2.salaire
WHERE
A1.idINGENIEUR = F1.idINGENIEUR
R10.
Objectif : Dans ce TP, nous allons nous familiariser avec l’utilisation des requêtes.
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.
2
Correction TPn°3 : Bases de données
DROP SCHEMA IF EXISTS VOISINS;
USE VOISINS;
nomPersonne TEXT,
age INT
);
idPersonne1 INT,
idPersonne2 INT,
);
idPersonne1 INT,
idPersonne2 INT,
);
R1.
R2.
R3.
R4.
GROUP BY idPersonne1
GROUP BY idPersonne2
OR (P2.idPersonne1 = P1.idPersonne2
R5.
R6.
COLLEGUE))
R7.
-- ou tout simplement:
R8.
R9.
R.10
nomPersonne = 'Salma'))
nomPersonne = 'Salma'))
nomPersonne = 'Salma'))))
nomPersonne = 'Salma'))
nomPersonne = 'Salma'))));
R11.
R12.
R13.
P1.age > P2.age AND P2.age > P3.age AND P1.idPersonne < P2.idPersonne
R14.
FROM COLLEGUE))
VOISIN))
VOISIN));
TPn°4 : Bases de données
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.
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
-- Vérification
R2.
CREATE TRIGGER R2
THEN
signal sqlstate '45000' set message_text = 'Tentative d''insertion d''un nom qui existe';
END IF;
-- Vérification
SELECT
FROM
PERSONNE;
R3.
idPersonne1, idPersonne2
FROM
VOISIN
WHERE
idPersonne1 = NEW.idPersonne1
AND
idPersonne1, idPersonne2
FROM
VOISIN
WHERE
idPersonne2 = NEW.idPersonne1
THEN
END IF;
$$
DELIMITER ;
-- Vérification
SELECT *
FROM
VOISIN
CREATE TRIGGER R4
IF
(EXISTS( SELECT
idPersonne1, idPersonne2
FROM
COLLEGUE
WHERE
idPersonne1 = NEW.idPersonne1
OR
(EXISTS( SELECT
idPersonne1, idPersonne2
FROM
COLLEGUE
WHERE
idPersonne2 = NEW.idPersonne1
THEN
END IF;
-- Vérification
CREATE TRIGGER R5
IF
(EXISTS( SELECT
idPersonne1, idPersonne2
FROM
VOISIN
WHERE
idPersonne1 = OLD.idPersonne1
THEN
WHERE
idPersonne1 = OLD.idPersonne1
END IF;
IF
(EXISTS( SELECT
idPersonne1, idPersonne2
FROM
VOISIN
WHERE
idPersonne2 = OLD.idPersonne1
THEN
idPersonne1 = OLD.idPersonne2
END IF;
END;
-- Vérification
WHERE
R6.
CREATE TRIGGER R6
THEN
END IF;
THEN
END IF;
THEN
END IF;
END IF;
END;
-- Intégrité référentielle
R1.
R2.
CREATE TRIGGER R7
END IF;
R3.
CREATE TRIGGER R8
THEN
-- Verification
R4.
CREATE TRIGGER R9
THEN
END IF;
-- Verification
Objectif : Dans ce TP, nous allons se familiariser avec les déclencheurs SQL, découvrir les
transactions..
1
Correction TPn°5 : Bases de données
R1.
USE TRAVAIL;
id int,
nomEmp text,
dateN date,
salaire int,
idDept int,
dateEmbauche date,
);
idDept int,
nomDept text,
idEmp int,
nbrEmployes int,
);
idProj int,
nomProj text,
idDept int,
PRIMARY KEY (idProj),
);
idEmp int,
idProj int,
heures int,
);
R2.
R3.
COMMIT;
ROLLBACK;
R4.
ELSE IF
(DATEDIFF(CURDATE(), dateN))
FROM EMPLOYE WHERE
THEN
SIGNAL SQLSTATE '45000' SET message_text = 'Employe plus age que son manager';
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';
ELSE
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;
END;
$$
DELIMITER ;
DROP TRIGGER IF EXISTS UPDATE_EMPLOYE;
DELIMITER $$
ELSE IF
(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';
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';
ELSE
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;
END;
$$
DELIMITER ;
DELIMITER $$
$$
DELIMITER ;
DELIMITER $$
SIGNAL SQLSTATE '45000' SET message_text = 'Le manager d’un department doit etre un employe de
ce department';
END IF;
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.
DELIMITER $$
SIGNAL SQLSTATE '45000' SET message_text = 'Le manager d’un department doit etre un employe de
ce department';
END IF;
THEN
SIGNAL SQLSTATE '45000' SET message_text = 'Le nombre d''employes n''est pas correct.';
END IF;
END;
$$
DELIMITER ;
SELECT
FROM
DEPARTEMENT;
WHERE
idDept = 6;
SELECT
FROM
PROJET;
DELIMITER $$
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.
= '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.
END IF;
END IF;
END;
$$
DELIMITER ;
DELIMITER $$
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.
= '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.
END IF;
END IF;
END;
$$
DELIMITER ;
INSERT INTO TRAVAILLE VALUES (1,2,20);
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.
-- 12. Un employ ́e travaille au moins 20 heures par semaine et au plus 40 heures par semaine sur
tous les projets.
R13.
IF NOT EXISTS (SELECT idEmp FROM TRAVAILLE WHERE idEmp = (SELECT idEmp FROM
DEPARTEMENT WHERE idDept = NEW.idDept)
THEN
ELSE
AND idEmp = (SELECT idEmp FROM DEPARTEMENT WHERE idDept = NEW.idDept)) < 2
THEN
WHERE idProj = NEW.idProj AND idEmp = (SELECT idEmp FROM DEPARTEMENT WHERE idDept =
NEW.idDept);
END IF;
END IF;
END;
-- 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
Objectif : Dans ce TP, nous allons se familiariser les niveaux d’isolation dans SQL
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
TPn°7 : Bases de données
Objectif : Dans ce TP, nous allons voir comment créer des vues et les interroger sous MySQL
ARTICLE(idArticle, nomArticle),
UNIVERSITE(idUniversite, nomUniversite)
5. Modifier le nom d’un des chercheurs de L’INSAT dans la table CHERCHEUR. Vérifier
que la vue a changé.
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.
11. Afficher les noms des chercheurs ayant contribué à un article (en utilisant la vue).
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.
Travail à rendre :
Exécuter le script Exercice.sql pour créer la base de données suivante (voir email du groupe :
ING_GL2_unicar):
EXAMINATEUR(idExaminateur, nom)
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.