tp2 - correction manipulations de données & sql …lysop/bd/tp2-correction.pdf · 1 tp2 -...
TRANSCRIPT
1
TP2 - correction
Manipulations de données & SQL intégré à Python
Remarques :
- Pour voir le type des attributs d’une table vous pouvez faire :
mysql> DESCRIBE nomTable ;
- Pour voir la requête utilisée pour créer cette table (utile pour les contraintes d’intégrité) vous
pouvez faire :
mysql> SHOW CREATE TABLE nomTable ;
- La contrainte d’intégrité ON DELETE [CASCADE|RESTRICT|SET NULL] permet lorsqu’on
supprime un enregistrement d’une table mère :
o CASCADE : de supprimer les enregistrements correspondants dans toutes les tables
dépendantes
o RESTRICT : de rejeter la suppression et d’afficher un message indiquant que les
enregistrements sont utilisés dans d’autres tables
o SET NULL : de supprimer les enregistrements de la table mère et de mettre NULL
dans les colonnes des tables filles correspondantes.
- Si cette contrainte est définie sur une table, il nous est possible de supprimer les
enregistrements de cette table quelle que soit la contrainte (RESTRICT, CASCADE ou SET
NULL). Les enregistrements ne sont cependant pas supprimés de la table mère.
- Pour modifier ou rajouter une contrainte ou colonnes à une table déjà créée : ALTER TABLE <nom_table> {
ADD <nom_colonne> <type> [<contraintes_de_colonne> […]] |
DROP <nom_colonne> [{CASADE|RESTRICT}] |
ALTER <nom_colonne> SET DEFAULT <valeur> |
ALTER <nom_colonne> DROP DEFAULT |
RENAME <nom_table> TO <nouveau_nom_table> |
RENAME COLUMN <nom_colonne> TO <nouveau_nom_colonne> |
ADD CONSTRAINT <contrainte_de_table> |
DROP CONSTRAINT <nom_contrainte> [{CASCADE |RESTRICT}]
}
o Modifier la définition d’une colonne : ALTER TABLE <nom_table> DROP <nom_colonne> ;
ALTER TABLE <nom_table> ADD <nom_colonne> <type> [<containtes>
[..]] ;
o Rajouter une contrainte de table : ALTER TABLE <nom_table> ADD CONSTRAINT PRIMARY KEY (nom_col1>,
<nom_col2>,..) ;
o Rajouter une définition de colonne : ALTER TABLE <nom_table> ADD <colonne> <type> [<containtes> [..]] ;
o Renommer une table : ALTER TABLE <nom_table> TO <nouveau_nom> ;
2
Exercice1 du TD à faire en cours :
Soit la relation PERSONNE ci-dessous. Nous la créerons sous le nom de table p1 dans notre base :
Nom Age Ville
Marc 29 Paris
Catherine 32 Lyon
Sophie 54 Paris
Claude 13 Montpellier
Serge 40 Lyon
PERSONNE
a) Donnez les résultats des requêtes suivantes :
1. Age=30 (PERSONNE)
SELECT * FROM p1 WHERE age = 30;
2. Age (PERSONNE)
SELECT DISTINCT age FROM p1;
3. Age (Nom=’Serge’ (PERSONNE))
SELECT DISTINCT age FROM p1 WHERE nom=’Serge’;
b) Exprimez les requêtes suivantes en SQL :
1. Les personnes (nom,âge,ville) qui habitent Paris
σ(ville = ’Paris’) (PERSONNE)
SELECT * FROM p1 WHERE ville=’Paris’;
2. Les personnes (nom,âge,ville) qui ont moins de 30 ans
σ(vage < 30) (PERSONNE)
SELECT * FROM p1 WHERE age<30;
3. Les villes dans la relation PERSONNE :
(ville) (PERSONNE)
SELECT DISTINCT ville FROM p1;
4. Les noms des personnes habitant à Paris :
nom( σ(ville = ’Paris’) (PERSONNE))
SELECT DISTINCT nom FROM p1 WHERE ville=’Paris’;
3
Exercice 2
Soient r, s, et t les relations suivantes (les attributs A, B, C, D, E et F sont définis sur le domaine des lettres de
l'alphabet).
A B C
1 3 5
7 9 8
8 1 2
1 3 3
9 7 2
D E F
1 2 3
0 4 7
3 0 9
C D
8 1
2 3
R S T
a) Exprimer en SQL les requêtes suivantes :
1. R ⋈ S
SELECT * from R JOIN S USING (C);
2. R ⋈ S ⋈ T
SELECT * from R JOIN (SELECT * FROM S JOIN T USING (D))AS e USING (C);
3. R ⋈(C ≤ D) S
SELECT * from R JOIN S ON R.C<=D;
Ou
SELECT A,B, R.C,D from R JOIN S ON R.C<=D;
4. (A, B) R
SELECT DISTINCT A, B from R;
3) Testez les requêtes 21 à 29 du TD6 Cf. correction du TD6
4) Jointures
Dressez la liste de toutes les interprétations, en précisant le nom et le prénom de l’acteur ainsi que le rôle et le titre du film. Le résultat doit être trié par ordre alphabétique des noms.
SELECT nom, prenom, role, titre
FROM personne JOIN jouer ON personne.id_personne = film.id_acteur
JOIN film ON jouer.id_film = film.id_film
ORDER BY nom;
4
1. Quels sont les noms et prénoms des acteurs qui sont également réalisateurs ?
Remarque : il faut utiliser le mot clé INTERSECT.
SELECT DISTINCT nom, prenom
FROM personne JOIN film ON personne.id_personne = film.id_realisateur
WHERE id_personne IN (
SELECT DISTINCT id_personne
FROM personne JOIN jouer ON personne.id_personne = jouer.id_acteur
);
Quels sont les réalisateurs qui ont réalisé des films d’épouvante et des films dramatiques ? SELECT * from personne JOIN film ON personne.id_personne
=film.id_realisateur
WHERE film.genre='Drame' AND id_personne IN (
SELECT id_realisateur from film WHERE genre = 'Epouvante');
Ou en postgreSQL
SELECT DISTINCT *
FROM personne JOIN film ON personne.id_personne = film.id_realisateur
WHERE film.genre=’Drame’
INTERSECT
SELECT DISTINCT *
FROM personne JOIN film ON personne.id_personne = film.id_realisateur
WHERE film.genre=’Epouvante’;
En SQL INTERSECT n’existe pas encore. Mais il est prévu d’implémenter ces opérateurs.
5
Quels sont les acteurs qui n’ont pas joué dans des films dramatiques ?
SELECT * FROM personne WHERE id_personne NOT IN (
SELECT jouer.id_acteur FROM jouer
JOIN film ON jouer.id_film=film.id_film
WHERE film.genre='Drame');
Ou en PostgreSQL
SELECT DISTINCT personne.*
FROM personne JOIN jouer ON personne.id_personne = jouer.id_acteur
EXCEPT
SELECT DISTINCT personne.* from ? JOIN ON personne.id_personne =
jouer.id_acteur
JOIN film USING (id_film) WHERE film.genre=’Drame’;
4) Requêtes MySQL dans script Python
1. Créer une fonction rech_personne(nom, prenom) qui recherche dans la table
personne si le nom et prenom de la personne donnée à la fonction existent bien dans la
table.
2. Créez une fonction qui insère une nouvelle personne dans la table personne. Cette fonction
vérifiera au préalable si la personne à insérer n’est pas déjà présente dans la table.
3. Créez une fonction affiche_film(id) qui prend en entrée un identifiant, et qui affiche les
détails du film correspondant à l’identifiant de film donné en paramètre d’entrée.
4. Créez une fonction supr_film(id) qui permet de supprimer un film de la table à partir de son
identifiant.
6