Exercices — SQL
Contexte
Pour tous les exercices, on considère la base de données d'une médiathèque contenant les tables suivantes :
Table AUTEURS :
| id | nom | prenom | nationalite | ann_naissance |
|---|---|---|---|---|
| 1 | Orwell | George | britannique | 1903 |
| 2 | Herbert | Frank | américain | 1920 |
| 3 | Asimov | Isaac | américain | 1920 |
| 4 | Huxley | Aldous | britannique | 1894 |
| 5 | Bradbury | Ray | américain | 1920 |
| 6 | Dick | Philip K. | américain | 1928 |
| 7 | Barjavel | René | français | 1911 |
| 8 | Verne | Jules | français | 1828 |
Table LIVRES :
| id | titre | id_auteur | ann_publi | genre | nb_pages |
|---|---|---|---|---|---|
| 1 | 1984 | 1 | 1949 | dystopie | 328 |
| 2 | Dune | 2 | 1965 | space opera | 896 |
| 3 | Fondation | 3 | 1951 | space opera | 256 |
| 4 | Le meilleur des mondes | 4 | 1931 | dystopie | 288 |
| 5 | Fahrenheit 451 | 5 | 1953 | dystopie | 192 |
| 6 | Ubik | 6 | 1969 | SF | 224 |
| 7 | Chroniques martiennes | 5 | 1950 | SF | 256 |
| 8 | La nuit des temps | 7 | 1968 | SF | 318 |
| 9 | Les Robots | 3 | 1950 | SF | 253 |
| 10 | Ravage | 7 | 1943 | post-apo | 316 |
| 11 | De la Terre à la Lune | 8 | 1865 | aventure | 192 |
| 12 | Vingt mille lieues sous les mers | 8 | 1870 | aventure | 480 |
Table EMPRUNTS :
| id | id_livre | id_adherent | date_emprunt | date_retour |
|---|---|---|---|---|
| 1 | 1 | 101 | 2024-01-15 | 2024-01-29 |
| 2 | 3 | 102 | 2024-01-20 | NULL |
| 3 | 5 | 101 | 2024-02-01 | 2024-02-10 |
| 4 | 2 | 103 | 2024-02-05 | NULL |
| 5 | 1 | 104 | 2024-02-10 | 2024-02-20 |
Exercice 1 : Requêtes SELECT simples
Écrire les requêtes SQL permettant d'obtenir :
-
Tous les livres de la table LIVRES.
-
Les titres et années de publication de tous les livres.
-
Les noms et prénoms de tous les auteurs.
-
Les titres des livres publiés après 1950.
-
Les titres des livres du genre "dystopie".
-
Les auteurs de nationalité française.
Exercice 2 : Filtres et conditions
Écrire les requêtes SQL permettant d'obtenir :
-
Les livres publiés entre 1940 et 1960 (inclus).
-
Les livres ayant plus de 300 pages.
-
Les auteurs nés après 1900 et de nationalité américaine.
-
Les livres dont le titre contient le mot "Terre".
-
Les livres qui ne sont pas du genre "SF".
-
Les auteurs dont le prénom commence par la lettre "R".
Exercice 3 : Tri et limitation
Écrire les requêtes SQL permettant d'obtenir :
-
Tous les livres triés par année de publication (du plus ancien au plus récent).
-
Les 5 livres les plus récents.
-
Les auteurs triés par année de naissance décroissante.
-
Les 3 livres ayant le plus de pages.
-
Les livres triés par genre, puis par titre alphabétique.
-
La liste des genres sans doublons.
Exercice 4 : Fonctions d'agrégation
Écrire les requêtes SQL permettant d'obtenir :
-
Le nombre total de livres dans la base.
-
Le nombre de pages du livre le plus long.
-
L'année de publication du livre le plus ancien.
-
Le nombre moyen de pages des livres.
-
Le nombre de livres par genre.
-
Le nombre total de pages de tous les livres de Jules Verne (id_auteur = 8).
Exercice 5 : GROUP BY et HAVING
Écrire les requêtes SQL permettant d'obtenir :
-
Le nombre de livres écrits par chaque auteur (afficher id_auteur et le compte).
-
Le nombre moyen de pages par genre.
-
Les genres ayant plus de 2 livres.
-
Les auteurs ayant écrit au moins 2 livres (afficher id_auteur et le nombre).
-
L'année de publication du premier livre de chaque auteur.
-
Les genres dont la moyenne de pages dépasse 250.
Exercice 6 : Jointures
Écrire les requêtes SQL permettant d'obtenir :
-
Les titres des livres avec le nom et prénom de leur auteur.
-
Les titres des livres écrits par des auteurs français.
-
Les titres et auteurs des livres du genre "dystopie", triés par année.
-
Le nom des auteurs ayant écrit des livres de plus de 400 pages.
-
Les livres (titre) avec le nom de l'auteur, uniquement pour les auteurs américains nés après 1910.
-
Pour chaque nationalité, le nombre de livres écrits par des auteurs de cette nationalité.
Exercice 7 : Requêtes complexes
Écrire les requêtes SQL permettant d'obtenir :
-
Le titre du livre le plus long de chaque auteur, avec le nom de l'auteur.
-
Les auteurs n'ayant écrit qu'un seul livre (afficher nom, prénom, titre du livre).
-
Le nombre moyen de pages des livres par nationalité d'auteur.
-
Les genres pour lesquels tous les livres ont été publiés après 1940.
-
Le nom complet (prénom + nom) des auteurs et le nombre total de pages qu'ils ont écrites.
Exercice 8 : INSERT, UPDATE, DELETE
- Écrire une requête pour ajouter l'auteur suivant :
- id : 9
- nom : "Le Guin"
- prénom : "Ursula K."
- nationalité : "américain"
-
année de naissance : 1929
-
Écrire une requête pour ajouter le livre suivant :
- id : 13
- titre : "La Main gauche de la nuit"
- id_auteur : 9
- année de publication : 1969
- genre : "SF"
-
nombre de pages : 304
-
Écrire une requête pour changer le genre de "Dune" en "SF".
-
Écrire une requête pour augmenter de 10% le nombre de pages de tous les livres de Jules Verne.
-
Écrire une requête pour supprimer tous les livres publiés avant 1900.
Exercice 9 : Création de tables
- Écrire la requête SQL pour créer la table EMPRUNTS avec :
- id (entier, clé primaire)
- id_livre (entier, clé étrangère vers LIVRES)
- id_adherent (entier)
- date_emprunt (date)
-
date_retour (date, peut être NULL)
-
Écrire la requête SQL pour créer une table EDITEURS avec :
- id (entier, clé primaire)
- nom (texte)
- pays (texte)
-
ann_creation (entier)
-
Comment modifier la table LIVRES pour ajouter une colonne id_editeur qui référence la table EDITEURS ?
Exercice 10 : Analyse de requêtes
Pour chaque requête suivante, décrire en français ce qu'elle retourne :
-
sql SELECT titre FROM LIVRES WHERE ann_publi = (SELECT MIN(ann_publi) FROM LIVRES); -
sql SELECT A.nom, COUNT(*) FROM AUTEURS A INNER JOIN LIVRES L ON A.id = L.id_auteur GROUP BY A.id HAVING COUNT(*) = (SELECT MAX(cnt) FROM (SELECT COUNT(*) as cnt FROM LIVRES GROUP BY id_auteur)); -
sql SELECT DISTINCT genre FROM LIVRES WHERE genre NOT IN (SELECT genre FROM LIVRES WHERE ann_publi < 1950);
Exercice 11 : QCM
- Quelle clause permet de filtrer les résultats d'un GROUP BY ?
- [ ] a) WHERE
- [ ] b) FILTER
- [ ] c) HAVING
-
[ ] d) GROUP FILTER
-
Quelle est la différence entre WHERE et HAVING ?
- [ ] a) Aucune, ils sont équivalents
- [ ] b) WHERE filtre avant GROUP BY, HAVING filtre après
- [ ] c) HAVING filtre avant GROUP BY, WHERE filtre après
-
[ ] d) WHERE ne fonctionne qu'avec les nombres
-
Que retourne
SELECT COUNT(*) FROM LIVRES WHERE 1=0;? - [ ] a) Une erreur
- [ ] b) NULL
- [ ] c) 0
-
[ ] d) Rien
-
Quel type de jointure retourne tous les enregistrements de la table de gauche ?
- [ ] a) INNER JOIN
- [ ] b) LEFT JOIN
- [ ] c) RIGHT JOIN
-
[ ] d) CROSS JOIN
-
Quelle fonction d'agrégation ignore les valeurs NULL ?
- [ ] a) COUNT(*)
- [ ] b) COUNT(colonne)
- [ ] c) Les deux
- [ ] d) Aucune
Auteur : Florian Mathieu
Licence CC BY NC
Ce cours est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.