Vous êtes sur la page 1sur 8

Informatique : TP 10 1

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.

2) Extraire les noms et prénoms des employés.

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 :

SELECT Id, (Maths + Physique + Informatique) / 3 FROM Notes


• On peut changer le nom d’un nouveau champ avec la commande AS.

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.

MP - Lycée Ferdinand Foch, Rodez 2023 - 2024


Informatique : TP 10 3

2.4 La commande WHERE (sélection)


L’instruction WHERE permet de sélectionner seulement les lignes ou les valeurs satisfont une condition.
Exemple :
SELECT Id FROM Notes WHERE Maths >10
L’expression booléenne suivant le mot WHERE est formée :
• de noms de colonnes ;
• d’opérateurs mathématiques +, -, *, / ;
• d’opérateurs de comparaison <, <=, >, >=, =, <> (le dernier opérateur signifie “non égal”) ;
• d’opérateurs logiques NOT, AND, OR.
Exemple :

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.

3 Opérations sur plusieurs tables


3.1 Opérations ensemblistes
Pour extraire des attributs de plusieurs tables, on peut utiliser des constructions ensemblistes permettant de
les combiner par une union (UNION), une différence (EXCEPT) ou une intersection (INTERSECT).

Exemple : Pour obtenir tous les noms d’élèves et de lycée :


SELECT nom FROM eleve UNION SELECT nom FROM lycee

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 :

SELECT eleve.nom, lycee.nom FROM eleve, lycee

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.

4) Afficher toutes les chansons dont aucun album ne porte le nom.

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.

MP - Lycée Ferdinand Foch, Rodez 2023 - 2024


Informatique : TP 10 4

SELECT eleve.nom, lycee.nom FROM eleve JOIN lycee ON eleve.code-lycee = lycee.code


Remarque : Dans la requête précédente, l’attribut nom apparaı̂t dans la table élève et dans la table lycée. Il est
donc nécessaire de spécifier de quel table nous voulons l’attribut table. Cependant, les attributs code-lycée et
code n’apparaissent que dans une seule table donc les préfixes élève et lycée ne sont pas nécessaires.

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.

Il est possible de combiner les instructions JOIN et WHERE.


Exemple : Obtenir les noms des élèves qui sont dans des lycées qui ont au moins 1500 élèves, avec le nom du
lycée correspondant
SELECT eleve.nom, lycee.nom FROM eleve JOIN lycee ON eleve.code-lycee = lycee.code
WHERE nb-eleve >= 1500
Il est aussi possible de joindre une table à elle-même en utilisant des alias. On parle d’auto-jointure. On
réalisera une auto-jointure lorsqu’on aura besoin de deux instance d’une même colonne.
Enfin, il est possible de joindre plus de deux tables ensemble, en écrivant :
SELECT name FROM table1 JOIN table2 ON item1 = item2 JOIN table3 ON it2 = it3

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.

Exemple : Donner le plus grand nombre d’élèves dans un lycée :


SELECT MAX(nb-eleves) FROM lycee

4.2 Groupement et Filtrage


Les fonctions d’agrégation peuvent être utilisées sur des groupes de données. On regroupe des enregistre-
ments (lignes) qui ont des valeurs identiques pour certains attributs.

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.

MP - Lycée Ferdinand Foch, Rodez 2023 - 2024


Informatique : TP 10 5

SELECT COUNT(Id), Maths FROM Notes GROUP BY Maths


Il est aussi possible de grouper selon plusieurs attributs.
Exemple : Pour chaque paire de notes aux contrôles de maths et de physique, donner le nombre d’élèves qui
ont obtenu ces notes.
SELECT COUNT(Id), Maths, Physique FROM Notes GROUP BY Maths, Physique
La clause WHERE s’applique avant un groupement.
Exemple :
SELECT dat, Exercice, AVG(Points) FROM Notes WHERE dat >= "2022-01-01"
GROUP BY dat, Exercice ORDER BY dat
On dispose d’une clause HAVING, qui est similaire à la clause WHERE, pour filtrer les résultats. La clause
WHERE filtre avant une agrégation, la clause HAVING filtre après les groupements. Elle permet de préciser
des conditions qui doivent être vérifiées dans chaque groupe.
Exemple :
SELECT dat, Exercice, AVG(Points) FROM Notes WHERE dat >= "2022-01-01"
GROUP BY dat, Exercice HAVING AVG (Points) > 10 ORDER BY dat
Exercice 7
Ouvrir le fichier mondial.sqlite avec db browser.
1) En utilisant la table City, afficher un tableau qui contient les pays avec la population moyenne de ses
villes.

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.

4.3 Requêtes imbriquées


Une requête imbriquée est une requête à l’intérieur d’une requête. En SQL, vous pouvez imbriquer autant de
requêtes que vous voulez. Il faut se rappeler que le résultat renvoyé par une requête est toujours une table.
Lorsque la table renvoyée a plusieurs colonnes et plusieurs lignes, on peut l’imbriquer dans un clause FROM
avec des parenthèses de part et d’autre.
Lorsque la table renvoyée n’a qu’une ligne ou qu’une colonne, on peut l’imbriquer dans une condition WHERE.

Exemple : Supposons qu’on dispose des tables ci-contre.


Logement
On souhaite connaı̂tre la date de fin de séjour le plus récent Sejour
effectué en Chine. id
id
pays
SELECT MAX(fin) id logement
ville
FROM (SELECT fin FROM Sejour debut
nom
JOIN Logement ON id_logement = id fin
prix
WHERE pays = "Chine")
Exemple : Toujours avec les mêmes tables, on souhaite connaı̂tre les noms et les villes des logements qui ont
le prix le plus bas en France. Si on tente d’utiliser la fonction d’agrégation MIN comme ci-après, on verra
s’afficher un message d’erreur :
SELECT nom, ville FROM Logement WHERE pays = "France" AND prix = MIN(prix)
On doit imbriquer des requêtes :
SELECT nom, ville FROM Logement
WHERE prix = (SELECT MIN(prix) FROM Logement WHERE pays = "France")

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

Ouvrir le fichier 2015.sqlite avec db browser.


4) En utilisant la table congressional districts, afficher une table contenant la population du plus grand
district congressionel de chaque état, avec le numéro de l’état correspondant sur une deuxième colonne.

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

Ecrire une requète en langage SQL qui récupère :


1) Le prénom et le nom des clients (customers) qui sont des états-unis (USA).

2) Les noms d’album d’Iron Maiden.

3) Le coût total de tous les achats.

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.

5) Le nom des titres qui sont dans au moins 4 playlists.

6) Le nom des titres qui n’apparaissent dans aucune playlist.

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

MP - Lycée Ferdinand Foch, Rodez 2023 - 2024


Informatique : TP 10 7

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.

5) Afficher les données de la commune la plus peuplée du département.

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 ?

9) Donner le nombre d’habitants des Alpes-Maritimes. On affichera le résultat en nombre d’habitants et


pas en milliers.

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.

MP - Lycée Ferdinand Foch, Rodez 2023 - 2024


Informatique : TP 10 8

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.

22) Quel est le chef-lieu du département le moins peuplé de France ?

MP - Lycée Ferdinand Foch, Rodez 2023 - 2024

Vous aimerez peut-être aussi