280 lines
7.9 KiB
Markdown
280 lines
7.9 KiB
Markdown
# 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 :
|
|
|
|
1. Tous les livres de la table LIVRES.
|
|
|
|
2. Les titres et années de publication de tous les livres.
|
|
|
|
3. Les noms et prénoms de tous les auteurs.
|
|
|
|
4. Les titres des livres publiés après 1950.
|
|
|
|
5. Les titres des livres du genre "dystopie".
|
|
|
|
6. Les auteurs de nationalité française.
|
|
|
|
---
|
|
|
|
## Exercice 2 : Filtres et conditions
|
|
|
|
Écrire les requêtes SQL permettant d'obtenir :
|
|
|
|
1. Les livres publiés entre 1940 et 1960 (inclus).
|
|
|
|
2. Les livres ayant plus de 300 pages.
|
|
|
|
3. Les auteurs nés après 1900 et de nationalité américaine.
|
|
|
|
4. Les livres dont le titre contient le mot "Terre".
|
|
|
|
5. Les livres qui ne sont pas du genre "SF".
|
|
|
|
6. Les auteurs dont le prénom commence par la lettre "R".
|
|
|
|
---
|
|
|
|
## Exercice 3 : Tri et limitation
|
|
|
|
Écrire les requêtes SQL permettant d'obtenir :
|
|
|
|
1. Tous les livres triés par année de publication (du plus ancien au plus récent).
|
|
|
|
2. Les 5 livres les plus récents.
|
|
|
|
3. Les auteurs triés par année de naissance décroissante.
|
|
|
|
4. Les 3 livres ayant le plus de pages.
|
|
|
|
5. Les livres triés par genre, puis par titre alphabétique.
|
|
|
|
6. La liste des genres sans doublons.
|
|
|
|
---
|
|
|
|
## Exercice 4 : Fonctions d'agrégation
|
|
|
|
Écrire les requêtes SQL permettant d'obtenir :
|
|
|
|
1. Le nombre total de livres dans la base.
|
|
|
|
2. Le nombre de pages du livre le plus long.
|
|
|
|
3. L'année de publication du livre le plus ancien.
|
|
|
|
4. Le nombre moyen de pages des livres.
|
|
|
|
5. Le nombre de livres par genre.
|
|
|
|
6. 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 :
|
|
|
|
1. Le nombre de livres écrits par chaque auteur (afficher id_auteur et le compte).
|
|
|
|
2. Le nombre moyen de pages par genre.
|
|
|
|
3. Les genres ayant plus de 2 livres.
|
|
|
|
4. Les auteurs ayant écrit au moins 2 livres (afficher id_auteur et le nombre).
|
|
|
|
5. L'année de publication du premier livre de chaque auteur.
|
|
|
|
6. Les genres dont la moyenne de pages dépasse 250.
|
|
|
|
---
|
|
|
|
## Exercice 6 : Jointures
|
|
|
|
Écrire les requêtes SQL permettant d'obtenir :
|
|
|
|
1. Les titres des livres avec le nom et prénom de leur auteur.
|
|
|
|
2. Les titres des livres écrits par des auteurs français.
|
|
|
|
3. Les titres et auteurs des livres du genre "dystopie", triés par année.
|
|
|
|
4. Le nom des auteurs ayant écrit des livres de plus de 400 pages.
|
|
|
|
5. Les livres (titre) avec le nom de l'auteur, uniquement pour les auteurs américains nés après 1910.
|
|
|
|
6. 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 :
|
|
|
|
1. Le titre du livre le plus long de chaque auteur, avec le nom de l'auteur.
|
|
|
|
2. Les auteurs n'ayant écrit qu'un seul livre (afficher nom, prénom, titre du livre).
|
|
|
|
3. Le nombre moyen de pages des livres par nationalité d'auteur.
|
|
|
|
4. Les genres pour lesquels tous les livres ont été publiés après 1940.
|
|
|
|
5. Le nom complet (prénom + nom) des auteurs et le nombre total de pages qu'ils ont écrites.
|
|
|
|
---
|
|
|
|
## Exercice 8 : INSERT, UPDATE, DELETE
|
|
|
|
1. É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
|
|
|
|
2. É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
|
|
|
|
3. Écrire une requête pour changer le genre de "Dune" en "SF".
|
|
|
|
4. Écrire une requête pour augmenter de 10% le nombre de pages de tous les livres de Jules Verne.
|
|
|
|
5. Écrire une requête pour supprimer tous les livres publiés avant 1900.
|
|
|
|
---
|
|
|
|
## Exercice 9 : Création de tables
|
|
|
|
1. É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)
|
|
|
|
2. Écrire la requête SQL pour créer une table EDITEURS avec :
|
|
- id (entier, clé primaire)
|
|
- nom (texte)
|
|
- pays (texte)
|
|
- ann_creation (entier)
|
|
|
|
3. 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 :
|
|
|
|
1. ```sql
|
|
SELECT titre FROM LIVRES WHERE ann_publi = (SELECT MIN(ann_publi) FROM LIVRES);
|
|
```
|
|
|
|
2. ```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));
|
|
```
|
|
|
|
3. ```sql
|
|
SELECT DISTINCT genre FROM LIVRES WHERE genre NOT IN (SELECT genre FROM LIVRES WHERE ann_publi < 1950);
|
|
```
|
|
|
|
---
|
|
|
|
## Exercice 11 : QCM
|
|
|
|
1. Quelle clause permet de filtrer les résultats d'un GROUP BY ?
|
|
- [ ] a) WHERE
|
|
- [ ] b) FILTER
|
|
- [ ] c) HAVING
|
|
- [ ] d) GROUP FILTER
|
|
|
|
2. 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
|
|
|
|
3. Que retourne `SELECT COUNT(*) FROM LIVRES WHERE 1=0;` ?
|
|
- [ ] a) Une erreur
|
|
- [ ] b) NULL
|
|
- [ ] c) 0
|
|
- [ ] d) Rien
|
|
|
|
4. 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
|
|
|
|
5. 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
|
|
|
|
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.
|