Exemples SQL
Exemples SQL
Exemples SQL
5) Quelles sont les douze communes de Loire-Atlantique les plus densément peuplées ?
6) Donner la liste des numéros de département, avec pour chaque numéro le nombre de communes du
département. Afficher un titre explicite pour la colonne des nombres de communes.
7) Donner la liste des numéros de département, avec pour chaque numéro la population totale du
département. Trier par population totale décroissante et limiter la liste aux départements ayant
plus d’un million d’habitants.
8) Donner les communes ayant les six voyelles dans leur nom. Noter que SQL ne distingue pas ma-
juscules/minuscules. Lister ces noms, triés par longueur croissante (la fonction LENGTH donne la
longueur d’une chaîne de caractères). Y en a-t-il en Loire-Atlantique ? Dans le Maine-et-Loire ?
9) Quelles sont les quinze communes pour lesquelles l’écart entre les altitudes maximale et minimale
est le plus grand ?
10) Quelles sont les dix communes de Loire-Atlantique où la population a le plus augmenté en valeurs
absolues, entre 1999 et 2010 ?
11) Même question en valeurs relatives. Attention ! Pour SQL, un quotient d’entiers est le quotient
(entier !) de la division euclidienne. Pour forcer un calcul en flottants, on peut multiplier par 1.0 !
Exemples de requêtes SQL Page 2
2) Donner la liste des noms de départements, avec pour chaque département le nombre de communes.
Ordonner par population décroissante.
3) Donner la liste des noms des régions avec la densité de population de chaque région.
4) Un exemple où le mot-clé DISTINCT est utile, comme dans le sujet du concours Centrale 2015 . . .
Donner sans doublons la liste des noms des départements contenant une commune dont le nom
commence par “Petit”.
3) Requêtes imbriquées
Le résultat d’un SELECT est une table qui peut être réutilisée dans une autre requête. C’est ce qu’il fallait
faire dans 2 questions sur 3 de la partie “bases de données” du sujet du concours Mines-Ponts 2015 et
c’est ce qui était sans doute attendu dans le sujet Mines-Ponts 2016. . .
1) Lorsqu’un SELECT renvoie un simple scalaire (par exemple via une fonction d’agrégation), on peut
réutiliser ladite requête SELECT. . . (entre parenthèses) comme ledit scalaire.
Donner la liste des noms de communes dont la population excède 100 fois la population moyenne
des différentes communes.
3) Donner sans doublons la liste des noms des régions contenant au moins un département dont le nom
commence par “V”. On peut utiliser DISTINCT ou EXISTS. . .
4) Donner sans doublons la liste des noms des régions ne contenant aucune commune dont le nom
contient les six voyelles.
5) Donner la liste des noms des régions avec pour chacune le nom et la population de la commune la
plus peuplée de la région.
Exemples de requêtes SQL Page 3
II - Exemples de solutions
1) Requêtes sans jointure
1) SELECT SUM(population_2010) FROM communes;
8) SELECT nom FROM communes WHERE nom LIKE ’%a%’ AND nom LIKE ’%e%’
AND nom LIKE ’%i%’ AND nom LIKE ’%o%’ AND nom LIKE ’%u%’ AND nom LIKE ’%y%’
ORDER BY LENGTH(nom);
Pour voir par exemple s’il y en a en Loire-Atlantique, ajouter AND num_departement=44 !
9) SELECT nom, num_departement, zmax-zmin as écart FROM communes
ORDER BY écart DESC LIMIT 15;
10) SELECT nom, population_2010-population_1999 AS var_abs
FROM communes WHERE num_departement=44 ORDER BY var_abs DESC LIMIT 10;
11) SELECT nom, 1.*population_2010/population_1999-1 AS var_rel
FROM communes WHERE num_departement=44 ORDER BY var_rel DESC LIMIT 10;
3) Requêtes imbriquées
1) SELECT nom, population_2010 AS population FROM communes
WHERE population > 100*(SELECT AVG(population_2010) FROM communes);
2) SELECT nom, num_departement, zmin FROM communes
WHERE zmin = (SELECT MIN(zmin) FROM communes WHERE zmin >= 940
AND zmin != (SELECT MIN(zmin) FROM communes WHERE zmin >= 940));
On peut penser à utiliser un tri avec l’option OFFSET mais, d’une part ce n’est pas explicitement au
programme, d’autre part cela ne fonctionne qu’en l’absence d’ex æquo. . .
b) Seconde version avec EXISTS, qui suppose d’imbriquer une deuxième requête :
SELECT nom FROM regions
WHERE EXISTS (SELECT * FROM departements
WHERE departements.num_region = regions.num_region AND
departements.nom LIKE ’V%’);