Lire des lignes : SELECT, WHERE, ORDER BY, LIMIT

La plupart des requêtes de lecture utilisent SELECT, WHERE, ORDER BY et LIMIT. Cette leçon présente le rôle de chaque clause et leur combinaison.

Votre première requête

Une requête répond à une seule question : quelles lignes, et lesquelles de leurs colonnes ? La façon la plus courte de demander est SELECT * — toutes les colonnes — et FROM suivi d’une table.

1

-- Every column of every product. Run it with F9 or Ctrl/Cmd + Enter.
SELECT *
FROM products
LIMIT 20;
Ouvrir dans Planche

Résultat — 5 premières lignes sur 20

idcategory_idnamedescriptionskupricecoststock_quantityweight_kgattributesis_activecreated_atupdated_at
116Glass Orchard (Paperback ed.)Glass Orchard (Paperback ed.) — built to last.SKU-00001913.72443.951796.18{"color":"green","warranty_months":12,"material":"fabric"}12024-01-13 07:13:522024-01-13 07:13:52
217Luma The GeneLuma The Gene — built to last.SKU-00002332.64161.72835.893{"color":"silver","warranty_months":24,"material":"steel"}12022-06-16 08:45:202022-06-16 08:45:20
321Quill HelmetQuill Helmet — designed for daily use.SKU-00003196.26118.253998.261{"color":"silver","warranty_months":24}12022-08-26 20:06:032022-08-26 20:06:03
416Kite Glass Orchard 3Kite Glass Orchard 3 — built to last.SKU-000041719.68845.912435.263{"color":"silver","warranty_months":24}02022-07-19 11:34:272022-07-19 11:34:27
517The Gene (3rd ed.)The Gene (3rd ed.) — a dependable everyday choice.SKU-00005122.869.53571.898{"color":"red","warranty_months":36,"material":"aluminium"}12022-05-21 10:53:402022-05-21 10:53:40

Planche s’ouvre dans un onglet séparé, la base d’exemple déjà chargée et cette requête prête dans l’éditeur. Tous les exemples de la page réutilisent cet onglet, et rien ne s’exécute tant que vous n’appuyez pas sur F9.

* signifie « toutes les colonnes » et LIMIT 20 « au plus vingt lignes ». Pour vérifier la structure de products, inutile de charger ses milliers de lignes : elles devraient toutes être transférées et affichées.

Planche limite aussi les résultats dans les paramètres (Sécurité › Limite de lignes). Ajouter LIMIT à la requête vous permet néanmoins de décider explicitement de la quantité de données lue par la base.

Choisir les colonnes

SELECT * sert à explorer. Une fois que vous savez ce que vous cherchez, nommez les colonnes : le résultat est plus étroit, plus lisible, et la base déplace moins de données.

2

SELECT name, sku, price, stock_quantity
FROM products
LIMIT 20;
Ouvrir dans Planche

Résultat — 5 premières lignes sur 20

nameskupricestock_quantity
Glass Orchard (Paperback ed.)SKU-00001913.72179
Luma The GeneSKU-00002332.6483
Quill HelmetSKU-00003196.26399
Kite Glass Orchard 3SKU-000041719.68243
The Gene (3rd ed.)SKU-00005122.8357

L’ordre dans lequel vous les listez est l’ordre dans lequel elles reviennent — l’ordre des colonnes dans la table n’intervient pas ici. Pour renommer une colonne, on utilise AS, sur quoi nous reviendrons à la fin de cette leçon.

Filtrer les lignes avec WHERE

SELECT choisit les colonnes ; WHERE choisit les lignes. Il prend une condition et ne garde que les lignes pour lesquelles elle est vraie.

3

SELECT name, price, stock_quantity
FROM products
WHERE price > 100
LIMIT 20;
Ouvrir dans Planche

Résultat — 5 premières lignes sur 20

namepricestock_quantity
Lean Startup (Deluxe ed.)107.3784
Pixel Sofa108.187
Terra Pillow Pro113.670
Pulse LED Strip114.86480
Brief Answers (3rd ed.)117.96194

Les opérateurs de comparaison sont ceux que vous devinez : =, <> (ou !=), <, <=, >, >=. Deux d’entre eux se comportent autrement que dans les autres langages et piègent tout le monde une fois :

  • L’égalité s’écrit avec un seul =, pas ==.
  • Rien n’est égal à NULL, pas même NULL. WHERE weight_kg = NULL ne correspond à aucune ligne, quel que soit le nombre de produits sans poids renseigné. Le test qu’il vous faut est IS NULL / IS NOT NULL. La leçon suivante s’en occupe pour de bon.

Trier avec ORDER BY

Sans ORDER BY, l’ordre dans lequel les lignes reviennent n’est pas défini. Si l’ordre compte pour vous, dites-le — et si vous ne le dites pas, ne vous fiez pas à ce que vous voyez par hasard, car cela peut changer dès qu’un index ou les données changent.

4

SELECT name, price
FROM products
ORDER BY price DESC
LIMIT 20;
Ouvrir dans Planche

Résultat — 5 premières lignes sur 20

nameprice
Glide GPS Watch Pro2484.4
Terra 3D Puzzle2481.77
Aria Castle Kit2479.41
Aria LED Strip Pro2463.41
Nova Brief Answers2445.49

DESC trie du plus grand au plus petit ; ASC (la valeur par défaut) fait l’inverse. Notez la combinaison dans cette requête : ORDER BY price DESC avec LIMIT 20, c’est ainsi qu’on demande un top 20. Inversez mentalement les deux clauses et vous verrez pourquoi l’ordre compte : la base trie tout d’abord, puis prend les vingt premières.

Dans Planche, vous tapez rarement celle-là. Cliquez sur un en-tête de colonne dans la grille et le tri se fait côté serveur sur toute la table, en alternant croissant → décroissant → non trié. Regarder le SQL généré est un bon moyen de vérifier le vôtre.

Trier sur plusieurs colonnes

Listez plusieurs clés et chacune départage les ex æquo laissés par la précédente.

5

SELECT category_id, name, price
FROM products
ORDER BY category_id, price DESC
LIMIT 30;
Ouvrir dans Planche

Résultat — 5 premières lignes sur 30

category_idnameprice
2Aria Notebook2116.4
2Ember Laptop Plus2087.98
2Sol Notebook1982.34
2Sol Ultrabook1942.47
2Nimbus Ultrabook1933.06

Cela regroupe les produits par catégorie et, à l’intérieur de chacune, place les plus chers en premier. Cela se lit « par catégorie, puis par prix décroissant » — exactement la phrase que vous diriez à voix haute.

Expressions et alias

La liste du SELECT n’est pas forcément faite de colonnes. Elle peut contenir de l’arithmétique, des appels de fonctions, ou tout ce qui produit une valeur par ligne — et AS donne un nom au résultat.

6

SELECT name,
       price,
       cost,
       ROUND(price - cost, 2) AS margin
FROM products
WHERE is_active = 1
ORDER BY margin DESC
LIMIT 15;
Ouvrir dans Planche

Résultat — 5 premières lignes sur 15

namepricecostmargin
Ember Tab Plus2412.93984.941427.99
Aria LED Strip Pro2463.411098.691364.72
Luma Denim Jacket Pro2357.59993.241364.35
Drift A Winter Letter2422.51082.431340.07
Nova Brief Answers2445.491108.091337.4

ROUND(price - cost, 2) AS margin calcule une colonne qui n’existe nulle part dans la table, et le nom margin est ensuite utilisable dans ORDER BY. Il ne l’est pas dans WHERE, ce qui fait régulièrement trébucher. La raison tient à l’ordre dans lequel la base évalue les clauses :

FROM  ->  WHERE  ->  SELECT  ->  ORDER BY  ->  LIMIT

Quand ORDER BY s’exécute, SELECT a déjà produit margin. Quand WHERE s’exécute, non : WHERE margin > 50 est donc une erreur — il faut répéter l’expression, ou envelopper la requête dans une autre. Gardez cette séquence en tête ; elle explique aussi pourquoi WHERE filtre avant le regroupement et HAVING après, ce qui est le sujet de la leçon d’après.

Ce que vous savez faire maintenant

Ces seules clauses répondent à un nombre surprenant de vraies questions : les vingt produits les plus chers, tout ce qui est en rupture, les meilleures marges du catalogue actif. Ce que vous ne pouvez pas encore faire, c’est poser une question à cheval sur deux tables — quel client a passé quelle commande — et c’est à cela que servent les jointures.

Avant de continuer, modifiez les nombres et les noms de colonnes des exemples ci-dessus et relancez-les. La grille se met à jour sur place : la boucle est rapide.

À vous d’essayer

  1. Les dix produits les moins chers encore en vente, en n’affichant que le nom et le prix. (is_active vaut 1 quand un produit est en vente.)

    Voir la réponse

    Voir la réponse

    SELECT name, price
    FROM products
    WHERE is_active = 1
    ORDER BY price
    LIMIT 10;
    Ouvrir dans Planche

    Résultat — 5 premières lignes sur 10

    nameprice
    Clean Code (2nd ed.)6.89
    Nimbus Desk Max7.21
    Drift Castle Kit Max17.35
    Pixel Laptop18.46
    Terra Dumbbell Set19.8

    Trois clauses, une tâche chacune : WHERE écarte les produits qui ne sont plus en vente, ORDER BY price place les moins chers en tête — croissant est la valeur par défaut, aucun mot-clé n’est nécessaire — et LIMIT 10 s’arrête là.

  2. Quelle est la valeur du stock de chaque produit ? Affichez le nom, la quantité, et prix × quantité arrondi à deux décimales, du plus grand au plus petit.

    Voir la réponse

    Voir la réponse

    SELECT name,
           stock_quantity,
           ROUND(price * stock_quantity, 2) AS stock_value
    FROM products
    ORDER BY stock_value DESC
    LIMIT 10;
    Ouvrir dans Planche

    Résultat — 5 premières lignes sur 10

    namestock_quantitystock_value
    Luma Boots4921042454.52
    Glide GPS Watch Pro4141028541.6
    Brief Answers (Deluxe ed.)434988448.02
    Brief Answers (Hardcover ed.)413980879.13
    Vega Field Watch464975221.28

    La troisième colonne n’existe nulle part dans la table ; AS stock_value la nomme, et comme ORDER BY s’exécute après SELECT, ce nom peut servir au tri.