Prérequis : bases de données relationnelles
À l’issue de ce chapitre, vous saurez :
SELECT ... FROM pour afficher des colonnes d’une table ;WHERE et les opérateurs de comparaison ;ORDER BY ;DISTINCT ;COUNT, SUM, AVG, MIN et MAX.SQL (Structured Query Language, langage structuré de requêtes) est le langage standardisé pour interagir avec les bases de données relationnelles. Il a été créé chez IBM dans les années 1970 et est aujourd’hui utilisé par tous les SGBD majeurs (SQLite, PostgreSQL, MySQL, Oracle, etc.).
SQL se décompose en deux grandes parties :
CREATE TABLE, ALTER TABLE, DROP TABLE (voir le cours Modification des données et définition des tables
) ;SELECT, INSERT, UPDATE, DELETE.Ce chapitre se concentre sur les requêtes de sélection (SELECT), qui permettent de consulter les données sans les modifier.
Pour illustrer les requêtes, on utilisera la table suivante :
Produits :
| id | nom | categorie | prix | stock |
|---|---|---|---|---|
| 1 | Cahier A4 | Papeterie | 2.50 | 150 |
| 2 | Stylo bleu | Papeterie | 1.20 | 300 |
| 3 | Clé USB 32 Go | Informatique | 8.90 | 45 |
| 4 | Cartouche encre | Informatique | 25.00 | 20 |
| 5 | Classeur | Papeterie | 3.80 | 80 |
| 6 | Souris sans fil | Informatique | 15.50 | 60 |
| 7 | Colle | Papeterie | 1.50 | 200 |
| 8 | Casque audio | Informatique | 35.00 | 15 |
La requête la plus simple affiche toutes les colonnes de toutes les lignes d’une table :
SELECT *
FROM Produits;
Le symbole * signifie « tous les attributs ». Pour n’afficher que certaines colonnes, on les nomme explicitement :
SELECT nom, prix
FROM Produits;
Cette requête affiche uniquement le nom et le prix de chaque produit.
La clause WHERE permet de ne garder que les lignes qui vérifient une condition.
Afficher les produits de la catégorie « Informatique » :
SELECT nom, prix
FROM Produits
WHERE categorie = 'Informatique';
Résultat : Clé USB 32 Go (8.90), Cartouche encre (25.00), Souris sans fil (15.50), Casque audio (35.00).
| Opérateur | Signification |
|---|---|
= |
égal |
<> ou != |
différent |
<, > |
inférieur, supérieur strict |
<=, >= |
inférieur ou égal, supérieur ou égal |
BETWEEN a AND b |
compris entre a et b (inclus) |
LIKE |
comparaison avec motif (% = n’importe quelle suite de caractères) |
SELECT nom, prix
FROM Produits
WHERE categorie = 'Informatique' AND prix < 20;
Résultat : Clé USB 32 Go (8.90), Souris sans fil (15.50).
SELECT nom
FROM Produits
WHERE categorie = 'Papeterie' OR prix > 30;
Résultat : Cahier A4, Stylo bleu, Classeur, Colle, Casque audio.
La clause ORDER BY trie les résultats selon un ou plusieurs attributs.
Afficher les produits de moins de cinq euros, triés par prix croissant :
SELECT nom, prix
FROM Produits
WHERE prix < 5
ORDER BY prix;
Résultat : Stylo bleu (1.20), Colle (1.50), Cahier A4 (2.50), Classeur (3.80).
Par défaut, le tri est croissant (ASC). Pour trier par ordre décroissant, on ajoute DESC :
SELECT nom, prix
FROM Produits
ORDER BY prix DESC;
Le mot-clé DISTINCT élimine les lignes identiques dans le résultat.
Afficher les différentes catégories présentes dans la table :
SELECT DISTINCT categorie
FROM Produits;
Résultat : Papeterie, Informatique. Sans DISTINCT, la catégorie « Papeterie » apparaîtrait quatre fois.
Les fonctions d’agrégation calculent une valeur à partir d’un ensemble de lignes.
| Fonction | Rôle |
|---|---|
COUNT(*) |
Nombre de lignes |
SUM(attribut) |
Somme des valeurs |
AVG(attribut) |
Moyenne des valeurs |
MIN(attribut) |
Valeur minimale |
MAX(attribut) |
Valeur maximale |
Combien de produits ont un stock inférieur à 50 ?
SELECT COUNT(*)
FROM Produits
WHERE stock < 50;
Résultat : 3 (Clé USB 32 Go, Cartouche encre, Casque audio).
Quel est le prix moyen de tous les produits ?
SELECT AVG(prix)
FROM Produits;
Résultat : $(2{,}50 + 1{,}20 + 8{,}90 + 25{,}00 + 3{,}80 + 15{,}50 + 1{,}50 + 35{,}00) / 8 = 11{,}675$.
Quel est le produit le plus cher ?
SELECT nom, prix
FROM Produits
WHERE prix = (SELECT MAX(prix) FROM Produits);
Résultat : Casque audio (35.00). On utilise ici une sous-requête (notion hors programme, mais commode) : (SELECT MAX(prix) FROM Produits) calcule d’abord le prix maximal, puis la requête principale filtre le produit correspondant.
Complément hors programme, utilisé dans les TP. La clause GROUP BY regroupe les lignes qui ont la même valeur pour un attribut ; la fonction d’agrégation est alors calculée pour chaque groupe. Le mot-clé AS donne un nom à une colonne du résultat.
Combien de produits compte chaque catégorie ?
SELECT categorie, COUNT(*) AS nb_produits
FROM Produits
GROUP BY categorie;
| categorie | nb_produits |
|---|---|
| Informatique | 4 |
| Papeterie | 4 |
On peut trier les groupes avec ORDER BY, puis ne garder que les premières lignes du résultat avec LIMIT :
SELECT categorie, SUM(stock) AS stock_total
FROM Produits
GROUP BY categorie
ORDER BY stock_total DESC
LIMIT 1;
Résultat : Papeterie (730), la catégorie qui a le plus d’articles en stock.
SELECT * et SELECT nom, prix ?
SELECT * affiche toutes les colonnes de la table. SELECT nom, prix n'affiche que les colonnes nom et prix. En pratique, il est préférable de nommer les colonnes pour ne récupérer que les données nécessaires.SELECT nom FROM Produits WHERE prix > 10 ORDER BY nom; affiche quels résultats ?
COUNT(*) et SUM(prix) ?
COUNT(*) compte le nombre de lignes (ici le nombre de produits). SUM(prix) calcule la somme des valeurs de l'attribut prix (ici le total des prix de tous les produits).SELECT ... FROM affiche des colonnes d’une table ; * désigne toutes les colonnes.WHERE filtre les lignes selon une condition (opérateurs =, <, >, BETWEEN, LIKE, combinés avec AND, OR, NOT).ORDER BY trie les résultats (ASC par défaut, DESC pour l’ordre décroissant).DISTINCT élimine les doublons dans le résultat.COUNT, SUM, AVG, MIN, MAX) calculent des valeurs synthétiques sur un ensemble de lignes.SELECT → FROM → WHERE → ORDER BY.