6
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> ;

TP2 - correction Manipulations de données & SQL …lysop/bd/TP2-correction.pdf · 1 TP2 - correction Manipulations de données & SQL intégré à Python Remarques: - Pour voir le

Embed Size (px)

Citation preview

Page 1: TP2 - correction Manipulations de données & SQL …lysop/bd/TP2-correction.pdf · 1 TP2 - correction Manipulations de données & SQL intégré à Python Remarques: - Pour voir le

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> ;

Page 2: TP2 - correction Manipulations de données & SQL …lysop/bd/TP2-correction.pdf · 1 TP2 - correction Manipulations de données & SQL intégré à Python Remarques: - Pour voir le

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’;

Page 3: TP2 - correction Manipulations de données & SQL …lysop/bd/TP2-correction.pdf · 1 TP2 - correction Manipulations de données & SQL intégré à Python Remarques: - Pour voir le

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;

Page 4: TP2 - correction Manipulations de données & SQL …lysop/bd/TP2-correction.pdf · 1 TP2 - correction Manipulations de données & SQL intégré à Python Remarques: - Pour voir le

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.

Page 5: TP2 - correction Manipulations de données & SQL …lysop/bd/TP2-correction.pdf · 1 TP2 - correction Manipulations de données & SQL intégré à Python Remarques: - Pour voir le

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.

Page 6: TP2 - correction Manipulations de données & SQL …lysop/bd/TP2-correction.pdf · 1 TP2 - correction Manipulations de données & SQL intégré à Python Remarques: - Pour voir le

6