Exercices SQL corrigés : SELECT, alias et DISTINCT
Mis à jour le
SELECT choisit les colonnes à afficher ; AS renomme une colonne, DISTINCT retire les doublons. Ces 4 exercices du jeu sont de niveau 1, et 5 exercices du cours suivent ; ils utilisent la syntaxe de SQLite, le moteur SQL de SpeedQL.
Conseil : Liste les colonnes utiles plutôt que SELECT * : le résultat est plus lisible et plus rapide.
Relire la fiche « SELECT, alias, DISTINCT » de l’aide-mémoire
Exercice 1
Affiche toutes les colonnes et toutes les lignes de la table employees.
| id | name | department | salary |
|---|---|---|---|
| 1 | Alice | Finance | 32000 |
| 2 | Bob | IT | 41000 |
| 3 | Claire | Finance | 38000 |
| 4 | David | HR | 29000 |
Voir l’indice
Notions à utiliser : SELECT, alias, DISTINCT.
Structure de la requête :
SELECT *
FROM …Voir la correction
SELECT *
FROM employees;Résultat attendu (4 lignes) :
| id | name | department | salary |
|---|---|---|---|
| 1 | Alice | Finance | 32000 |
| 2 | Bob | IT | 41000 |
| 3 | Claire | Finance | 38000 |
| 4 | David | HR | 29000 |
Exercice 2
Affiche uniquement le nom et le salaire de tous les employés.
| id | name | department | salary |
|---|---|---|---|
| 1 | Alice | Finance | 32000 |
| 2 | Bob | IT | 41000 |
| 3 | Claire | Finance | 38000 |
| 4 | David | HR | 29000 |
Voir l’indice
Notions à utiliser : SELECT, alias, DISTINCT.
Structure de la requête :
SELECT …, …
FROM …Voir la correction
SELECT name, salary
FROM employees;Résultat attendu (4 lignes) :
| name | salary |
|---|---|
| Alice | 32000 |
| Bob | 41000 |
| Claire | 38000 |
| David | 29000 |
Exercice 3
Affiche le nom des employés dans une colonne nommée employee, et leur salaire dans une colonne nommée annual_salary.
| id | name | department | salary |
|---|---|---|---|
| 1 | Alice | Finance | 32000 |
| 2 | Bob | IT | 41000 |
| 3 | Claire | Finance | 38000 |
| 4 | David | HR | 29000 |
Voir l’indice
Notions à utiliser : SELECT, alias, DISTINCT.
Structure de la requête :
SELECT … AS …, … AS …
FROM …Voir la correction
SELECT name AS employee, salary AS annual_salary
FROM employees;Résultat attendu (4 lignes) :
| employee | annual_salary |
|---|---|
| Alice | 32000 |
| Bob | 41000 |
| Claire | 38000 |
| David | 29000 |
Exercice 4
Affiche la liste des catégories de produits, sans doublon.
| id | name | category | price | stock |
|---|---|---|---|---|
| 1 | Keyboard | Office | 25 | 40 |
| 2 | Mouse | Office | 15 | 0 |
| 3 | Screen | Display | 180 | 12 |
| 4 | Headset | Audio | 60 | 8 |
| 5 | Webcam | Office | 45 | 0 |
| 6 | Speaker | Audio | 35 | 25 |
Voir l’indice
Notions à utiliser : SELECT, alias, DISTINCT.
Structure de la requête :
SELECT DISTINCT …
FROM …Voir la correction
SELECT DISTINCT category
FROM products;Résultat attendu (3 lignes) :
| category |
|---|
| Office |
| Display |
| Audio |
Plus d’exercices : niveau 1 du cours SQL, « Lire une table avec SELECT »
Ces 5 exercices viennent du niveau 1 du cours, sur d’autres tables. Chacun a des indices écrits et sa correction, repliés par défaut.
Exercice 5
Affiche toutes les colonnes de la table movies.
| id | title | genre | year | duration | rating | director_id |
|---|---|---|---|---|---|---|
| 1 | Night Train | Thriller | 2015 | 118 | 7.8 | 1 |
| 2 | Blue Harbor | Drama | 2018 | 102 | 7.1 | 2 |
| 3 | Paper Moon City | Comedy | 2012 | 95 | 6.4 | 5 |
| 4 | Silent Peak | Drama | 2020 | 131 | 8.2 | 3 |
| 5 | Last Signal | Sci-Fi | 2019 | 142 | 7.5 | 1 |
| 6 | Summer Keys | Comedy | 2016 | 88 | 5.9 | 4 |
| 7 | Iron Garden | Sci-Fi | 2021 | 125 | 8 | 3 |
| 8 | Dust and Gold | Western | 2014 | 110 | 6.8 | 2 |
| 9 | The Quiet Hour | Drama | 2022 | 97 | 7.4 | 5 |
| 10 | Deep Current | Thriller | 2017 | 105 | 6.9 | NULL |
Voir les indices
Indice : L'étoile * remplace la liste de toutes les colonnes.
Voir la correction
SELECT *
FROM movies;Résultat attendu (10 lignes) :
| id | title | genre | year | duration | rating | director_id |
|---|---|---|---|---|---|---|
| 1 | Night Train | Thriller | 2015 | 118 | 7.8 | 1 |
| 2 | Blue Harbor | Drama | 2018 | 102 | 7.1 | 2 |
| 3 | Paper Moon City | Comedy | 2012 | 95 | 6.4 | 5 |
| 4 | Silent Peak | Drama | 2020 | 131 | 8.2 | 3 |
| 5 | Last Signal | Sci-Fi | 2019 | 142 | 7.5 | 1 |
| 6 | Summer Keys | Comedy | 2016 | 88 | 5.9 | 4 |
| 7 | Iron Garden | Sci-Fi | 2021 | 125 | 8 | 3 |
| 8 | Dust and Gold | Western | 2014 | 110 | 6.8 | 2 |
| 9 | The Quiet Hour | Drama | 2022 | 97 | 7.4 | 5 |
| 10 | Deep Current | Thriller | 2017 | 105 | 6.9 | NULL |
SELECT * est le moyen le plus rapide de découvrir le contenu d'une table.
Exercice 6
Affiche le titre et le genre de chaque film.
| id | title | genre | year | duration | rating | director_id |
|---|---|---|---|---|---|---|
| 1 | Night Train | Thriller | 2015 | 118 | 7.8 | 1 |
| 2 | Blue Harbor | Drama | 2018 | 102 | 7.1 | 2 |
| 3 | Paper Moon City | Comedy | 2012 | 95 | 6.4 | 5 |
| 4 | Silent Peak | Drama | 2020 | 131 | 8.2 | 3 |
| 5 | Last Signal | Sci-Fi | 2019 | 142 | 7.5 | 1 |
| 6 | Summer Keys | Comedy | 2016 | 88 | 5.9 | 4 |
| 7 | Iron Garden | Sci-Fi | 2021 | 125 | 8 | 3 |
| 8 | Dust and Gold | Western | 2014 | 110 | 6.8 | 2 |
| 9 | The Quiet Hour | Drama | 2022 | 97 | 7.4 | 5 |
| 10 | Deep Current | Thriller | 2017 | 105 | 6.9 | NULL |
Voir les indices
Indice 1 · piste : Liste les colonnes voulues juste après SELECT.
Indice 2 · méthode : Sépare les deux colonnes par une virgule : SELECT title, genre …
Voir la correction
SELECT title, genre
FROM movies;Résultat attendu (10 lignes) :
| title | genre |
|---|---|
| Night Train | Thriller |
| Blue Harbor | Drama |
| Paper Moon City | Comedy |
| Silent Peak | Drama |
| Last Signal | Sci-Fi |
| Summer Keys | Comedy |
| Iron Garden | Sci-Fi |
| Dust and Gold | Western |
| The Quiet Hour | Drama |
| Deep Current | Thriller |
Les colonnes apparaissent dans l'ordre où tu les écris.
Exercice 7
Affiche le titre de chaque film dans une colonne nommée film, et sa durée dans une colonne nommée minutes.
| id | title | genre | year | duration | rating | director_id |
|---|---|---|---|---|---|---|
| 1 | Night Train | Thriller | 2015 | 118 | 7.8 | 1 |
| 2 | Blue Harbor | Drama | 2018 | 102 | 7.1 | 2 |
| 3 | Paper Moon City | Comedy | 2012 | 95 | 6.4 | 5 |
| 4 | Silent Peak | Drama | 2020 | 131 | 8.2 | 3 |
| 5 | Last Signal | Sci-Fi | 2019 | 142 | 7.5 | 1 |
| 6 | Summer Keys | Comedy | 2016 | 88 | 5.9 | 4 |
| 7 | Iron Garden | Sci-Fi | 2021 | 125 | 8 | 3 |
| 8 | Dust and Gold | Western | 2014 | 110 | 6.8 | 2 |
| 9 | The Quiet Hour | Drama | 2022 | 97 | 7.4 | 5 |
| 10 | Deep Current | Thriller | 2017 | 105 | 6.9 | NULL |
Voir les indices
Indice 1 · piste : Un alias se place juste après la colonne qu'il renomme.
Indice 2 · méthode : Ajoute AS film après title, et AS minutes après duration.
Voir la correction
SELECT title AS film, duration AS minutes
FROM movies;Résultat attendu (10 lignes) :
| film | minutes |
|---|---|
| Night Train | 118 |
| Blue Harbor | 102 |
| Paper Moon City | 95 |
| Silent Peak | 131 |
| Last Signal | 142 |
| Summer Keys | 88 |
| Iron Garden | 125 |
| Dust and Gold | 110 |
| The Quiet Hour | 97 |
| Deep Current | 105 |
Un alias ne change que le nom affiché : la table, elle, n'est pas modifiée.
Exercice 8
Affiche le nom et le prix de chaque plat, ainsi que le prix pour deux personnes dans une colonne nommée price_for_two.
| id | name | category | price | calories | vegetarian | chef_id |
|---|---|---|---|---|---|---|
| 1 | Ratatouille | main | 14.5 | 320 | yes | 1 |
| 2 | Beef burger | main | 16 | 780 | no | 2 |
| 3 | Caesar salad | starter | 9.5 | 410 | no | 1 |
| 4 | Tomato soup | starter | 7 | 180 | yes | 3 |
| 5 | Chocolate cake | dessert | 6.5 | 520 | yes | 2 |
| 6 | Lemon tart | dessert | 6 | 430 | yes | 3 |
| 7 | Grilled salmon | main | 19 | 560 | no | 1 |
| 8 | Onion soup | starter | 8 | 290 | yes | 2 |
Voir les indices
Indice 1 · piste : Un calcul peut s'écrire directement dans la liste du SELECT, comme une colonne.
Indice 2 · méthode : Une colonne calculée : price * 2 AS price_for_two.
Voir la correction
SELECT name, price, price * 2 AS price_for_two
FROM dishes;Résultat attendu (8 lignes) :
| name | price | price_for_two |
|---|---|---|
| Ratatouille | 14.5 | 29 |
| Beef burger | 16 | 32 |
| Caesar salad | 9.5 | 19 |
| Tomato soup | 7 | 14 |
| Chocolate cake | 6.5 | 13 |
| Lemon tart | 6 | 12 |
| Grilled salmon | 19 | 38 |
| Onion soup | 8 | 16 |
Le calcul est refait pour chaque ligne de la table.
Exercice 9
Pour chaque vol, affiche la compagnie, la recette du vol (revenue : prix × places vendues) et le manque à gagner dû aux places restées vides (lost_revenue : prix × places vides).
| id | airline | origin | dest | departs | duration_min | price | seats_sold | capacity |
|---|---|---|---|---|---|---|---|---|
| 1 | SkyJet | CDG | MAD | 2025-06-01 08:10 | 125 | 89 | 150 | 180 |
| 2 | AirNova | CDG | LIS | 2025-06-01 11:40 | 155 | 120 | 160 | 170 |
| 3 | BlueWing | LYS | FCO | 2025-06-02 07:30 | 95 | 75 | 110 | 150 |
| 4 | SkyJet | MAD | CDG | 2025-06-02 18:20 | 120 | 95 | 170 | 180 |
| 5 | AirNova | BER | CDG | 2025-06-03 09:05 | 110 | 105 | 140 | 160 |
| 6 | BlueWing | NCE | BER | 2025-06-03 13:50 | 130 | 140 | 90 | 150 |
| 7 | SkyJet | CDG | FCO | 2025-06-04 06:45 | 135 | 99 | 175 | 180 |
| 8 | AirNova | LIS | MAD | 2025-06-04 16:15 | 75 | 65 | 60 | 120 |
| 9 | BlueWing | FCO | LYS | 2025-06-05 20:30 | 100 | 82 | 130 | 150 |
| 10 | SkyJet | CDG | BER | 2025-06-05 10:00 | 105 | 110 | 120 | 180 |
| 11 | AirNova | MAD | LIS | 2025-06-06 12:25 | 80 | 70 | 95 | 120 |
| 12 | BlueWing | LYS | MAD | 2025-06-06 15:40 | 115 | 79 | 100 | 150 |
Voir les indices
Indice 1 · piste : Calcule d'abord le nombre de places vides, puis multiplie-le par le prix. Attention à l'ordre des opérations.
Indice 2 · méthode : Les places vides valent capacity - seats_sold : mets ce calcul entre parenthèses avant de le multiplier par price.
Voir la correction
SELECT airline,
price * seats_sold AS revenue,
price * (capacity - seats_sold) AS lost_revenue
FROM flights;Résultat attendu (12 lignes) :
| airline | revenue | lost_revenue |
|---|---|---|
| SkyJet | 13350 | 2670 |
| AirNova | 19200 | 1200 |
| BlueWing | 8250 | 3000 |
| SkyJet | 16150 | 950 |
| AirNova | 14700 | 2100 |
| BlueWing | 12600 | 8400 |
| SkyJet | 17325 | 495 |
| AirNova | 3900 | 3900 |
| BlueWing | 10660 | 1640 |
| SkyJet | 13200 | 6600 |
| AirNova | 6650 | 1750 |
| BlueWing | 7900 | 3950 |
Sans parenthèses, price * capacity - seats_sold calcule (price × capacity) − seats_sold : la multiplication passe avant la soustraction.
S’entraîner avec correction automatique
Dans SpeedQL, tu écris ta requête et elle est vérifiée tout de suite, sur ces tables puis sur un jeu de données caché.