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;
Résultat — 5 premières lignes sur 20
| id | category_id | name | description | sku | price | cost | stock_quantity | weight_kg | attributes | is_active | created_at | updated_at |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 16 | Glass Orchard (Paperback ed.) | Glass Orchard (Paperback ed.) — built to last. | SKU-00001 | 913.72 | 443.95 | 179 | 6.18 | {"color":"green","warranty_months":12,"material":"fabric"} | 1 | 2024-01-13 07:13:52 | 2024-01-13 07:13:52 |
| 2 | 17 | Luma The Gene | Luma The Gene — built to last. | SKU-00002 | 332.64 | 161.72 | 83 | 5.893 | {"color":"silver","warranty_months":24,"material":"steel"} | 1 | 2022-06-16 08:45:20 | 2022-06-16 08:45:20 |
| 3 | 21 | Quill Helmet | Quill Helmet — designed for daily use. | SKU-00003 | 196.26 | 118.25 | 399 | 8.261 | {"color":"silver","warranty_months":24} | 1 | 2022-08-26 20:06:03 | 2022-08-26 20:06:03 |
| 4 | 16 | Kite Glass Orchard 3 | Kite Glass Orchard 3 — built to last. | SKU-00004 | 1719.68 | 845.91 | 243 | 5.263 | {"color":"silver","warranty_months":24} | 0 | 2022-07-19 11:34:27 | 2022-07-19 11:34:27 |
| 5 | 17 | The Gene (3rd ed.) | The Gene (3rd ed.) — a dependable everyday choice. | SKU-00005 | 122.8 | 69.5 | 357 | 1.898 | {"color":"red","warranty_months":36,"material":"aluminium"} | 1 | 2022-05-21 10:53:40 | 2022-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;
Résultat — 5 premières lignes sur 20
| name | sku | price | stock_quantity |
|---|---|---|---|
| Glass Orchard (Paperback ed.) | SKU-00001 | 913.72 | 179 |
| Luma The Gene | SKU-00002 | 332.64 | 83 |
| Quill Helmet | SKU-00003 | 196.26 | 399 |
| Kite Glass Orchard 3 | SKU-00004 | 1719.68 | 243 |
| The Gene (3rd ed.) | SKU-00005 | 122.8 | 357 |
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;
Résultat — 5 premières lignes sur 20
| name | price | stock_quantity |
|---|---|---|
| Lean Startup (Deluxe ed.) | 107.37 | 84 |
| Pixel Sofa | 108.18 | 7 |
| Terra Pillow Pro | 113.67 | 0 |
| Pulse LED Strip | 114.86 | 480 |
| Brief Answers (3rd ed.) | 117.96 | 194 |
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 = NULLne correspond à aucune ligne, quel que soit le nombre de produits sans poids renseigné. Le test qu’il vous faut estIS 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;
Résultat — 5 premières lignes sur 20
| name | price |
|---|---|
| Glide GPS Watch Pro | 2484.4 |
| Terra 3D Puzzle | 2481.77 |
| Aria Castle Kit | 2479.41 |
| Aria LED Strip Pro | 2463.41 |
| Nova Brief Answers | 2445.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;
Résultat — 5 premières lignes sur 30
| category_id | name | price |
|---|---|---|
| 2 | Aria Notebook | 2116.4 |
| 2 | Ember Laptop Plus | 2087.98 |
| 2 | Sol Notebook | 1982.34 |
| 2 | Sol Ultrabook | 1942.47 |
| 2 | Nimbus Ultrabook | 1933.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;
Résultat — 5 premières lignes sur 15
| name | price | cost | margin |
|---|---|---|---|
| Ember Tab Plus | 2412.93 | 984.94 | 1427.99 |
| Aria LED Strip Pro | 2463.41 | 1098.69 | 1364.72 |
| Luma Denim Jacket Pro | 2357.59 | 993.24 | 1364.35 |
| Drift A Winter Letter | 2422.5 | 1082.43 | 1340.07 |
| Nova Brief Answers | 2445.49 | 1108.09 | 1337.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.