Voici quelques exercices de requêtes SQL, avec leurs solutions
Exercice 1
On considère dans ce sujet la base de données prenoms.
Cette base ne comporte qu’une table, naissances, qui contient des informations décrivant des prénoms des enfants nés en France au XX-ième siècle.
Les attributs de cette table sont :
- id : l’identifiant de l’entrée (clé primaire);
- sexe : le sexe de l’enfant au format texte : Fille ou Garçon ;
- prenom : le prénom de l’enfant en lettres majuscules ;
- annee_naissance : l’année de naissance (nombre entier) ;
- nombre : le nombre d’enfants nés durant l’année en question et portant ce prénom.
On rappelle que la structure générale d’une requête SQL est :
SELECT attribut_1, attribut_2, …
FROM table
WHERE condition;
Toutefois :
- il est possible d’obtenir tous les attributs en faisant SELECT * ;
- la condition WHERE condition n’est pas indispensable si l’on souhaite obtenir toutes les entrées de la table. On peut alors se contenter de SELECT attributs FROM table ;
- il est possible de rajouter d’autres arguments qui seront présentés au fil de ce document.
Voici les requêtes à réaliser :
-
ex 1 : Afficher les dix premières lignes de la table. Astuce : Utiliser LIMIT 10 à la fin de la requête afin de n’afficher que les 10 premiers résultats. Il y a beaucoup de lignes dans cette table !
-
ex 2 : Afficher les lignes correspondant à l’année 1923. Là encore, mieux vaut ne demander que les 10 premières lignes…
-
ex 3 : Afficher les prénoms des filles nées en 1978.
-
ex 4 : Combien de fois le prénom Nicolas a-t-il été donné en 1907 ? Attention aux majuscules.
-
ex 5 : Afficher les 10 prénoms de fille les plus donnés en 1978 rangés dans l’ordre décroissant du nombre de fois où ils ont été donnés.
-
ex 6 : Afficher le nombre de prénoms différents de garçons donnés en 1938.
-
ex 7 : Afficher le nombre de naissances de garçons observées en 1938.
-
ex 8 : Afficher le nombre de filles et le nombre de garçons apparaissant dans la table.
-
ex 9 : Quel est le prénom, pour un certain sexe, en distinguant par exemple “Camille (fille)” et “Camille (garçon)”, qui a été le plus donné durant une année donnée ? En quelle année ?
-
ex 10 : En quelle année y-a-t-il eu le plus de naissances ?
-
ex 11 : Quels sont les 10 prénoms les plus donnés en France au cours du XX-ème siècle ?
-
ex 12 : Afficher les lignes des prénoms de garçons donnés entre 1960 et 1969 (inclus l’un et l’autre). Utiliser un AND pour tester l’encadrement des années.
Pour réaliser l’exercice, téléchargez le fichier prenoms.db (32 116 ko), installez Sqlite3 et éventuellement DBBrowser.
Le fichier à télécharger : prenoms.db
Solution de l’exercice 1
-
ex 1 :
SELECT *
FROM naissances
LIMIT 10; -
ex 2 :
SELECT *
FROM naissances
WHERE annee_naissance = 1923
LIMIT 10;
-
ex 3 :
SELECT prenom
FROM naissances
WHERE sexe = ‘Fille’ AND annee_naissance = 1978;
-
ex 4 :
SELECT sexe, nombre
FROM naissances
WHERE prenom = ‘NICOLAS’ AND annee_naissance = 1907;
-
ex 5 :
SELECT prenom
FROM naissances
WHERE sexe = ‘Fille’ AND annee_naissance = 1978
ORDER BY nombre DESC
LIMIT 10;
-
ex 6 :
SELECT COUNT(*) as differentsLe as differents est un alias, il permet de renommer un attribut ou un résultat (ici le décompte total).
FROM naissances
WHERE sexe = ‘Garçon’ AND annee_naissance = 1938;
-
ex 7 :
SELECT SUM(nombre)
FROM naissances
WHERE sexe = ‘Garçon’ AND annee_naissance = 1938;
-
ex 8 :
SELECT sexe, SUM(nombre)
FROM naissances
GROUP BY sexe;
-
ex 9 :
SELECT sexe, prenom, annee_naissance, nombre
FROM naissances
ORDER BY nombre DESC
LIMIT 1;
-
ex 10 :
SELECT annee_naissance, SUM(nombre) as somme
FROM naissances
GROUP BY annee_naissance
ORDER BY somme DESC
LIMIT 1;
-
ex 11 :
SELECT prenom, SUM(nombre) as nb
FROM naissances
GROUP BY prenom
ORDER BY nb DESC
LIMIT 10;
-
ex 12 :
SELECT *
FROM naissances
WHERE sexe = ‘Garçon’ AND annee_naissance >= 1960 AND annee_naissance <= 1969;
Exercice 2
Voici une base données (artistes.sqlite) qui contient plusieurs tables.
Pour vous aider, vous pouvez dessiner sur papier le schéma relationnel.
Vous pouvez réaliser ces requêtes en mode console ou en mode graphique avec DBBrowser.
Voici le fichier à télécharger : artistes.sqlite
Écrivez et testez les commandes SQL permettant d’afficher :
-
la table complète des artistes (25 réponses) ;
-
le nom et l’origine des artistes (25 réponses) ;
-
le nom et l’époque des artistes italiens (4 réponses) ;
-
la liste des œuvres estimées à plus de 1000 dollars (15 réponses) ;
-
le nombre d’œuvres estimées à moins de 1000 dollars (la réponse est 15) ;
-
le prix moyen des œuvres d’art (la réponse est 1565.6667 dollars) ;
-
le nombre d’artistes dans chaque pays d’origine (9 réponses) ;
-
le nombre d’artistes qui ne sont pas du XXième siècle (17)
-
le nom des musées qui sont ouverts après 17 h (3 réponses)
-
le nom des sculptures qui sont estimées plus de 2000 dollars (4)
Solution de l’exercice 2
-
la table complète des artistes (25 réponses) ;
SELECT *
FROM Artiste ;
-
le nom et l’origine des artistes (25 réponses) ;
SELECT Nom,Origine
FROM Artiste ;
-
le nom et l’époque des artistes italiens (4 réponses) ;
SELECT Nom,Epoque
FROM Artiste
WHERE Origine = ‘Italie’ :
-
la liste des œuvres estimées à plus de 1000 dollars (15 réponses) ;
SELECT Titre,Estimation
FROM Œuvre
WHERE Estimation > 1000 ;
-
le nombre d’œuvres estimées à moins de 1000 dollars (la réponse est 15) ;
SELECT COUNT(*)
FROM Œuvre
WHERE Estimation<1000 ;
-
le prix moyen des œuvres d’art (la réponse est 1565.6667 dollars) ;
SELECT AVG(Estimation)
FROM Œuvre ;
-
le nombre d’artistes dans chaque pays d’origine (9 réponses) ;
SELECT Origine, COUNT(*)
FROM Artiste
GROUP BY Origine ;
-
le nombre d’artistes qui ne sont pas du XXième siècle (17)
SELECT COUNT(*)
FROM Artiste
WHERE Epoque <>20 ;
-
le nom des musées qui sont ouverts après 17 h (3 réponses)
SELECT Nom
FROM Musee
WHERE Fermeture > 17 ;
-
le nom des sculptures qui sont estimées plus de 2000 dollars (4)
SELECT titre
FROM Œuvre
WHERE Genre = ‘sculpture’ AND Estimation > 2000 ;