Vous êtes sur la page 1sur 11

Génie Informatique

2ème année - Semestre 3


2023 | 2024

Base de Données Avancées - Corrections


Travaux Pratique 2

1. Affichez les titres et les genres de tous les contenus (films et séries).

SELECT Titre, Genre


FROM CONTENU;

2. Afficher les utilisateurs par date d'inscription dans l'ordre croissant.

3. Affichez le nom et le prénom de tous les utilisateurs qui ont un abonnement Premium.

SELECT U.Nom, U.Prenom


FROM UTILISATEUR U
JOIN ABONNEMENT A ON U.AbonnementID = A.AbonnementID
WHERE A.Type_abonnement = 'Premium';

4. Affichez le titre et le genre de tous les contenus (films ou séries) visionnés par les
utilisateurs ayant un abonnement Premium.

SELECT C.Titre, C.Genre


FROM VISIONNAGE_FILM VF
JOIN UTILISATEUR U ON VF.UserID = U.UserID
JOIN CONTENU C ON VF.ContenuID = C.ContenuID
JOIN ABONNEMENT A ON U.AbonnementID = A.AbonnementID
WHERE A.Type_abonnement = 'Premium'

UNION

SELECT C.Titre, C.Genre


FROM VISIONNAGE_SERIE VS
A.Bakki 1/
11
Génie Informatique
2ème année - Semestre 3
2023 | 2024

JOIN UTILISATEUR U ON VS.UserID = U.UserID


JOIN CONTENU C ON VS.ContenuID = C.ContenuID
JOIN ABONNEMENT A ON U.AbonnementID = A.AbonnementID
WHERE A.Type_abonnement = 'Premium';
5. Affichez le titre et le genre des séries créées après 2010

SELECT Titre, Genre


FROM CONTENU
WHERE Type_contenu = 'SERIE' AND Annee_sortie > 2010;
6. Quels sont les films du genre "Drame" sortis avant 2000?

SELECT Titre
FROM CONTENU
WHERE Type_contenu = 'FILM' AND Genre = 'Drame' AND Annee_sortie < 2000;
7. Affichez le nombre total de films et de séries dans la base de données.

SELECT Type_contenu, COUNT(*)


FROM CONTENU
GROUP BY Type_contenu;
8. Affichez les utilisateurs qui ont visionné "Inception".

SELECT u.Nom, u.Prenom


FROM UTILISATEUR u
JOIN VISIONNAGE v ON u.UserID = v.UserID
JOIN CONTENU c ON v.ContenuID = c.ContenuID
WHERE c.Titre = 'Inception';
9. Afficher la liste de tous les films et pour ceux qui ont reçu une notation afficher la somme
des notes.

SELECT
c.Titre,
c.Genre,
f.Duree,
SUM(n.Note) AS SommeNotes
FROM
A.Bakki 2/
11
Génie Informatique
2ème année - Semestre 3
2023 | 2024

CONTENU c
JOIN
FILM f ON c.ContenuID = f.ContenuID
LEFT JOIN
NOTATION n ON c.ContenuID = n.ContenuID
GROUP BY
c.Titre, c.Genre, f.Duree;
10. Affichez le titre et la durée du film ayant la plus longue durée.

SELECT C.Titre, F.Duree


FROM FILM F
JOIN CONTENU C ON F.ContenuID = C.ContenuID
ORDER BY F.Duree DESC
LIMIT 1;

11. Affichez le nombre total d'utilisateurs pour chaque type d'abonnement, ainsi que le
montant total des abonnements pour chaque type.

SELECT
A.Type_abonnement,
COUNT(U.UserID) AS Nombre_utilisateurs,
SUM(A.Prix) AS Montant_total_abonnements
FROM ABONNEMENT A
LEFT JOIN UTILISATEUR U ON A.AbonnementID = U.AbonnementID
GROUP BY A.Type_abonnement;
12. Trouvez le film avec la meilleure note moyenne. Affichez son titre, sa note moyenne, et
le nom du réalisateur.

SELECT
C.Titre AS Titre_du_film,
AVG(N.Note) AS Note_moyenne,
C.Realisateur
FROM CONTENU C

A.Bakki 3/
11
Génie Informatique
2ème année - Semestre 3
2023 | 2024

JOIN FILM F ON C.ContenuID = F.ContenuID


JOIN NOTATION N ON C.ContenuID = N.ContenuID
GROUP BY C.Titre, C.Realisateur
ORDER BY AVG(N.Note) DESC
13. Affichez les utilisateurs qui ont noté des films avec une note supérieure à 4.0.

SELECT DISTINCT
U.Nom,
U.Prenom
FROM UTILISATEUR U
JOIN NOTATION N ON U.UserID = N.UserID
JOIN CONTENU C ON N.ContenuID = C.ContenuID
JOIN FILM F ON C.ContenuID = F.ContenuID
WHERE N.Note > 4.0;
14. Affichez les séries qui ont été visionnées plus de 2 fois, mais seulement celles dont le
genre est "Drame" ou "Science Fiction".

SELECT DISTINCT
C.Titre,
C.Genre
FROM CONTENU C
JOIN SERIE S ON C.ContenuID = S.ContenuID
JOIN VISIONNAGE_SERIE VS ON C.ContenuID = VS.ContenuID
WHERE C.Genre IN ('Drame', 'Science Fiction')
GROUP BY C.Titre, C.Genre
HAVING COUNT(VS.VisionnageSerieID) > 2;
15. Affichez le nom et le prénom des utilisateur, et le nombre série visionnée. Assurez-vous
d'inclure tous les utilisateurs, même ceux qui n'ont jamais visionné de série.

SELECT
U.Nom,
U.Prenom,
COUNT(VS.ContenuID) AS NombreSeriesVisionnees

A.Bakki 4/
11
Génie Informatique
2ème année - Semestre 3
2023 | 2024

FROM UTILISATEUR U
LEFT JOIN VISIONNAGE_SERIE VS ON U.UserID = VS.UserID
GROUP BY U.Nom, U.Prenom
ORDER BY U.Nom, U.Prenom;
16. Affichez le nombre total de films, la durée moyenne, et la note moyenne, en les
regroupant par genre de film.

SELECT
C.Genre,
COUNT(F.FilmID) AS NombreTotalFilms,
AVG(F.Duree) AS DureeMoyenne,
AVG(N.Note) AS NoteMoyenne
FROM CONTENU C
JOIN FILM F ON C.ContenuID = F.ContenuID
LEFT JOIN NOTATION N ON C.ContenuID = N.ContenuID
GROUP BY C.Genre
ORDER BY C.Genre;
17. Affichez le nombre total de séries, le nombre moyen de saisons, le nombre moyen
d'épisodes, et la note moyenne, en les regroupant par genre de série.

SELECT
C.Genre,
COUNT(S.SerieID) AS NombreTotalSeries,
AVG(S.Nombre_saisons) AS NombreMoyenSaisons,
AVG(SE.Nombre_episodes) AS NombreMoyenEpisodes,
AVG(N.Note) AS NoteMoyenne
FROM CONTENU C
JOIN SERIE S ON C.ContenuID = S.ContenuID
JOIN SAISON SE ON S.SerieID = SE.SerieID
LEFT JOIN NOTATION N ON C.ContenuID = N.ContenuID
GROUP BY C.Genre
18. Affichez les utilisateurs qui ont visionné au moins un contenu du genre 'Science Fiction'.

A.Bakki 5/
11
Génie Informatique
2ème année - Semestre 3
2023 | 2024

SELECT DISTINCT
U.Nom,
U.Prenom
FROM UTILISATEUR U
JOIN VISIONNAGE_SERIE VS ON U.UserID = VS.UserID
JOIN CONTENU C ON VS.ContenuID = C.ContenuID
WHERE C.Genre = 'Science Fiction'

UNION

SELECT DISTINCT
U.Nom,
U.Prenom
FROM UTILISATEUR U
JOIN VISIONNAGE_FILM VF ON U.UserID = VF.UserID
JOIN CONTENU C ON VF.ContenuID = C.ContenuID
WHERE C.Genre = 'Science Fiction';

19. Affichez le nom et le prénom des utilisateurs ayant visionné à la fois des films de science-
fiction et des séries de drame..

-- Utilisateurs ayant visionné des films de Science Fiction


SELECT
U.Nom,
U.Prenom
FROM
UTILISATEUR U
JOIN
VISIONNAGE_FILM VF ON U.UserID = VF.UserID
JOIN
CONTENU C ON VF.ContenuID = C.ContenuID
WHERE
C.Genre = 'Science Fiction'
A.Bakki 6/
11
Génie Informatique
2ème année - Semestre 3
2023 | 2024

INTERSECT

-- Utilisateurs ayant visionné des séries de Drame


SELECT
U.Nom,
U.Prenom
FROM
UTILISATEUR U
JOIN
VISIONNAGE_SERIE VS ON U.UserID = VS.UserID
JOIN
CONTENU C ON VS.ContenuID = C.ContenuID
WHERE
C.Genre = 'Drame';
20. Affichez les séries qui n'ont pas encore été visionnées par les utilisateurs.

SELECT
C.Titre AS Titre_Serie,
C.Genre,
C.Realisateur,
C.Createur,
C.Annee_sortie
FROM
CONTENU C
JOIN
SERIE S ON C.ContenuID = S.ContenuID
WHERE
NOT EXISTS (
SELECT 1
FROM
VISIONNAGE_SERIE VS
A.Bakki 7/
11
Génie Informatique
2ème année - Semestre 3
2023 | 2024

WHERE
VS.ContenuID = C.ContenuID
);
21. Affichez le nombre total de visionnages pour chaque utilisateur.

SELECT
U.UserID,
U.Nom,
U.Prenom,
COUNT(*) AS Nombre_Total_Visionnages
FROM
UTILISATEUR U
LEFT JOIN
VISIONNAGE_FILM VF ON U.UserID = VF.UserID
LEFT JOIN
VISIONNAGE_SERIE VS ON U.UserID = VS.UserID
GROUP BY
U.UserID, U.Nom, U.Prenom;

22. Affichez les séries qui ont plus de saisons que toutes les séries.

SELECT
s.SerieID,
c.Titre AS TitreSerie,
s.Nombre_saisons
FROM
SERIE s
JOIN
CONTENU c ON s.ContenuID = c.ContenuID
WHERE
s.Nombre_saisons > ALL (SELECT Nombre_saisons FROM SERIE WHERE SerieID
<> s.SerieID);

A.Bakki 8/
11
Génie Informatique
2ème année - Semestre 3
2023 | 2024

23. Affichez les films qui ont une durée totale de supérieure à la moyenne des films.

SELECT
f.FilmID,
c.Titre AS TitreFilm,
f.Duree
FROM
FILM f
JOIN
CONTENU c ON f.ContenuID = c.ContenuID
WHERE
f.Duree > (SELECT AVG(Duree) FROM FILM);
24. Affichez les séries qui ont une moyenne de notes supérieure à la moyenne des notes de
toutes les séries.

SELECT
s.SerieID,
c.Titre AS TitreSerie,
AVG(n.Note) AS MoyenneNotes
FROM
SERIE s
JOIN
CONTENU c ON s.ContenuID = c.ContenuID
LEFT JOIN
NOTATION n ON s.ContenuID = n.ContenuID
GROUP BY
s.SerieID, c.Titre
HAVING
AVG(n.Note) > (SELECT AVG(Note) FROM NOTATION);
25. Affichez les film qui n'ont pas encore été notées.

SELECT
f.FilmID,

A.Bakki 9/
11
Génie Informatique
2ème année - Semestre 3
2023 | 2024

c.Titre AS TitreFilm
FROM
FILM f
JOIN
CONTENU c ON f.ContenuID = c.ContenuID
WHERE
f.ContenuID NOT IN (
SELECT n.ContenuID
FROM NOTATION n
);
26. Pour afficher la troisième et quatrième série les mieux notées

SELECT
C.Titre AS Titre_de_la_serie,
AVG(N.Note) AS Note_moyenne,
C.Realisateur
FROM CONTENU C
JOIN SERIE S ON C.ContenuID = S.ContenuID
JOIN NOTATION N ON C.ContenuID = N.ContenuID
WHERE C.Type_contenu = 'SERIE'
GROUP BY C.Titre, C.Realisateur
ORDER BY AVG(N.Note) DESC
LIMIT 2 OFFSET 2;

BONUS

27. Affichez les utilisateurs qui ont visionné plus de film que la moyenne des contenus
visionnés par tous les utilisateurs.

SELECT

u.UserID,

u.Nom,

A.Bakki 10/
11
Génie Informatique
2ème année - Semestre 3
2023 | 2024

u.Prenom

FROM

UTILISATEUR u

JOIN

VISIONNAGE_FILM vf ON u.UserID = vf.UserID

GROUP BY

u.UserID, u.Nom, u.Prenom

HAVING

COUNT(DISTINCT vf.ContenuID) > (

SELECT

AVG(COUNT(DISTINCT ContenuID))

FROM

VISIONNAGE_FILM

GROUP BY

UserID

);

A.Bakki 11/
11

Vous aimerez peut-être aussi