Vous êtes sur la page 1sur 22

Lycée Malherbe Année scolaire 2018-2019 MPSI - Informatique pour tous

TP no 17 - Requêtes SQL (Corrigé)


J’ai déposé sur mon site web la base de données geographie.sqlite qui contient les tables suivantes :
‚ une table communes des communes de France, avec les champs suivants :
— num_departement : numéro du département ;
— nom : nom de la commune ;
— canton : canton de la commune ;
— population_2010 : nombre d’habitants lors du recensement de 2010 ;
— population_1999 : nombre d’habitants lors du recensement de 1999 ;
— surface : surface de la commune en km2 ;
— longitude : longitude du centre de la commune en GRD (peu importe l’unité, quand il s’agira
de faire des dessins). ;
— latitude : latitude du centre de la commune en GRD ;
— zmin : altitude minimum de la commune par rapport au niveau de la mer ;
— zmax : altitude maximum de la commune par rapport au niveau de la mer.
‚ une table departements des départements de France, dont les champs sont faciles à deviner
‚ une table regions des régions de France, dont les champs sont faciles à deviner (on rappelle
que chaque commune appartient à un département, et que chaque département appartient à une
région).

Comme au TP précédent, on utilisera le logiciel DB Browser for SQLite.

Dans la suite, on demande de taper des requêtes (de recherche) SQL, afin de répondre aux questions
suivantes (et à toute autre question intéressante que vous vous poseriez, et dont je pourrais faire bénéficier
vos camarades du futur à qui je donnerais le même TP).

1 Pour commencer. . .

1 Obtenez la liste des noms de toutes les communes de France (et pas les autres champs).

1 SELECT nom FROM communes;
 

2 Obtenez la liste des dix communes de France les plus peuplées.



1 SELECT nom,num_departement,population_2010
2 FROM communes
3 ORDER BY population_2010 DESC
4 LIMIT 10 ;
 

1 Paris|75|2243833
2 Marseille|13|850726
3 Lyon|69|484344
4 Toulouse|31|441802
5 Nice|06|343304
6 Nantes|44|284970
7 Strasbourg|67|271782
8 Montpellier|34|257351
9 Bordeaux|33|239157

1
10 Lille|59|227560

3 Quelle est la commune le plus au Nord de la France ? Connaissez-vous la chanson d’Alain Souchon ?

1 SELECT nom, latitude FROM communes ORDER BY latitude DESC LIMIT 1;
 

1 Bray-Dunes|56746
https://www.youtube.com/watch?v=P5weqdVaChQ

4 Obtenez la liste des dix communes de France les plus densément peuplées.

1 SELECT nom,num_departement,population_2010/surface AS d
2 FROM communes
3 ORDER BY d DESC
4 LIMIT 10 ;
 

1 Levallois-Perret|92|26660.9958506224
2 Le Pré-Saint-Gervais|93|25778.5714285714
3 Vincennes|94|25377.4869109948
4 Saint-Mandé|94|24343.4782608696
5 Montrouge|92|23476.8115942029
6 Paris|75|21288.7381404175
7 Courbevoie|92|20975.7793764988
8 Clichy|92|19128.5714285714
9 Boulogne-Billancourt|92|18509.7244732577
10 Lilas|93|17641.2698412698
37.5 m2 par habitants à Levallois-Perret.

1 SELECT nom,num_departement,1e6*surface/population_2010 AS s
2 FROM communes
3 WHERE s IS NOT NULL
4 ORDER BY s
5 LIMIT 10 ;
 

1 Levallois-Perret|92|37.5079762812631
2 Le Pré-Saint-Gervais|93|38.7919091160986
3 Vincennes|94|39.4050050545687
4 Saint-Mandé|94|41.0787640650116
5 Montrouge|92|42.5952219272795
6 Paris|75|46.973192746519
7 Courbevoie|92|47.6740330860076
8 Clichy|92|52.2778192681105
9 Boulogne-Billancourt|92|54.0256556192811
10 Lilas|93|56.6852618319237
Plus de 215 hectares par personne à Maripasoula, la commune la plus vaste de France (en Guyane).

1 SELECT nom, surface AS s, surface/population_2010*100
2 FROM communes
3 ORDER BY s DESC
4 LIMIT 10;
 

2
5 Obtenez la liste des dix plus petites communes de France en termes de surface.

1 SELECT nom,num_departement,surface FROM communes ORDER BY surface LIMIT 10 ;
 

1 Castelmoron-d’Albret|33|0.04
2 Plessix-Balisson|22|0.08
3 Vaudherland|95|0.09
4 Lannoy|59|0.18
5 Saint-Antoine|33|0.2
6 Mallièvre|85|0.2
7 La Ferrière-sur-Risle|27|0.24
8 Sainte-Marie|65|0.28
9 Bourg-le-Roi|72|0.36
10 Mont-Louis|66|0.39

6 Quelles sont les 15 communes de France dont l’écart entre l’altitude la plus haute, et l’altitude la
plus basse, est le plus élevé ?

1 SELECT nom, zmax-zmin AS e FROM communes ORDER BY e DESC LIMIT 15;
 

2 Sélection

7 Obtenez la liste des communes de France de plus de 200 000 habitants.



1 SELECT nom FROM communes WHERE population_2010>=200000 ;
 

8 Quelles sont les 20 communes les plus densément peuplées du Calvados ?



1 SELECT nom, population_2010/surface AS d
2 FROM communes
3 WHERE num_departement=14
4 ORDER BY d DESC
5 LIMIT 20;
 

9 Obtenez la liste des départements des régions Auvergne-Rhône-Alpes (numéro INSEE 84) et
Aquitaine-Limousin-Poitou-Charentes (numéro INSEE 75).

1 SELECT nom
2 FROM departements
3 WHERE num_region = 84 OR num_region = 75 ;
 

Ou un peu plus joli :

1 SELECT nom
2 FROM departements
3 WHERE num_region IN (85,75) ;
 

On peut aussi utiliser une jointure, si on ne connaı̂t pas les numéros INSEE (voir plus loin dans le
TP).


3
1 SELECT d.nom, r.nom
2 FROM departements AS d JOIN regions AS r
3 ON d.num_region = r.num_region
4 WHERE r.nom = ’Aquitaine-Limousin-Poitou-Charentes’ OR r.nom = ’Auvergne-Rh^
one-
Alpes’;
 

10 Listez les 5 communes de France les plus peuplées et dont le nom commence par “Z”. Connaissez-
vous le film avec Jean-Paul Belmondo ?

1 SELECT nom,num_departement,population_2010 FROM communes
2 WHERE nom like ’Z%’
3 ORDER BY population_2010 DESC
4 LIMIT 5 ;;
 

1 Zillisheim|68|2643
2 Zonza|2A|2341
3 Zutkerque|62|1713
4 Zuydcoote|59|1669
5 Zegerscappel|59|1464
Et pour le film, c’est “Week-end à Zuydcoote” (merci Valentine !).

11 Quelles sont les cinq communes du Calvados où la plus population a le plus augmenté entre 1999
et 2010 ? Répondez en augmentation absolue d’abord, puis en augmentation relative.

1 SELECT nom, population_2010-population_1999 AS a
2 FROM communes
3 WHERE num_departement=14
4 ORDER BY a DESC
5 LIMIT 10 ;
 

Notez la petite subtilité (1.*) pour l’interprétation en flottants.

1 SELECT nom, population_1999, population_2010,
2 (1.*population_2010/population_1999-1)*100 AS a
3 FROM communes
4 WHERE num_departement=14
5 ORDER BY a DESC
6 LIMIT 10 ;
 

12 Quelle est la commune de France, dont le nom contient les six voyelles, et est le plus court ? On
pourra utiliser la fonction LENGTH sur les chaı̂nes de caractères.

1 SELECT nom, num_departement FROM communes WHERE
2 nom LIKE ’%a%’ AND
3 nom LIKE ’%e%’ AND
4 nom LIKE ’%i%’ AND
5 nom LIKE ’%o%’ AND
6 nom LIKE ’%u%’ AND
7 nom LIKE ’%y%’
8 ORDER BY LENGTH(nom) LIMIT 2

4
9 ;
 

1 Nyoiseau|49
2 Royaumeix|54

13 Existe-t-il une commune dans le Calvados dont le nom contient les six voyelles “a”, “e”, “i”, “o”,
“u”, “y” (en majuscule ou minuscule) dans son nom ?

1 SELECT nom FROM communes WHERE num_departement=14 AND
2 nom LIKE ’%a%’ AND
3 nom LIKE ’%e%’ AND
4 nom LIKE ’%i%’ AND
5 nom LIKE ’%o%’ AND
6 nom LIKE ’%u%’ AND
7 nom LIKE ’%y%’ ;
 

1 Sainte-Honorine-de-Ducy
2 Cesny-Bois-Halbout
3 Neuilly-la-For^
et
4 Saint-Martin-du-Mesnil-Oury
5 Sainte-Honorine-du-Fay
6 Saint-Manvieu-Norrey
7 Vacognes-Neuilly
8 Saint-Cyr-du-Ronceray
9 Saint-Georges-d’Aunay
10 Landelles-et-Coupigny

14 Trouver toutes les communes françaises dont le nom commence par “ca” et termine par “en” ?
(vous devriez en obtenir au moins une. . . !)

1 SELECT nom FROM communes WHERE nom LIKE "ca%en";
 

1 Caen
2 Calorguen
3 Cassen
4 Cachen
5 Callen
6 Caden
7 Cadalen

15 Quel est le nom de l’unique commune française dont le nom contient deux fois la lettre “z” et une
fois la lettre “x” ?

1 SELECT nom,num_departement FROM communes
2 WHERE nom LIKE "%z%z%" AND nom LIKE "%x%";
 

Vézézoux en Haute-Loire.

16 Trouver toutes les communes françaises dont le nom contient au moins 40 caractères. Et les com-
munes dont le nom contient au plus 2 caractères ?

5

1 SELECT nom,num_departement FROM communes WHERE LENGTH(nom)>=40;
 

1 Saint-Germain-de-Tallevende-la-Lande-Vaumont|14
2 Saint-Martin-de-Bienfaite-la-Cressonnière|14
3 Bors (Canton de Baignes-Sainte-Radegonde)|16
4 Bors (Canton de Montmoreau-Saint-Cybard)|16
5 Montigny-Mornay-Villeneuve-sur-Vingeanne|21
6 La Vacquerie-et-Saint-Martin-de-Castries|34
7 Saint-Remy-en-Bouzemont-Saint-Genest-et-Isson|51
8 Roche-sur-Linotte-et-Sorans-les-Cordiers|70
9 Beaujeu-Saint-Vallier-Pierrejux-et-Quitteur|70

1 SELECT nom,num_departement FROM communes WHERE LENGTH(nom)<=2;
 

1 Sy|08
2 Fa|11
3 By|25
4 B^
u|28
5 O^
o|31
6 Oz|38
7 Ay|51
8 Ri|61
9 Uz|65
10 Py|66
11 Ur|66
12 Gy|70
13 Eu|76
14 Ry|76
15 Y|80
16 Us|95

3 Agrégation sans regroupement


En utilisant les opérations d’agrégation (COUNT, MIN, MAX, SUM, AVG), répondez aux questions
suivantes :

17 Combien d’habitants en France (en supposant que chaque habitant est rattaché à exactement une
commune, ce qui est peut-être un postulat faux. . . ) ?

1 SELECT SUM(population_2010) FROM communes;
 

1 64879935

18 Combien de communes dans le Calvados ?



1 SELECT COUNT(*) FROM communes WHERE communes.num_departement=14 ;
 

1 706

6
19 Combien de communes françaises contiennent deux fois la lettre “x” ou “X” dans leur nom ?

1 SELECT COUNT(*) FROM communes WHERE nom LIKE ’%X%X%’ ;
 

1 45
Dans le motif à la fin de la requête, le X est pris en majuscule ou minuscule (insensibilité à la casse).

20 Combien de communes françaises contiennent les six voyelles “a”, “e”, “i”, “o”, “u”, “y” (en
majuscule ou minuscule) dans leurs noms ?

1 SELECT COUNT(*) FROM communes WHERE
2 nom LIKE ’%a%’ AND
3 nom LIKE ’%e%’ AND
4 nom LIKE ’%i%’ AND
5 nom LIKE ’%o%’ AND
6 nom LIKE ’%u%’ AND
7 nom LIKE ’%y%’ ;
 

4 Agrégation avec regroupement

21 Obtenez la liste des numéros de départements, et pour chaque département, le nombre de communes.
Vous ordonnerez par nombre de communes décroissant.

1 SELECT num_departement, COUNT(*) AS C FROM communes
2 GROUP BY num_departement
3 ORDER BY c DESC;
 

22 Comparer l’altitude maximale moyenne des communes du Calvados et des communes de la Haute-
Savoie (74).

1 SELECT num_departement, AVG(zmax) FROM communes
2 WHERE num_departement in (14,74)
3 GROUP BY num_departement ;
 

1 14|139.909348441926
2 74|1310.60544217687

23 Obtenez la liste des numéros de départements, et pour chaque département, la population totale.
Les départements seront classés par population décroissante.

1 SELECT num_departement, SUM(population_2010) AS S
2 FROM communes
3 GROUP BY num_departement
4 ORDER BY S DESC;
 

24 En France, une ville est une commune qui a au moins 2000 habitants.
Obtenez la liste des 10 départements les moins urbanisés de France.

7

1 SELECT num_departement, SUM(population_2010) AS S
2 FROM communes
3 WHERE population_2010>=2000
4 GROUP BY num_departement
5 ORDER BY S
6 LIMIT 10;
 

25 ‹(Question méchante mais naturelle et nécessaire ! ! !) Obtenez la liste des numéros des départements
de plus de 1 500 000 habitants.
Pour filtrer en fonction des résultats d’une fonction d’agrégation, il faut filtrer en aval.

1 SELECT num_departement, SUM(population_2010) AS S
2 FROM communes
3 GROUP BY num_departement HAVING S>=1500000
4 ORDER BY S DESC;
 

1 59|2576770
2 75|2243833
3 13|1972018
4 69|1725177
5 92|1572490
6 93|1522048

26 Pour chaque entier n tel qu’il existe une commune dont le nom contient n caractères, obtenir le
nombre de communes dont le nom contient n caractères.

1 SELECT LENGTH(nom) AS l, COUNT(*)
2 FROM communes
3 GROUP BY l
4 ORDER BY l DESC ;;
 

1 45|1
2 44|1
3 43|1
4 41|2
5 40|4
6 38|3
7 37|2
8 36|2
9 35|6
10 34|4
11 33|2
12 32|9
13 31|11
14 30|24
15 29|50
16 28|53
17 27|105
18 26|213

8
19 25|345
20 24|518
21 23|684
22 22|834
23 21|968
24 20|1035
25 19|1150
26 18|1227
27 17|1176
28 16|1221
29 15|1155
30 14|1039
31 13|1219
32 12|1477
33 11|1944
34 10|2612
35 9|3185
36 8|3935
37 7|3932
38 6|3469
39 5|2127
40 4|778
41 3|160
42 2|15
43 1|1

27 ‹ Pour chaque entier n tel qu’il existe une commune dont le nom contient n caractères, obtenir le
nombre de communes dont le nom contient n caractères, ainsi qu’un exemple d’une telle commune (c’est
la fin de l’énoncé qui diffère d’une question précédente).
On peut très bien prendre la première commune par ordre alphabétique pour répondre à la question.


1 SELECT MIN(nom), LENGTH(nom) AS l, COUNT(*)
2 FROM communes
3 GROUP BY l
4 ORDER BY l DESC ;;
 

1 Saint-Remy-en-Bouzemont-Saint-Genest-et-Isson|45|1
2 Saint-Germain-de-Tallevende-la-Lande-Vaumont|44|1
3 Beaujeu-Saint-Vallier-Pierrejux-et-Quitteur|43|1
4 Bors (Canton de Baignes-Sainte-Radegonde)|41|2
5 Bors (Canton de Montmoreau-Saint-Cybard)|40|4
6 Bonneville-et-Saint-Avit-de-Fumadières|38|3
7 Javerlhac-et-la-Chapelle-Saint-Robert|37|2
8 Castillon (Canton d’Arthez-de-Béarn)|36|2
9 Angoustrine-Villeneuve-des-Escaldes|35|6
10 Crevans-et-la-Chapelle-lès-Granges|34|4
11 Saint-Jean-de-Maruéjols-et-Avéjan|33|2
12 Champeaux-et-la-Chapelle-Pommier|32|9
13 Autevielle-Saint-Martin-Bideren|31|11

9
14 Broye-les-Loups-et-Verfontaine|30|24
15 Adelans-et-le-Val-de-Bithaine|29|50
16 Cazaux-Fréchet-Anéran-Camors|28|53
17 Alçay-Alçabéhéty-Sunharette|27|105
18 Allemanche-Launay-et-Soyer|26|213
19 Amfreville-sous-les-Monts|25|345
20 Ahaxe-Alciette-Bascassan|24|518
21 Alland’Huy-et-Sausseuil|23|684
22 Abbeville-Saint-Lucien|22|834
23 Ailly-le-Haut-Clocher|21|968
24 Abaucourt-Hautecourt|20|1035
25 Abergement-la-Ronce|19|1150
26 Acheux-en-Amiénois|18|1227
27 Abjat-sur-Bandiat|17|1176
28 Achères-la-For^ et|16|1221
29 Ablon-sur-Seine|15|1155
30 Abbans-Dessous|14|1039
31 Abbans-Dessus|13|1219
32 Agos-Vidalos|12|1477
33 Abbévillers|11|1944
34 Abainville|10|2612
35 Abancourt|9|3185
36 Abbaretz|8|3935
37 Abitain|7|3932
38 Abidos|6|3469
39 Ablis|5|2127
40 Aast|4|778
41 Acq|3|160
42 Ay|2|15
43 Y|1|1

28 ‹ Il existe 4 communes en France dont le nom est “Louvigny” : une dans le Calvados, une dans la
Sarthe, une en Moselle, et une dans les Pyrénées-Atlantiques. Quels sont les noms de communes les plus
donnés en France ?

1 SELECT nom,COUNT(*) AS C FROM communes
2 GROUP BY nom
3 ORDER BY C DESC LIMIT 10;
 

1 Sainte-Colombe|14
2 Saint-Sauveur|12
3 Beaulieu|11
4 Sainte-Marie|11
5 Le Pin|10
6 Saint-Aubin|10
7 Saint-Loup|10
8 Saint-Rémy|10
9 Saint-Sulpice|10
10 Beaumont|9

10
5 Jointures à deux tables

29 Construire le produit cartésien des deux tables departements et regions. Combien d’enregistre-
ments ce produit cartésien compte-t-il ?

1 SELECT * FROM departements,regions;
 

1818 “ 101 ˆ 18 : le cardinal du produit cartésien et le produit des cardinaux des facteurs.

30 A l’aide d’une jointure, ne gardez que les enregistrements tels que le numéro de région coı̈ncide
dans les tables departements et regions.

1 SELECT * FROM departements JOIN regions
2 ON departements.num_region=regions.num_region ;
 

On pourrait aussi faire la jointure avec WHERE (moins bien) :

1 SELECT * FROM departements JOIN regions
2 WHERE departements.num_region=regions.num_region ;
 

31 On souhaite ne conserver que les enregistrements de cette jointure tels que num_region=28 ? Tentez
de rajouter WHERE num_region=28 à votre requête. Qu’obtenez-vous ? Quelle solution apporter ?

1 SELECT * FROM departements JOIN regions
2 ON departements.num_region=regions.num_region
3 WHERE num_region=28 ;;
 

1 Error: near line 1: ambiguous column name: num_region
Il y a un champ qui s’appelle num_region dans chacune des deux tables. Il faut donc préciser à quelle
table appartient num_region.

1 SELECT * FROM departements JOIN regions
2 ON departements.num_region=regions.num_region
3 WHERE departements.num_region=28 ;;
 

1 14|Calvados|28|28|Normandie
2 27|Eure|28|28|Normandie
3 50|Manche|28|28|Normandie
4 61|Orne|28|28|Normandie
5 76|Seine Maritime|28|28|Normandie
On pourrait aussi faire la jointure avec WHERE (moins bien) :

1 SELECT * FROM departements, regions
2 WHERE departements.num_region=regions.num_region
3 AND departements.num_region=28 ;;
 

1 14|Calvados|28|28|Normandie
2 27|Eure|28|28|Normandie
3 50|Manche|28|28|Normandie
4 61|Orne|28|28|Normandie
5 76|Seine Maritime|28|28|Normandie

11
32 Obtenez la liste des noms de départements (en toutes lettres), et pour chaque département, le
nombre de communes. Vous ordonnerez par nombre de communes décroissant.
Presque fait dans une question précédente !
Reste à rajouter la jointure. On utilise departements.nom dans le GROUP BY pour pouvoir l’utiliser
après le SELECT.

1 SELECT departements.nom, COUNT(*) AS T
2 FROM communes
3 JOIN departements
4 ON communes.num_departement = departements.num_departement
5 GROUP BY communes.num_departement
6 ORDER BY T DESC;
 

33 Obtenez la liste des noms de départements (en toutes lettres), et pour chaque département, la
population totale. Les départements seront classés par population décroissante.
Presque fait dans une question précédente !
Reste à rajouter la jointure. On utilise departements.nom dans le GROUP BY pour pouvoir l’utiliser
après le SELECT.

1 SELECT departements.nom, sum(population_2010) as S
2 FROM communes
3 JOIN departements
4 ON communes.num_departement = departements.num_departement
5 GROUP BY communes.num_departement
6 ORDER BY S DESC;
 

34 ‹ Obtenez la liste des noms de départements (en toutes lettres) de plus de 1 500 000 habitants.
Presque fait dans une question précédente !
Reste à rajouter la jointure. On utilise departements.nom dans le GROUP BY pour pouvoir l’utiliser
après le SELECT.

1 SELECT departements.nom, sum(population_2010) as S
2 FROM communes
3 JOIN departements
4 ON communes.num_departement = departements.num_departement
5 GROUP BY communes.num_departement
6 HAVING S>=1500000
7 ORDER BY S DESC;
 

1 Nord|2576770
2 Paris|2243833
3 Bouches du rh^
one|1972018
4 Rh^
one|1725177
5 Hauts de Seine|1572490
6 Seine Saint Denis|1522048

35 Obtenez la liste des régions de France, ainsi que le nombre de départements composant la région,
rangée par nombre de départements décroissant.
On utilise regions.nom dans le GROUP BY pour pouvoir l’utiliser après le SELECT.

12

1 SELECT regions.nom, COUNT(*) as C
2 FROM regions JOIN departements
3 ON departements.num_region = regions.num_region
4 GROUP BY departements.num_region
5 ORDER BY C DESC;
 

36 Quelle est la densité de population de chaque département (on veut les noms des départements en
toutes lettres) ?

1 SELECT departements.nom, SUM(population_2010)/SUM(surface) as S
2 FROM communes
3 JOIN departements
4 ON communes.num_departement = departements.num_departement
5 GROUP BY communes.num_departement
6 ORDER BY S desc ;
 

37 Existe-t-il une commune de la région Aquitaine-Limousin-Poitou-Charentes, dont le nom contient


les six voyelles “a”, “e”, “i”, “o”, “u”, “y” (en majuscule ou minuscule) ?

1 SELECT communes.nom, communes.num_departement, departements.num_region
2 FROM communes JOIN departements
3 ON communes.num_departement = departements.num_departement
4 WHERE departements.num_region=75 AND
5 communes.nom LIKE ’%a%’ AND
6 communes.nom LIKE ’%e%’ AND
7 communes.nom LIKE ’%i%’ AND
8 communes.nom LIKE ’%o%’ AND
9 communes.nom LIKE ’%u%’ AND
10 communes.nom LIKE ’%y%’ ;
 

38 ‹ ‹ ‹ Obtenez la liste des communes contenant le nom de leur département à l’intérieur de leur nom
(ex : Saint-Sever-Calvados dans le Calvados).

1 SELECT communes.nom AS x1, departements.nom AS x2
2 FROM communes JOIN departements
3 ON communes.num_departement = departements.num_departement
4 WHERE x1 LIKE "%"||x2||"%"
5 ORDER BY population_2010 DESC LIMIT 20 ;
 

1 Paris|Paris
2 Corbeil-Essonnes|Essonne
3 Saint-Dié-des-Vosges|Vosges
4 La Valette-du-Var|Var
5 Nogent-sur-Oise|Oise
6 Mayenne|Mayenne
7 Sablé-sur-Sarthe|Sarthe
8 Livron-sur-Dr^ome|Dr^
ome
9 Saint-Genis-Pouilly|Ain

13
10 Meulan-en-Yvelines|Yvelines
11 Bellerive-sur-Allier|Allier
12 Divonne-les-Bains|Ain
13 Clermont-l’Hérault|Hérault
14 Thaon-les-Vosges|Vosges
15 Malemort-sur-Corrèze|Corrèze
16 Ballancourt-sur-Essonne|Essonne
17 Rochefort-du-Gard|Gard
18 Saint-Yrieix-sur-Charente|Charente
19 Saint-Florent-sur-Cher|Cher
20 Le Perray-en-Yvelines|Yvelines

6 Jointures à trois tables

39 Obtenez la liste des communes de France, avec pour chaque commune, le nom de son département,
et le nom de sa région.

1 SELECT communes.nom, departements.nom, regions.nom
2 FROM communes
3 JOIN departements ON communes.num_departement=departements.num_departement
4 JOIN regions ON departements.num_region=regions.num_region
5 ORDER BY communes.nom ;
 

1 Aast|Pyrénées Atlantiques|Aquitaine-Limousin-Poitou-Charentes
2 Abainville|Meuse|Alsace-Champagne-Ardenne-Lorraine
3 Abancourt|Nord|Nord-Pas-de-Calais-Picardie
4 Abancourt|Oise|Nord-Pas-de-Calais-Picardie
5 Abaucourt|Meurthe et Moselle|Alsace-Champagne-Ardenne-Lorraine
6 Abaucourt-Hautecourt|Meuse|Alsace-Champagne-Ardenne-Lorraine
7 Abbans-Dessous|Doubs|Bourgogne-Franche-Comté
8 ...

40 Obtenir la liste des régions (avec le nom en français), avec la population totale de la région ?

1 SELECT regions.nom, SUM(population_2010) AS S
2 FROM communes
3 JOIN departements
4 ON communes.num_departement = departements.num_departement
5 JOIN regions
6 ON departements.num_region = regions.num_region
7 GROUP BY departements.num_region
8 ORDER BY S desc ;
 

41 Densité de population de chaque région ?



1 SELECT regions.nom, sum(population_2010)/sum(surface) as S
2 FROM communes
3 JOIN departements
4 ON communes.num_departement = departements.num_departement

14
5 JOIN regions
6 ON departements.num_region = regions.num_region
7 GROUP BY departements.num_region
8 ORDER BY S DESC ;
 

42 Combien de communes en Normandie ?

Le mieux est d’utiliser l’opérateur de jointure normalisée JOIN.



1 SELECT COUNT(*)
2 FROM communes
3 JOIN departements
4 ON communes.num_departement = departements.num_departement
5 JOIN regions
6 ON departements.num_region = regions.num_region
7 WHERE regions.nom = ’Normandie’;
 

1 3232

43 Obtenez la liste des régions de France, et pour chaque région, la population totale, ainsi que le nom
et le nombre d’habitants de la commune la plus peuplée.

1 SELECT regions.nom, sum(population_2010) AS S, communes.nom, max(population_2010)
2 FROM communes
3 JOIN departements
4 ON communes.num_departement = departements.num_departement
5 JOIN regions
6 ON regions.num_region = departements.num_region
7 GROUP BY regions.num_region
8 ORDER BY S DESC;
 

1 ^
Ile-de-France|11786234|Paris|2243833
2 Auvergne-Rh^one-Alpes|7578078|Lyon|484344
3 Nord-Pas-de-Calais-Picardie|5953001|Lille|227560
4 Aquitaine-Limousin-Poitou-Charentes|5745486|Bordeaux|239157
5 Alsace-Champagne-Ardenne-Lorraine|5532038|Strasbourg|271782
6 Languedoc-Roussillon-Midi-Pyrénées|5518106|Toulouse|441802
7 Provence-Alpes-C^ote d’Azur|4899155|Marseille|850726
8 Pays de la Loire|3571495|Nantes|284970
9 Normandie|3318886|Le Havre|175497
10 Bretagne|3199066|Rennes|207178
11 Bourgogne-Franche-Comté|2813878|Dijon|151212
12 Centre-Val de Loire|2548553|Tours|134817
13 La Réunion|821136|Saint-Denis|145022
14 Guadeloupe|449272|Abymes|58534
15 Martinique|394173|Fort-de-France|87216
16 Corse|309693|Ajaccio|65542
17 Guyane|229040|Cayenne|55753
18 Mayotte|212645|Mamoudzou|57281

15
44 Quelles sont les 15 communes de France dont l’écart entre l’altitude la plus haute, et l’altitude
la plus basse, est le plus élevé ? Cette fois, précisez le nom du département et le nom de la région pour
chaque commune. . .

1 SELECT communes.nom, zmax-zmin AS e, departements.nom, regions.nom
2 FROM communes
3 JOIN departements
4 ON communes.num_departement = departements.num_departement
5 JOIN regions
6 ON departements.num_region = regions.num_region
7 ORDER BY e DESC LIMIT 15;
 

1 Saint-Gervais-les-Bains|4236|Haute Savoie|Auvergne-Rh^ one-Alpes
2 Chamonix-Mont-Blanc|3812|Haute Savoie|Auvergne-Rh^ one-Alpes
3 Houches|3484|Haute Savoie|Auvergne-Rh^ one-Alpes
4 Bourg-Saint-Maurice|3079|Savoie|Auvergne-Rh^ one-Alpes
5 Saint-Martin-de-Belleville|2924|Savoie|Auvergne-Rh^ one-Alpes
6 Pelvoux|2920|Hautes alpes|Provence-Alpes-C^ ote d’Azur
7 Villaroger|2920|Savoie|Auvergne-Rh^ one-Alpes
8 Champagny-en-Vanoise|2895|Savoie|Auvergne-Rh^ one-Alpes
9 Allues|2884|Savoie|Auvergne-Rh^ one-Alpes
10 Contamines-Montjoie|2881|Haute Savoie|Auvergne-Rh^ one-Alpes
11 Sainte-Foy-Tarentaise|2876|Savoie|Auvergne-Rh^ one-Alpes
12 La Grave|2841|Hautes alpes|Provence-Alpes-C^ ote d’Azur
13 Saint-Christophe-en-Oisans|2840|Isère|Auvergne-Rh^ one-Alpes
14 Valloire|2810|Savoie|Auvergne-Rh^ one-Alpes
15 Cauterets|2797|Hautes Pyrénées|Languedoc-Roussillon-Midi-Pyrénées

45 ‹(L’ultime question !) Obtenez la liste des noms de communes portés au moins 3 fois en Normandie.

1 SELECT communes.nom,COUNT(*) AS c FROM communes
2 JOIN departements
3 ON communes.num_departement = departements.num_departement
4 JOIN regions
5 ON departements.num_region = regions.num_region
6
7 WHERE regions.nom="Normandie"
8
9 GROUP BY communes.nom
10 HAVING c>2 ;
 

1 Conteville|3
2 Cuverville|3
3 Fontenay|3
4 Goupillières|3
5 Surville|3
Tout est là !
— jointure à 3 tables ;
— agrégation avec regroupement ;
— sélection en aval ;

16
— sélection en amont ;
— tri.

7 Commande EXISTS ‹‹

46 Obtenez (sans doublons) la liste des départements possédant une ville de plus de 140 000 habitants
en 2010.

1 SELECT nom,num_departement AS a
2 FROM departements
3 WHERE EXISTS (
4 SELECT num_departement AS b
5 FROM communes
6 WHERE a=b
7 AND population_2010>=140000
8 ) ;
 

Ou alors, on pourrait faire :

1 SELECT DISTINCT departements.nom, departements.num_departement
2 FROM departements
3 JOIN communes
4 ON departements.num_departement = communes.num_departement
5 WHERE population_2010>=140000 ;
 

Gare aux doublons ! Les Bouches-du-Rhône possèdent Marseille et Aix-en-Provence, qui ont chacun
plus de 140 000 habitants. Le Rhône possède Lyon et Villeurbanne, qui ont chacun également plus de
140 000 habitants. D’où le mot-clé DISTINCT.

47 Obtenez (sans doublons) la liste des départements ne possédant pas de commune de plus de 30 000
habitants en 2010.

1 SELECT nom,num_departement AS a
2 FROM departements
3 WHERE NOT EXISTS (
4 SELECT num_departement AS b
5 FROM communes
6 WHERE a=b
7 AND population_2010>=15000
8 ) ;
 

48 ‹ Obtenez (sans doublons) la liste des régions contenant des départements dont le nom commence
par “c” ou “C” (vous devriez retrouver la Basse-Normandie, normalement !).

1 SELECT nom, regions.num_region AS a
2 FROM regions
3 WHERE EXISTS
4 (SELECT *, departements.num_region AS b FROM departements
5 WHERE a=b
6 AND departements.nom LIKE ’C%’
7 );

17
 

1 Aquitaine-Limousin-Poitou-Charentes|75
2 Auvergne-Rh^
one-Alpes|84
3 Bourgogne-Franche-Comté|27
4 Bretagne|53
5 Centre-Val de Loire|24
6 Corse|94
7 Normandie|28
Un autre moyen est d’utiliser le mot-clé DISTINCT :

1 SELECT DISTINCT regions.nom
2 FROM departements
3 JOIN regions
4 ON departements.num_region = regions.num_region
5 WHERE departements.nom LIKE ’C%’ ;
 

49 ‹‹‹ Obtenez (sans doublons) la liste des régions ne contenant pas de communes dont le nom contient
les six voyelles.

1 SELECT nom, num_region AS a FROM regions
2 WHERE NOT EXISTS
3 (
4 SELECT *, departements.num_region AS b
5 FROM communes JOIN departements
6 ON communes.num_departement = departements.num_departement
7 WHERE a=b AND
8 communes.nom LIKE ’%a%’ AND
9 communes.nom LIKE ’%e%’ AND
10 communes.nom LIKE ’%i%’ AND
11 communes.nom LIKE ’%o%’ AND
12 communes.nom LIKE ’%u%’ AND
13 communes.nom LIKE ’%y%’
14 );
 

8 Requêtes imbriquées ‹‹

50 Obtenez la liste des numéros des départements qui ont une commune de plus de 200 000 habitants,
et pour ces départements, le nom de la plus grosse commune.
Sélection en aval : la sélection est effectuée après le regroupement en agrégats et l’application de la
fonction d’agrégation max.

1 SELECT num_departement,nom,population_2010 AS p
2 FROM communes
3 JOIN ( SELECT num_departement AS n, MAX(population_2010) AS m
4 FROM communes
5 GROUP BY n
6 HAVING m>=200000
7 ) AS A

18
8 ON p=m AND num_departement=n
9 ORDER BY num_departement ;
 

1 06|Nice|343304
2 13|Marseille|850726
3 31|Toulouse|441802
4 33|Bordeaux|239157
5 34|Montpellier|257351
6 35|Rennes|207178
7 44|Nantes|284970
8 59|Lille|227560
9 67|Strasbourg|271782
10 69|Lyon|484344
11 75|Paris|2243833

51 ‹ Afficher pour chaque lettre de l’alphabet, le nom de la commune de métropole (avec un numéro
de département ď 95) la plus étendue de France dont le nom commence par cette lettre.

1 SELECT c.nom, c.num_departement, c.surface, SUBSTR(nom,1,1) AS n
2 FROM communes AS c
3 JOIN (
4 SELECT MAX(surface) AS a, SUBSTR(nom,1,1) AS m
5 FROM communes
6 WHERE num_departement<=95
7 GROUP BY m
8 )
9 ON c.surface=a AND n=m
10 ORDER BY n ;
 

52 ‹ Obtenez la liste des numéros des départements, et pour chaque département correspondant, le
nom de la commune dont la population a le plus diminué entre 1999 et 2010.

1 SELECT nom, num_departement, population_2010-population_1999 AS d
2 FROM communes
3 JOIN (
4 SELECT num_departement as n,MIN(population_2010-population_1999) AS m
5 FROM communes
6 GROUP BY n
7 ) AS a
8 ON num_departement=a.n AND d=m ;
 

53 ‹ Quel pourcentage de la population française vit en ville (plus de 2000 habitants) ?



1 SELECT 100.*SUM(population_2010)/
2 (SELECT SUM(population_2010) FROM communes)
3 FROM communes
4 WHERE population_2010>=2000 ;
 

1 75.5611052939557

19
54 ‹ Calculer le pourcentage de communes française contenant “saint” dans leur nom (sans tenir
compte de la casse). Vous pouvez aussi chercher le pourcentage de communes contenant “ville” ou “mer”,
le pourcentage de communes se terminant par “e”, etc.

1 SELECT 100.*COUNT(*)/(SELECT COUNT(*) FROM communes)
2 FROM communes
3 WHERE nom LIKE ’%saint%’;
 

1 13.0902749393716

1 SELECT 100.*COUNT(*)/(SELECT COUNT(*) FROM communes)
2 FROM communes
3 WHERE nom LIKE ’%mer%’;
 

1 1.07359873566037

1 SELECT 100.*COUNT(*)/(SELECT COUNT(*) FROM communes)
2 FROM communes
3 WHERE nom LIKE ’%bain%’;
 

1 0.21798959099703

1 SELECT 100.*COUNT(*)/(SELECT COUNT(*) FROM communes)
2 FROM communes
3 WHERE nom LIKE ’%ville%’;
 

1 6.10370854791684

1 SELECT 100.*COUNT(*)/(SELECT COUNT(*) FROM communes)
2 FROM communes
3 WHERE nom LIKE ’%e%’;
 

1 73.0156135044552

1 SELECT 100.*COUNT(*)/(SELECT COUNT(*) FROM communes)
2 FROM communes
3 WHERE nom LIKE ’%e’;
 

1 22.8725578353634

1 SELECT 100.*COUNT(*)/(SELECT COUNT(*) FROM communes)
2 FROM communes
3 WHERE nom LIKE ’%z%’;
 

1 6.79582549933241

55 ‹ Ecrire une requête permettant d’afficher la deuxième ville la plus peuplée (on suppose que les
deux premières villes ont des populations différentes, et que la troisième ville a une population encore
strictement inférieure), et seulement elle (pas la première ville).

1 SELECT nom,population_2010 FROM communes

20
2 WHERE population_2010 =
3 ( SELECT MAX ( population_2010 ) FROM communes
4 WHERE population_2010 !=
5 (SELECT MAX ( population_2010 ) FROM communes )
6 ) ;
 

1 Marseille|850726
ou alors

1 SELECT nom, population_2010 FROM communes
2 WHERE population_2010 != ( SELECT MAX(population_2010) FROM communes )
3 ORDER BY population_2010 DESC LIMIT 1 ;
 

Une autre solution consiste à écrire :

1 SELECT nom,population_2010 FROM communes ORDER BY population_2010 DESC LIMIT 1
OFFSET 1 ;
 

1 Marseille|850726
Une troisième solution avec une complexité abominable :

1 SELECT nom,population_2010 FROM communes AS c
2 WHERE ( SELECT COUNT(*) FROM communes WHERE population_2010>c.population_2010) = 1
;
 

1 Marseille|850726

56 ‹ Quels sont les 10 cantons les moins peuplés de France ? Pour chacun de ces cantons, vous donnerez
la commune la plus peuplée.

1 SELECT c.nom,c.num_departement,c.canton,s,c.population_2010
2 FROM communes AS c
3 JOIN (
4 SELECT SUM(population_2010) AS s,
5 MAX(population_2010) AS m,
6 num_departement,
7 canton
8 FROM communes
9 GROUP BY num_departement,canton
10 ) AS a
11 ON c.num_departement = a.num_departement
12 AND c.canton = a.canton
13 AND c.population_2010=m
14 GROUP BY c.num_departement,c.canton
15 ORDER BY s LIMIT 10;
 

1 Laboulbène|81|40|138|138
2 Alleyras|43|98|173|173
3 Sivry-la-Perche|55|30|256|256
4 Adelans-et-le-Val-de-Bithaine|70|93|309|309
5 Vitrolles|05|04|383|209
6 Chamrousse|38|93|453|453

21
7 Quérigut|09|13|528|141
8 Vesly|50|98|659|659
9 Angles|81|03|670|531
10 Bresson|38|47|692|692

22

Vous aimerez peut-être aussi