Files
TermNSI/SQL/EXERCICES.md

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>.