Requêtes de sélection SQL

Objectifs et prérequis

Prérequis : le modèle relationnel , contraintes d’intégrité

À l’issue de ce chapitre, vous saurez :

  • écrire une requête SELECT ... FROM pour afficher des colonnes d’une table ;
  • filtrer les résultats avec WHERE et 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, MIN et MAX.

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 :

idnomcategorieprixstock
1Cahier A4Papeterie2.50150
2Stylo bleuPapeterie1.20300
3Clé USB 32 GoInformatique8.9045
4Cartouche encreInformatique25.0020
5ClasseurPapeterie3.8080
6Souris sans filInformatique15.5060
7CollePapeterie1.50200
8Casque audioInformatique35.0015

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érateurSignification
=égal
<> ou !=différent
<, >inférieur, supérieur strict
<=, >=inférieur ou égal, supérieur ou égal
BETWEEN a AND bcompris entre a et b (inclus)
LIKEcomparaison 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.

FonctionRô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 BY et HAVING permettent 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
  1. Quelle est la différence entre SELECT * et SELECT nom, prix ?
    RéponseSELECT * 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.
  2. La requête SELECT nom FROM Produits WHERE prix > 10 ORDER BY nom; affiche quels résultats ?
    RéponseElle 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.
  3. Quelle est la différence entre COUNT(*) et SUM(prix) ?
    RéponseCOUNT(*) 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).
L'essentiel à retenir
  • 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.
  • 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 : SELECTFROMWHEREORDER BY.