TP d informatique n 014 Bases de données PCSI 2015 2016 I Schéma Soit le schéma relationnel suivant : Individus(Num_Ind, Nom, Prenom) : l identifiant de l individu ( Num_Ind), le nom et le prénom de l individu. Jouer(Num_Ind, Num_Film, Role) : les attributs représentant respectivement le numéro individu (Num_Ind), le numéro du film (Num_Film) dans lequel il a joué, et le nom du rôle joué. Films(Num_Film Num_Ind, Titre, Genre, Annee) : le numéro du film (Num_Film), l identifiant du réalisateur ( Num_Ind), et les caractéristiques du film. Projection(Num_Cine, Num_Film, Date) Le numéro du cinéma dans lequel a été projeté le film à la date indiqué. Cinémas(Num_Cine, Nom, Adresse)Un identifiant des cinémas, ainsi que leur nom et adresse. Le tableau dans les pages suivantes donne une instance de ce schéma relationnel. II Structure de la base de donnée Représenter la base de donnée sous forme d un schéma bloc en indiquant en titre de chaque bloc le nom de la table, en dessous les attributs, en soulignant les clés primaires et en indiquant via des flèches les clés étrangères. Par exemple dans le TP précédent le schéma aurait été : Artiste ida Nom Origine Epoque Par Artiste Oeuvre Oeuvre ido Titre Genre Estimation Avoir Musee Oeuvre Musee Numero NomMusee Ouverture Fermeture Assurance Gardez ce schéma sous les yeux pour les requêtes, cela aide à voir les conditions nécessaires pour les jointures. III Exercices Donner les requêtes SQL permettant de répondre aux questions suivantes : 1. Quel est le contenu de la table individus? 2. Quels sont les prénoms des individus en conservant les doublons? 3. Quels sont les prénoms des individus en conservant les doublons, mais en les classant par ordre alphabétique? (La clause à utiliser est ORDER BY, regardez la syntaxe sur internet) 4. Quels sont les prénoms des individus sans doublons? Observez le résultat en effectuant un classement alphabétique et sans effectuer de classement. 5. Quels sont les individus dont le prénom est John? 1
6. Quel est le nom des individus dont le prénom est John? 7. Dressez la liste de toutes les associations possibles entre un individu et un film (il n y a pas nécessairement de lien entre l individu et le film qu on lui associe). Observez le nombre de lignes retournées. Était-il prévisible? 8. Quels sont les individus qui sont des acteurs? les acteurs jouent dans les films... 9. Dressez la liste de toutes les associations possibles entre un acteur et un film (il n y a pas nécessairement de lien entre l acteur et le film qu on lui associe). Observez le nombre de lignes retournées. 10. Dressez la liste de toutes les interprétations, en précisant le rôle, d acteur, dont on précisera le nom et le prénom, ayant joué dans des films dont on précisera le titre. Le résultat sera de la forme : \# Prénom Nom Rôle Titre 1 Nicole Kidman Grace Dogville 11. Même question que la précédente, mais en formatant le résultat de la manière suivante : Nicole Kidman a joué le rôle de Grace dans le film Dogville Paul Bettany a joué le rôle de Tom Edison dans le film Dogville... Paul Mazursky a joué le rôle de May Day dans le film Dangereusement vôtr 12. Quels sont les titres des films dont le genre est Drame? 13. Quels films (titres) ont été projetés en 2002? On pourra utiliser le mot clé LIKE (en cherchant de la documentation) ou utiliser les opérateurs de comparaison sur les dates. 14. Donnez le titre des films réalisés par Lars von Trier. 15. Quels films sont projetés au cinéma Le Fontenelle? 16. Quels sont les noms et prénoms des réalisateurs? 17. Quels sont les noms et prénoms des acteurs qui sont également réalisateurs? 18. Quels acteurs a-t-on pu voir au cinéma Le Fontenelle depuis l an 2000? 19. Quels sont les titres des films où Nicole Kidman a joué un rôle et qui ont été projetés au cinéma Le Fontenelle? 20. On désire le nom et le prénom des acteurs et le nombre de films dans lequel ils ont joué. 21. On désire connaitre le nom et le prénom des acteurs ainsi que l année de leur premier et de leur dernier rôle 22. Nom et prénom des acteurs qui ont joué dans au moins deux films. 23. On désire le nom et prénom des acteurs et le nombre de drames dans lesquels ils ont joué. 24. Quels sont les réalisateurs qui ont réalisé des films d épouvante et des films dramatiques? 25. Quels sont les acteurs qui n ont pas joué dans des films dramatiques? 26. Quels sont les noms et prénoms des individus dont le prénom est à la fois celui d un acteur et celui d un réalisateur sans qu il s agisse de la même personne? (Un peu difficile, pensez à décomposer en sous-problème) 27. Quels sont les cinémas qui ont projeté au moins 80% des films? 28. Quel est le nombre de films réalisés par chacun des réalisateurs? 29. Combien de films a réalisé le réalisateur le plus productif? 30. Quel est le nombre de films réalisés par les réalisateurs dont on désire connaitre le nom et le prénom, ayant réalisé au moins un film du même genre que l un des films réalisés par David Cronenberg? 31. On suppose que les têtes d affiche d un film sont les acteurs recensés pour ce film dans la base de données. Quel est le nombre de têtes d affiche et le réalisateur de chacun des films? PCSI Page 2/6
Individus Num_Ind Nom Prenom 1 Kidman Nicole 2 Bettany Paul 3 Watson Emily 4 Skarsgard Stellan 5 Travolta John 6 L.Jackson Samuel 7 Willis Bruce 8 Irons Jeremy 9 Spader James 10 Hunter Holly 11 Arquette Rosanna 12 Wayne John 13 von Trier Lars 14 Tarantino Quentin 15 Cronenberg David 16 Mazursky Paul 17 Jones Grace 18 Glen John 19 Ford John Projection Num_Cine Num_Film Date 3 6 1960-11-09 1 6 1980-07-05 2 7 1985-05-09 1 2 1988-03-12 2 2 1990-09-25 3 6 1990-12-02 4 3 1994-04-08 3 3 1994-11-05 4 3 1994-11-06 1 1 1996-05-07 1 4 1996-08-02 2 4 1996-09-02 2 4 1996-12-02 2 5 2002-05-01 2 5 2002-05-02 2 5 2002-05-03 4 6 2002-08-01 Jouer Num_Ind Num_Film Rôle 1 5 Grace 2 5 Tom Edison 3 4 Bess 4 4 Jan 5 3 Vincent Vega 6 3 Jules Winn?eld 7 3 Butch Coolidge 8 2 Beverly & ElliotMantle 9 1 James Ballard 10 1 Helen Remington 11 1 Gabrielle 4 5 Chuck 16 7 May Day 12 8 Ringo Kid Cinemas Num_Cine Nom Adresse 1 Le Renoir 13100 Aix_en_Provence 2 Le Fontenelle 78160 Marly_le_Roi 3 Gaumont Wilson 31000 Toulouse 4 Espace Cine 93800 Epinay_sur_Seine Films Num_Film Num_Ind Titre Genre Annee 1 15 Crash Drame 1996 2 15 Faux_Semblants Epouvante 1988 3 14 Pulp Fiction Policier 1994 4 13 Breaking the waves Drame 1996 5 13 Dogville Drame 2002 6 12 Alamo Western 1960 7 18 Dangereusement vôtre Espionnage 1985 8 19 La Chevauchee fantastique Western 1939 PCSI Page 3/6
IV Correction 1. Quel est le contenu de la table individus? SELECT * FROM individus 19 lignes 2. Quels sont les prénoms des individus en conservant les doublons? SELECT ALL prenom FROM individus 19 lignes 3. Quels sont les prénoms des individus en conservant les doublons, mais en les classant par ordre alphabétique? SELECT ALL prenom FROM individus ORDER BY prenom ASC 19 lignes 4. Quels sont les prénoms des individus sans doublons? Observez le résultat en effectuant un classement alphabétique et sans effectuer de classement. SELECT DISTINCT prenom FROM individus ORDER BY prenom ASC 15 lignes 5. Quels sont les individus dont le prénom est John? SELECT * FROM individus WHERE prenom = "John" 4 lignes 6. Quel est le nom des individus dont le prénom est John? SELECT nom FROM individus WHERE prenom = "John" 4 lignes 7. Dressez la liste de toutes les associations possibles entre un individu et un film (il n y a pas nécessairement de lien entre l individu et le film qu on lui associe). Observez le nombre de lignes retournées. Était-il prévisible? SELECT * FROM individus, films 152 lignes = nombre de lignes d individus nombre de lignes de films 8. Quels sont les individus qui sont des acteurs? les acteurs jouent dans les films... SELECT * FROM individus JOIN jouer ON individus.num_ind = jouer.num_ind 14 lignes 9. Dressez la liste de toutes les associations possibles entre un acteur et un film (il n y a pas nécessairement de lien entre l acteur et le film qu on lui associe). Observez le nombre de lignes retournées. SELECT * FROM individus JOIN jouer ON individus.num_ind=jouer.num_ind JOIN films 112 lignes 10. Dressez la liste de toutes les interprétations, en précisant le rôle, d acteur, dont on précisera le nom et le prénom, ayant joué dans des films dont on précisera le titre. Le résultat sera de la forme : Même question que la précédente, mais en formatant le résultat de la manière suivante : SELECT * FROM films JOIN projection ON films.num_film = projection.num_f WHERE projection.date > 2001-12-31 and projection.date <= "2002-12-31" Donnez le titre des films réalisés par Lars von Trier. SELECT * FROM films JOIN individus ON films.num_ind = individus.num_ind WHERE Nom = "von Trier" AND Prenom = "Lars" Quels films sont projetés au cinéma Le Fontenelle? SELECT * FROM films JOIN Projection ON films.num_film = Projection.Num_Film JOIN Cinemas ON Cinemas.Num_Cine = Projection.Num_Cine WHERE Nom = "Le Fontenelle" Quels sont les noms et prénoms des réalisateurs? SELECT Nom, Prenom FROM films JOIN individus on films.num_ind = individus.num_ind Quels sont les noms et prénoms des acteurs qui sont également réalisateu SELECT Nom, Prenom FROM Individus JOIN Films ON Films.Num_Ind = Individ JOIN Jouer ON Films.Num_Ind = Jouer.Num_Ind Quels acteurs a-t-on pu voir au cinéma Le Fontenelle depuis l an 2000? SELECT * FROM Individus JOIN Jouer ON Individus.Num_Ind = Jouer.Num_Ind PCSI Page 4/6
JOIN Films ON Jouer.Num_Film = Films.Num_Film JOIN Projection ON Films.N = Projection.Num_Film JOIN Cinemas ON Projection.Num_Cine = Cinemas.Num_ WHERE Cinemas.Nom = "Le Fontenelle" AND Projection.date>="2000-01-01" Quels sont les titres des films où Nicole Kidman a joué un rôle et qui ont été projetés au cinéma Le Fontenelle? SELECT DISTINCT Films.Titre AS "Nom du film" FROM Individus JOIN Jouer ON Individus.Num_Ind = Jouer. JOIN Films ON Jouer.Num_Film = Films.Num_Film JOIN Projection ON Films.N = Projection.Num_Film JOIN Cinemas ON Projection.Num_Cine = Cinemas.Num_ WHERE Cinemas.Nom = "Le Fontenelle" AND Individus.Nom = "Kidman" AND Individus.Prenom = "Nicole" On désire le nom et le prénom des acteurs et le nombre de films dans lequel ils ont joué. SELECT Nom, Prenom, COUNT(*) as nombre FROM Indivi JOIN Jouer ON Individus.Num_Ind = Jouer.Num_Ind GROUP BY Individus.Num_I On désire connaitre le nom et le prénom des acteurs ainsi que l année de leur premier et de leur dernier rôle SELECT Nom, Prenom, MIN(Annee) AS premier_role, MAX(Annee) as dernier_role FROM Individus JOIN Jouer ON Individus.Num_Ind = Jouer.Num_Ind JOIN Films ON Jouer.Num_Film = Films.Num_Film GROUP BY Individus.Num_Ind Nom et prénom des acteurs qui ont joué dans au moins deux films. SELECT Nom, Prenom FROM Individus JOIN Jouer ON Individus.Num_Ind = Jouer.Num_I JOIN Films ON Jouer.Num_Film = Films.Num_Film GROUP BY Individus.Num_Ind HAVING COUNT(*)>1 On désire le nom et prénom des acteurs et le nombre de drames dans lesqu ils ont joué. SELECT Nom, Prenom, COUNT(*) FROM Individus JOIN Jouer ON Individus.Num_Ind = Jouer.Num_Ind JOIN Films ON Jouer.Num_Film = Films.Num_Film WHERE Genre = "Drame" GROUP BY Individus.Num_Ind Problème : n affiche pas 0 s ils n ont joué dans aucun drame Quels sont les réalisateurs qui ont réalisé des films d épouvante et des films dramatiques? SELECT DISTINCT Nom, Prenom FROM Individus JOIN Films ON Films.Num_Ind = Individus.Num_Ind WHERE Genre = "Drame" INTERSE SELECT DISTINCT Nom, Prenom FROM Individus JOIN Films ON Films.Num_Ind = Individus.Num_Ind WHERE Genre = "Epouvante" Quels sont les acteurs qui n ont pas joué dans des films dramatiques? SELECT Nom, Prenom FROM Individus JOIN Jouer ON Individus.Num_Ind = Jouer.Num_Ind JOIN Films ON Jouer.Num_Film = Films.Num_Film EXCEPT SELEC Nom, Prenom FROM Individus JOIN Jouer ON Individus.Num_Ind = Jouer.Num_I JOIN Films ON Jouer.Num_Film = Films.Num_Film WHERE Genre = "Drame" Quels sont les noms et prénoms des individus dont le prénom est à la fois celui d un acteur et celui d un réalisateur sans qu il s agisse de la même personne? étape 1 : nom et prénom des individus dont le prénom est à la fois celui d un acteur et d un réalisateur : SELECT Nom,Prenom FROM Individus WHERE Prenom = ( SELECT Prenom FROM Individus JOIN Jouer ON Individus.Num_Ind = Jouer.Num_Ind JOIN Films ON Jouer.Num_Film = Films.Num_Film INTERSECT SELECT Prenom FROM Individu JOIN Films ON Individus.Num_Ind = Films.Num_Ind ) PCSI Page 5/6
Au complet : SELECT Nom,Prenom FROM Individus WHERE Prenom = ( SELECT Prenom FROM Individus JOIN Jouer ON Individus.Num_Ind = Jouer.Num_Ind JOIN Films ON Jouer.Num_Film = Films.Num_Film INTERSECT SELECT Prenom FROM Individu JOIN Films ON Individus.Num_Ind = Films.Num_Ind ) AND NOT Individus.Num_ =( SELECT Individus.Num_Ind FROM Individus JOIN Jouer ON Individus.Num_I = Jouer.Num_Ind JOIN Films ON Jouer.Num_Film = Films.Num_Film INTERSECT SELECT Individus.Num_Ind FROM Individus JOIN Films ON Individus.Num_Ind = Films.Num_Ind ) Quels sont les cinémas qui ont projeté au moinds 80% des films? SELECT Cinemas.Nom FROM Cinemas JOIN Projection ON Cinemas.Num_Cine = Projectio GROUP BY Cinemas.Num_Cine HAVING COUNT(*) >= 0.8*(SELECT COUNT(*) FROM Films) Quel est le nombre de films réalisés par chacun des réalisateurs? SELEC Nom, Prenom, COUNT(*) FROM Individus JOIN Films ON Films.Num_Ind = Indiv GROUP BY Individus.Num_Ind Combien de films a réalisé le réalisateur le plus productif? SELECT MAX(Nombre) FROM (SELECT COUNT(*) AS Nombre FROM Individus JOIN Films ON Films.Num_Ind = Individus.Num_Ind GROUP BY Individus.Num_Ind) Quel est le nombre de films réalisés par les réalisateurs dont on désire connaitre le nom et le prénom, ayant réalisé au moins un film du même genre que l un des films réalisés par David Cronenberg? Genre des films réalisé par David : SELECT Genre FROM Films JOIN Individus ON Films.Num_Ind = Individus.Num_ WHERE Nom = "Cronenberg" AND Prenom = "David" SELECT Nom,Prenom,COUNT(*) FROM Individus JOIN Films ON Films.Num_Ind = Individus.Num_Ind WHERE Genre IN( SELECT Genre FROM Films JOIN Individ ON Films.Num_Ind = Individus.Num_Ind WHERE Nom = "Cronenberg" AND Prenom = "David") GROUP BY Individus.Num_Ind On suppose que les têtes d affiche d un film sont les acteurs recensés pour ce film dans la base de données. Quel est le nombre de têtes d affi et le réalisateur de chacun des films? SELECT Titre, Nom, COUNT(*) FROM Films JOIN Individus ON Individus.Num_Ind = Films.Num_Ind -ça, c est les réalisateurs JOIN Jouer ON Films.Num_Film = Jouer.Num_Film GROUP BY Films.Num_Film PCSI Page 6/6