Prérequis : le modèle relationnel , contraintes d’intégrité
À l’issue de ce chapitre, vous saurez :
- écrire une requête
SELECT ... FROMpour afficher des colonnes d’une table ; - filtrer les résultats avec
WHEREet les opérateurs de comparaison ; - trier les résultats avec
ORDER BY; - éliminer les doublons avec
DISTINCT; - utiliser les fonctions d’agrégation
COUNT,SUM,AVG,MINetMAX.
Présentation du SQL
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 :
- le LDD (langage de définition des données) :
CREATE TABLE,ALTER TABLE,DROP TABLE(voir le chapitre suivant ) ; - le LMD (langage de manipulation des données) :
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.
Tables d’exemple
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 |
SELECT et FROM
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.
WHERE : filtrer les résultats
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érateurs de comparaison
| 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) |
Combiner des conditions : AND, OR, NOT
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.
ORDER BY : trier les résultats
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;
DISTINCT : éliminer les doublons
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.
Fonctions d’agrégation
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.
Remarque. Les clauses
GROUP BYetHAVINGpermettent de regrouper les lignes et de filtrer les groupes. Elles sont un complément au programme de terminale NSI, utilisé dans les TP.
Vérifiez votre compréhension
- Quelle est la différence entre
SELECT *etSELECT nom, prix?Réponse
SELECT *affiche toutes les colonnes de la table.SELECT nom, prixn'affiche que les colonnesnometprix. En pratique, il est préférable de nommer les colonnes pour ne récupérer que les données nécessaires. - La requête
SELECT nom FROM Produits WHERE prix > 10 ORDER BY nom;affiche quels résultats ?Réponse
Elle affiche les noms des produits dont le prix est supérieur à 10, triés par ordre alphabétique : Cartouche encre, Casque audio, Souris sans fil. - Quelle est la différence entre
COUNT(*)etSUM(prix)?Réponse
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 ... FROMaffiche des colonnes d’une table ;*désigne toutes les colonnes.WHEREfiltre les lignes selon une condition (opérateurs=,<,>,BETWEEN,LIKE, combinés avecAND,OR,NOT).ORDER BYtrie les résultats (ASCpar défaut,DESCpour l’ordre décroissant).DISTINCTélimine les doublons dans le résultat.- Les fonctions d’agrégation (
COUNT,SUM,AVG,MIN,MAX) calculent des valeurs synthétiques sur un ensemble de lignes. - L’ordre des clauses dans une requête est toujours :
SELECT→FROM→WHERE→ORDER BY.