Éléments de correction
3. Dans le système à une seule table, on doit écrire un enregistrement pour chaque film pour lequel l’acteur est connu. Ainsi, si un acteur est connu pour 4 films, on doit écrire 4 lignes comportant toutes les diverses informations concernant l’acteur (nom, année de naissance…). Dans le système à deux tables, ces informations n’apparaissent qu’une fois, seul l’identifiant des acteurs est dupliqué. On gagne donc de l’espace mémoire.
4.1. SELECT DISTINCT titleType FROM title_basics 4.2. SELECT COUNT(*) FROM title_basics
4.3.SELECT startYear FROM title_basics WHERE primaryTitle = 'The Godfather'
→ renvoie deux valeurs, on peut tester SELECT * pour voir que le second est un jeu vidéo et rajouter AND titleType = 'movie' dans la clause WHERE.
4.4. SELECT startYear FROM title_basics
WHERE primaryTitle = 'Superman' AND titleType = 'movie' ORDER BY startYear LIMIT 1
4.5. SELECT originalTitle FROM title_basics JOIN title_akas ON tconst = titleId WHERE title = 'Les dents de la mer' SELECT ta.title FROM title_akas ta
JOIN title_akas tb ON ta.titleId = tb.titleId WHERE ta.isOriginalTitle = 1
AND tb.title = 'Les dents de la mer';
4.6. SELECT primaryProfession FROM name_basics WHERE primaryName = 'Olivier Nakache' 4.7. SELECT originalTitle FROM title_basics
JOIN title_principals USING (tconst) JOIN name_basics USING (nconst) WHERE primaryName = 'Olivier Nakache' 4.8. SELECT primaryTitle, numVotes
FROM title_basics JOIN title_ratings USING (tconst)
WHERE numVotes = (SELECT MAX(numVotes) FROM title_ratings) Ou
SELECT primaryTitle, numVotes
FROM title_basics JOIN title_ratings USING (tconst)
ORDER BY numVotes DESC LIMIT 1 4.9. SELECT primaryName
FROM name_basics nb
JOIN title_writers tw ON nb.nconst = tw.writers JOIN title_basics tb ON tb.tconst = tw.tconst WHERE primaryTitle = 'Taxi' AND startYear = 1998 4.10. SELECT primaryName, category, job
FROM name_basics
JOIN title_principals USING (nconst) JOIN title_basics USING (tconst)
WHERE primaryTitle LIKE '%Return of the Jedi%'
4.11. SELECT primaryTitle FROM title_basics JOIN title_ratings USING(tconst)
WHERE averageRating > 9 AND numVotes > 10000 AND titleType = 'movie' 4.12. SELECT * FROM title_basics
JOIN title_ratings USING(tconst)
WHERE titleType = 'movie' AND genres LIKE '%Comedy%Romance%' ORDER BY averageRating DESC LIMIT 5
4.13. SELECT * FROM title_basics JOIN title_ratings USING(tconst)
WHERE titleType = 'movie' AND genres LIKE '%Animation%' AND numVotes > 1000 ORDER BY averageRating DESC LIMIT 10
4.14. SELECT Count(*) FROM title_basics WHERE runtimeMinutes > 180 and titleType = 'movie' 4.15. SELECT AVG(runtimeMinutes) FROM title_basics WHERE titleType = 'movie'
4.16. SELECT * FROM title_basics
WHERE titleType = 'movie' AND runtimeMinutes = (SELECT MAX(runtimeMinutes) FROM title_basics
WHERE titleType = 'movie')
Ou
SELECT * FROM title_basics WHERE titleType = 'movie' ORDER BY runtimeMinutes DESC LIMIT 1
4.17. SELECT * FROM title_basics WHERE titleType = 'movie' ORDER BY runtimeMinutes DESC LIMIT 5
4.18. SELECT primaryTitle FROM title_basics tb
JOIN name_titles nt ON tb.tconst = nt.knownForTitles JOIN name_basics nb ON nt.nconst = nb.nconst WHERE primaryName = 'Sean Connery'
4.19. SELECT primaryName, primarytitle FROM name_basics
JOIN title_principals USING(nconst) JOIN title_basics USING (tconst)
WHERE characters LIKE '%James Bond%' AND titleType = 'movie';
4.20. SELECT primaryName, primaryTitle FROM name_basics nb JOIN title_directors td ON nb.nconst = td.directors
JOIN title_basics tb ON tb.tconst = td.tconst JOIN title_ratings tr ON tr.tconst = tb.tconst WHERE titleType = 'movie'
ORDER BY averageRating DESC LIMIT 5 4.21. SELECT tb1.primaryTitle
FROM title_basics tb1
JOIN title_episode te ON te.tconst = tb1.tconst JOIN title_basics tb2 ON te.parentTconst = tb2.tconst WHERE tb2.primaryTitle = 'Game of Thrones'
5.1. SELECT * FROM name_basics WHERE primaryName = 'Sean Connery' UPDATE name_basics
SET deathYear = 2020
WHERE primaryName = 'Sean Connery'
5.2. On doit répartir les informations suivant les différentes tables.
INSERT INTO title_basics
VALUES (13243899, 'movie', 'Star Wars: the new generation', 'Star Wars: the new generation', 0, 2021, NULL, 124, 'Action,Adventure,Fantasy') ;
INSERT INTO title_ratings VALUES (13243899, NULL, 0) ;
INSERT INTO title_akas (titleId, ordering, title, region, isOriginalTitle) VALUES (13243899, 1, 'Star Wars: the new generation', 'US', 1) ; INSERT INTO title_akas (titleId, ordering, title, region, isOriginalTitle) VALUES (13243899, 2, 'Star Wars: the new generation', 'GB', 1) ; INSERT INTO title_akas (titleId, ordering, title, region, isOriginalTitle) VALUES (13243899, 3, 'Star Wars: la nouvelle génération', 'FR', 0) ;
INSERT INTO title_akas (titleId, ordering, title, region, isOriginalTitle) VALUES (13243899, 4, 'Star Wars: la nueva generación', 'ES', 0) ; On récupère les identifiants des personnes :
SELECT * FROM name_basics WHERE primaryName = 'Steven Spielberg'
On obtient : Steven Spielberg : 229, George Lucas : 184, Quentin Tarantino : 233
Mark Hamill : 434, Daisy Ridley : 5397459, Chuck Norris : 1569, Tom Holland : 4043618 INSERT INTO title_principals
VALUES (13243899, 1, 434, 'actor', NULL, '["Luke Skywalker"]') ; INSERT INTO title_principals
VALUES (13243899, 2, 5397459, 'actress', NULL, '["Rey"]') ; INSERT INTO title_principals
VALUES (13243899, 3, 1569, 'actor', NULL, '["Emperor"]') ; INSERT INTO title_principals
VALUES (13243899, 4, 4043618, 'actor', NULL, '["Peter Skywalker"]') ; INSERT INTO title_principals
VALUES (13243899, 5, 229, 'director', NULL, NULL) ; INSERT INTO title_principals
VALUES (13243899, 6, 184, 'writer', NULL, NULL) ; INSERT INTO title_principals
VALUES (13243899, 7, 233, 'writer', NULL, NULL) ; INSERT INTO title_directors
VALUES (13243899, 229) ; INSERT INTO title_writers VALUES (13243899, 184) ; INSERT INTO title_writers VALUES (13243899, 233) ;
5.3. SELECT primaryName, 2020 - birthYear
FROM name_basics WHERE birthYear = (SELECT MIN(birthYear)
FROM name_basics WHERE deathYear IS NULL)
L’année de naissance de Megan Liz Smith est erronée. On apprend sur internet qu’elle est née en 1997. On la corrige avec :
UPDATE name_basics SET birthYear = 1997
6.6.1. DELETE FROM title_ratings WHERE numVotes < 10 000
6.2. DELETE FROM title_episode WHERE tconst NOT IN (SELECT tconst FROM title_ratings) OR parentTconst NOT IN (SELECT tconst FROM title_ratings) ; 6.3. DELETE FROM title_akas WHERE titleId NOT IN (SELECT tconst FROM title_ratings) ;
DELETE FROM title_basics WHERE tconst NOT IN (SELECT tconst FROM title_ratings) ; DELETE FROM title_directors WHERE tconst NOT IN (SELECT tconst FROM title_ratings) ; DELETE FROM title_writers WHERE tconst NOT IN (SELECT tconst FROM title_ratings) ; DELETE FROM title_principals WHERE tconst NOT IN (SELECT tconst FROM title_ratings) ; 6.4. DELETE FROM name_titles WHERE knownForTitles NOT IN (SELECT tconst FROM title_ratings) ;
6.5. Cette requête supprime de la table name_basics les enregistrements correspondant aux personnes qui n’apparaissent plus dans les autres tables.