6.**Pour chaque nationalité, le nombre de livres écrits.**
```sql
SELECTA.nationalite,COUNT(*)ASnb_livres
FROMAUTEURSA
INNERJOINLIVRESLONA.id=L.id_auteur
GROUPBYA.nationalite;
```
Résultat :
| nationalite | nb_livres |
|-------------|-----------|
| américain | 6 |
| britannique | 2 |
| français | 4 |
---
## Exercice 7 : Requêtes complexes
1.**Le titre du livre le plus long de chaque auteur, avec le nom de l'auteur.**
```sql
SELECTA.nom,A.prenom,L.titre,L.nb_pages
FROMLIVRESL
INNERJOINAUTEURSAONL.id_auteur=A.id
WHEREL.nb_pages=(
SELECTMAX(nb_pages)
FROMLIVRES
WHEREid_auteur=L.id_auteur
);
```
2.**Les auteurs n'ayant écrit qu'un seul livre.**
```sql
SELECTA.nom,A.prenom,L.titre
FROMAUTEURSA
INNERJOINLIVRESLONA.id=L.id_auteur
WHEREA.idIN(
SELECTid_auteur
FROMLIVRES
GROUPBYid_auteur
HAVINGCOUNT(*)=1
);
```
3.**Le nombre moyen de pages des livres par nationalité d'auteur.**
```sql
SELECTA.nationalite,AVG(L.nb_pages)ASmoy_pages
FROMAUTEURSA
INNERJOINLIVRESLONA.id=L.id_auteur
GROUPBYA.nationalite;
```
4.**Les genres pour lesquels tous les livres ont été publiés après 1940.**
```sql
SELECTgenre
FROMLIVRES
GROUPBYgenre
HAVINGMIN(ann_publi)>1940;
```
Résultat : dystopie (min 1931... non!), SF (min 1950), space opera (min 1951)
Note : En vérifiant les données, "Le meilleur des mondes" (dystopie) est de 1931, donc dystopie ne correspond pas. Les genres valides sont : SF, space opera, post-apo.
5.**Le nom complet des auteurs et le nombre total de pages qu'ils ont écrites.**
**Explication :** Cette requête retourne le titre du livre le plus ancien de la base. La sous-requête trouve l'année minimale, puis la requête principale sélectionne le(s) livre(s) publié(s) cette année-là.
**Explication :** Cette requête retourne le(s) auteur(s) ayant écrit le plus grand nombre de livres. La sous-requête interne compte les livres par auteur, la sous-requête externe trouve le maximum, et la requête principale affiche les auteurs atteignant ce maximum.
**Résultat :** Les auteurs avec 2 livres chacun (Asimov, Bradbury, Barjavel, Verne)
**Explication :** Cette requête retourne les genres pour lesquels AUCUN livre n'a été publié avant 1950. La sous-requête trouve les genres ayant au moins un livre avant 1950, puis la requête principale exclut ces genres.
**Résultat :** Les genres dont tous les livres sont de 1950 ou après (SF, space opera, potentiellement post-apo selon les données)
---
## Exercice 11 : QCM
1.**Quelle clause permet de filtrer les résultats d'un GROUP BY ?**
- **Réponse : c) HAVING**
2.**Quelle est la différence entre WHERE et HAVING ?**
- **Réponse : b) WHERE filtre avant GROUP BY, HAVING filtre après**
Explication : WHERE filtre les lignes individuelles avant le regroupement. HAVING filtre les groupes après le regroupement et permet d'utiliser des fonctions d'agrégation.
3.**Que retourne `SELECT COUNT(*) FROM LIVRES WHERE 1=0;` ?**
- **Réponse : c) 0**
Explication : La condition `1=0` est toujours fausse, donc aucune ligne n'est sélectionnée. COUNT(*) sur un ensemble vide retourne 0 (pas NULL, pas d'erreur).
4.**Quel type de jointure retourne tous les enregistrements de la table de gauche ?**
- **Réponse : b) LEFT JOIN**
Explication : LEFT JOIN retourne toutes les lignes de la table de gauche, même si elles n'ont pas de correspondance dans la table de droite (avec NULL pour les colonnes de droite).
5.**Quelle fonction d'agrégation ignore les valeurs NULL ?**
- **Réponse : b) COUNT(colonne)**
Explication : `COUNT(*)` compte toutes les lignes, y compris celles avec des NULL. `COUNT(colonne)` ne compte que les valeurs non NULL de cette colonne.
---
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>.