Académique Documents
Professionnel Documents
Culture Documents
Travaux pratiques 10 :
SQL
1 Introduction
Le SQL, pour Structured Query Language, (langage de requêtes structurées), est un langage de dialogue avec
une base de données relationnelle. C’est un langage déclaratif qui décrit ce que l’on souhaite obtenir à l’aide
d’une requête : une demande adressée à un SGBD. La manière de parvenir au résultat n’est pas précisée. C’est
le SGBD qui détermine la meilleure façon, en terme de complexité algorithmique, d’obtenir le résultat.
Concernant la manipulation des données, une instruction en SQL traduit une interrogation, une mise à jour,
une insertion, une suppression, une création, etc. Remarque : les implémentations peuvent différer légèrement
de la norme suivant le SGBD. La suite du TP est concentrée sur la demande d’informations : comment extraire
une partie des informations contenues dans la base de données selon des critères précis.
Les instructions en SQL ont une syntaxe assez simple et précise. Le langage n’est pas sensible à la casse. Un
mot comme SELECT peut être écrit sELEcT sans provoquer d’erreur. De même si le nom d’une table est table1,
il peut être écrit table1 sans problème. Seule l’écriture des valeurs doit respecter des règles (liées aux types ou
domaines) : un flottant s’écrit comme en Python (et dans tous les langages d’origine anglophone) avec un point
pour séparateur (3.14 par exemple), une chaı̂ne de caractères s’écrit entre des guillemets ou des apostrophes et
par exemple ’ma chaı̂ne’ est différente de ’Ma Chaı̂ne’.
Cependant, pour la lisibilité, l’habitude est d’écrire tous les mots du langage en lettres capitales et les noms
de tables ou de colonnes en minuscules. Les espaces, les retours à la ligne et l’indentation n’ont aucune valeur
syntaxique mais participent à la clarté de la requête.
De manière générale, on termine une instruction (ou requête) par un point-virgule qui sert en fait de séparateur
entre deux instructions. Ce n’est pas obligatoire si on n’écrit qu’une seule instruction isolée.
2 Projection
2.1 La commande SELECT
Pour extraire le contenu d’une ou plusieurs colonnes appartenant à une table, on utilise la commande SELECT.
• Exemple :
SELECT nom FROM eleve
• Il est possible obtenir plusieurs colonnes.
Exemple :
SELECT nom, prenom FROM eleve
• Il est possible d’obtenir toute une table.
Exemple :
SELECT * FROM eleve
• Le mot DISTINCT permet de supprimer les doublons.
Exemple :
SELECT DISTINCT prenom FROM eleve
Exercice 1
Ouvrir la base de données chinook avec db browser.
1) Extraire tous les titres de la table tracks.
3) La table genres comporte 25 lignes, l’identifiant prend les valeurs 1 à 25. Tous les genres sont-ils atteint
dans la table tracks ?
MP - Lycée Ferdinand Foch, Rodez 2023 - 2024
Informatique : TP 10 2
2.2 Opérations
Supposons qu’on dispose de la relation suivante : Notes (Id, Maths, Physique, Informatique). L’attribut
Id est la clé primaire. Les autres attributs sont de type flottant représentant des notes.
• On peut obtenir une colonne à partir d’une expression sur une colonne.
Exemple :
SELECT Maths * 3 FROM Notes
• On peut faire de même avec plusieurs colonnes.
Exemple : On souhaite avoir les identifiants des élèves avec leur moyenne :
Exemple :
SELECT Id, (Maths + Physique + Informatique) / 3 As Moyenne FROM Notes
Exercice 2
Ouvrir la base de données 2015.sqlite avec db browser. Extraire un champ nommé Pourcentage qui contient le
pourcentage de la population qui vit en dessous du seuil de pauvreté dans la tables states.
2.3 Tri
Pour trier les données, on utilise la commande ORDER BY.
• La commande ORDER BY dispose de deux instructions de tri : ASC pour un tri dans l’ordre croissant et
DESC pour un tri dans l’ordre décroissant. Par défaut, l’ordre est croissant.
Exemple : Obtenir les identifiants des élèves suivant l’ordre décroissant des notes de mathématiques :
SELECT Id FROM Notes ORDER BY Maths DESC
• Pour définir l’ordre, on peut choisir plusieurs champs. Avec plusieurs champs, les enregistrements sont
classés selon le premier champ. En cas d’égalité, ils sont classés selon le champ suivant et ainsi de suite.
Exemple :
SELECT Id FROM Notes ORDER BY Maths DESC, Physique DESC, Informatique DESC
• Les clauses LIMIT et OFFSET permettent de préciser combien de lignes sont renvoyées à partir de quelle
ligne. En général ces clauses s’utilisent après la clause ORDER BY.
Exemples : En prenant les 5 premières lignes puis les 5 premières lignes à partir de la neuvième ligne.
SELECT Id FROM Notes ORDER BY Maths DESC LIMIT 5;
SELECT Id FROM Notes ORDER BY Maths DESC LIMIT 5 OFFSET 8;
Exercice 3
Ouvrir la base de données 2015.sqlite avec db browser.
1) Afficher les états rangés par population décroissante.
2) Afficher les 10 premiers états avec le pourcentage de la population en dessous du seuil de pauvreté
(appelé Pourcentage) rangés selon ce même pourcentage par ordre décroissant.
SELECT Id FROM NOTE WHERE (Maths + Physique + Informatique) / 3 >= 10 AND Maths >=6
Exercice 4
Ouvrir la base de données 2015.sqlite avec db browser.
Afficher les districts congressionnels où le revenu médian par foyer est supérieur à 42000 et où la pourcentage
de la population en dessous du seuil de pauvreté est supérieur ou égal à 17.
Une autre opération ensembliste à connaı̂tre est le produit cartésien. Cela permet d’obtenir toutes les combi-
naisons possibles entre les lignes de deux tables.
Exemple : Pour obtenir toutes les combinaisons entre les élèves et les lycées :
Exercice 5
Ouvir le fichier mondial.sqlite avec db browser.
1) Afficher tous les noms de rivières et de lacs dans une seule colonne.
2) Afficher tous les noms de provinces qui ont des noms de rivières.
Ouvir le fichier chinook avec db browser.
3) Afficher toutes les chansons qui ont le même nom qu’un album.
5) Afficher une table qui contient les adresses et les mails des employés et des clients.
6) Afficher une table qui contient toutes les associations possibles entre les noms et mails des clients et les
noms des employés.
3.2 Jointure
L’instruction JOIN permet de joindre deux tables par l’intermédiaire par exemple d’une clé étrangère et d’une
clé primaire.
Exemple : Obtenir les noms des élèves avec le nom du lycée correspondant.
Remarque : L’opérateur de jointure est équivalent à un produit cartésien avec WHERE. Par exemple, la requête
précédente peut se remplacer par :
SELECT eleve.nom, lycee.nom FROM eleve, lycee WHERE eleve.code-lycee = lycee.code
Il est fortement conseillé d’éviter les produits cartésiens pour des raisons de mémoire et de temps d’exécution.
Exercice 6
Ouvrir le fichier mondial.sqlite avec db browser. Afficher une table dont la première colonne contient le nom
des villes et la deuxième contient le nom de l’état correspondant.
4 Agrégation
4.1 Les fonctions d’agrégation
• La fonction COUNT permet de compter des enregistrements.
Exemple : Compter le nombre de lycées qui ont plus de 1500 élèves (et renommer le résultat) :
SELECT COUNT(code-lycee) AS Nombre_grands_lycees FROM lycee WHERE nb-eleves >= 1500
• La fonction SUM sert à additionner des valeurs.
Exemple : Compter le nombre d’élèves dans les lycées qui comptabilisent au moins 1500 élèves :
SELECT SUM(nb-eleves) FROM lycee WHERE nb-eleves >= 1500
• La fonction AVG calcule la moyenne dans un champ numérique.
Exemple : Compter le nombre d’élèves moyen dans les lycées qui comptabilisent au moins 1500 élèves :
SELECT AVG(nb-eleves) FROM lycee WHERE nb-eleves >= 1500
• Les fonctions MIN et MAX calculent le minimum et le maximum d’un champ numérique.
La clause GROUP BY permet de préciser les attributs qui sont utilisés pour les groupements. On peut alors
appliquer une fonction d’agrégation sur chacun des groupes obtenus.
Exemple : Pour chaque note au contrôle de maths, donner le nombre d’élèves qui ont obtenu cette note.
2) En utilisant la table City, afficher un tableau qui contient les pays avec la population moyenne de ses
villes par ordre croissant uniquement pour les pays dont la population moyenne des villes est plus
grande que 150000.
Exercice 8
Ouvrir le fichier mondial.sqlite avec db browser. On utilisera les tables City et Country.
1) Afficher la population moyenne des pays.
2) Afficher une table qui contient, pour chaque pays dont la population est plus grande que la moyenne
des pays, le nom du pays et sa population.
3) Afficher la population moyenne des villes parmi celles dont le pays a plus que 10 000 000 habitants.
MP - Lycée Ferdinand Foch, Rodez 2023 - 2024
Informatique : TP 10 6
5) En utilisant la table congressional districts, afficher une table contenant la population du plus grand
district congressionel de chaque état, avec le nom de l’état correspondant sur une deuxième colonne.
5 Exercices d’entraı̂nement
Exercice 9
4) Les nom des titres (tracks) dont le prix est 0.99 qui ont été fait par l’artiste Aerosmith dans l’ordre
alphabétique.
7) Le prénom et le nom des clients qui ont fait un achat dont le prix est supérieur à la moyenne des achats.
8) Le prénom et le nom des clients ainsi que leur dépense totale, du client qui a le plus dépensé à celui qui
a le moins dépensé.
9) Le prénom et le nom des clients ainsi que leur nombre d’achats, classés par le nombre d’achats puis le
prix total (le tout par ordre décroissant).
Exercice 10
La base de données communes_francaises.sqlite contient deux tables. La table depts contient les attributs :
• id (un entier) la clé primaire de l’enregistrement ;
• code (une chaı̂ne de caractères) le code administratif du département. Attention : le code est une chaı̂ne
de caractère, on peut avoir l’impression qu’il coı̈ncide avec l’entier id. Ce n’est pas le cas, il n’y a pas de
département de code 20, par contre il y en a de codes '2A' et '2B', ce sont les département corses, ce qui
introduit un décalage. Par exemple, le var a pour code '83' mais pour id 84.
• nom (une chaı̂ne de caractères) le nom du département ;
• chef lieu (un entier) l’identifiant du chef-lieu du département.
La table communes contient les attributs :
• id (un entier) la clé primaire de l’enregistrement ;
• code (une chaı̂ne de caractères) le code administratif de la commune ;
• postal (une chaı̂ne de caractères) le code postale de la commune ;
• nom (une chaı̂ne de caractères) le nom de la commune ;
• superficie (un flottant) la superficie de la commune (en hectares) ;
• altitude (un entier) l’altitude de la commune, en mètres ;
• population (un flottant) la population de la commune, en millier d’habitants ;
• dep id (un entier) l’identifiant du département où se trouve la commune.
1) Afficher toutes les entrées de la table communes puis celles de depts (une requête pour chaque, l’une
après l’autre).
2) Afficher les entrées de la table communes qui concerne le département des Alpes-Maritimes, dont l’iden-
tifiant est 6.
3) Afficher toutes les entrées de la table communes qui concerne le département des Alpes-Maritimes et
dont le population est d’au moins 10 milliers d’habitants, classées par ordre alphabétiques du nom de
la commune.
4) Afficher toutes les entrées de la table communes qui concerne le département des Alpes-Maritimes et
dont la population est d’au moins 10 milliers d’habitants, classées par nombre d’habitants dans l’ordre
décroissant.
6) Donner la liste des communes des Alpes-Maritimes classées par superficie décroissante, de la 101ème à
la 120ème seulement.
7) Donner le nombre d’entrées de la table communes, de même que pour la table depts (une requête à
chaque fois).
8) Quelle est la moyenne du nombre d’habitants dans les communes du département des Alpes-Maritimes ?
10) Faire une requête donnant simultanément l’altitude maximale et l’altitude minimale des communes
françaises.
11) Quel est le nombre d’altitudes atteintes dans l’intervalle J1000, 2000K.
12) Donner pour chaque département le nombre d’habitant (c’est la somme du nombre d’habitants de
chaque commune). On se contentera d’interroger la table communes et on donnera simplement le dep_id
et le nombre total d’habitants.
13) Quelle est la liste des départements (on se contentera là aussi d’interroger la table communes et de donner
le dep_id) ayant au moins 500000 habitants ? Afficher le résultat par nombre d’habitants décroissants.
14) Donner la liste de dix communes les plus vastes de France, classées par ordre décroissant de taille, en
précisant pour chacune d’elles le nom du département où elles se situent.
15) Écrire une requête permettant d’obtenir le chef-lieu le moins peuplé de France et une autre pour le plus
peuplé de France. Réfléchissez à la jointure que vous allez faire pour cette question et faire une requête
qui ne produit qu’un résultat. Utiliser LIMIT.
16) Quelle est la superficie moyenne (en hectares) des communes corses ? Rappelons que la Corse est constituée
de deux départements de codes administratifs 2A et 2B.
17) En considérant que la superficie d’un département est égal à la somme des superficies des communes
qu’il abrite, donner la liste des départements par superficie décroissante.
18) Quel est le nom de la (ou les) commune(s) ayant l’altitude maximale ? On n’écrira qu’une seule requête.
19) Quel est le nombre de communes situées au dessus de l’altitude moyenne des communes françaises ?
On n’écrira qu’une seule requête.
20) Quelle est le nombre de communes situées à l’altitude moyenne des communes françaises, arrondie à
l’entier le plus proche.
21) En considérant que la superficie d’un département est égal à la somme des superficies des communes
qu’il abrite, calculer la superficie moyenne d’un département français.