Lesson 2/7 8 min

Selecting data

Master SELECT, FROM, column selection, ORDER BY and LIMIT to read exactly what you need.

FR EN

Le problème : trouver une aiguille dans 10 000 produits

Votre boutique a maintenant 10 000 produits en base. Votre patron vous demande : « Donne-moi les 5 produits les plus chers du catalogue, juste le nom et le prix. »

Impossible de scroller à la main. Vous avez besoin d'un outil pour extraire précisément ce que vous voulez : certaines colonnes, certaines lignes, dans un certain ordre, en quantité limitée. C'est exactement le rôle de SELECT.

Pour toute cette leçon, on travaille sur une table produits :

id  | nom              | categorie    | prix    | stock
----+------------------+--------------+---------+------
1   | Clavier méca     | informatique | 89.90   | 42
2   | Souris sans fil  | informatique | 29.90   | 0
3   | Café en grains   | epicerie     | 12.50   | 120
4   | Mug isotherme    | maison       | 19.90   | 8

SELECT ... FROM : le duo de base

Toute lecture commence par deux mots-clés : SELECT (quelles colonnes ?) et FROM (dans quelle table ?).

SELECT nom, prix
FROM produits;

Cette requête renvoie uniquement les colonnes nom et prix de toutes les lignes. Le point-virgule final marque la fin de l'instruction.

Vous pouvez aussi tout demander avec l'étoile * :

SELECT *
FROM produits;

Évitez SELECT * en production. Il récupère toutes les colonnes, même celles dont vous n'avez pas besoin : c'est plus lent, ça consomme de la mémoire inutilement, et votre code casse silencieusement si l'ordre des colonnes change. Nommez toujours les colonnes voulues.

WHERE : ne garder que certaines lignes

Sans filtre, SELECT renvoie toutes les lignes. La clause WHERE ne garde que celles qui respectent une condition :

SELECT nom, prix
FROM produits
WHERE categorie = 'informatique';

Ici, seuls les produits de la catégorie informatique sortent. On peut comparer des nombres :

SELECT nom, prix
FROM produits
WHERE prix > 20;

Le texte se compare entre apostrophes simples ('informatique'), les nombres sans apostrophes (20). La leçon suivante explore WHERE en profondeur (AND, OR, LIKE, IN...).

ORDER BY et LIMIT : trier et limiter

ORDER BY trie le résultat. ASC = croissant (par défaut), DESC = décroissant.

SELECT nom, prix
FROM produits
ORDER BY prix DESC;

LIMIT coupe le résultat à un nombre de lignes. La demande du patron — les 5 produits les plus chers — devient :

SELECT nom, prix
FROM produits
ORDER BY prix DESC
LIMIT 5;

L'ordre des clauses est toujours le même : SELECT → FROM → WHERE → ORDER BY → LIMIT. Si vous l'inversez, la requête échoue.

Pour paginer (page 2, 10 par page), ajoutez OFFSET : LIMIT 10 OFFSET 10 saute les 10 premières lignes et renvoie les 10 suivantes.

The problem: finding a needle in 10,000 products

Your shop now has 10,000 products in the database. Your boss asks: "Give me the 5 most expensive products in the catalog, just the name and price."

You cannot scroll by hand. You need a tool to extract precisely what you want: some columns, some rows, in a certain order, in a limited quantity. This is exactly what SELECT does.

For this whole lesson, we work on a produits table:

id  | nom              | categorie    | prix    | stock
----+------------------+--------------+---------+------
1   | Clavier meca     | informatique | 89.90   | 42
2   | Souris sans fil  | informatique | 29.90   | 0
3   | Cafe en grains   | epicerie     | 12.50   | 120
4   | Mug isotherme    | maison       | 19.90   | 8

SELECT ... FROM: the basic duo

Every read starts with two keywords: SELECT (which columns?) and FROM (from which table?).

SELECT nom, prix
FROM produits;

This query returns only the nom and prix columns of all rows. The trailing semicolon marks the end of the statement.

You can also request everything with the star *:

SELECT *
FROM produits;

Avoid SELECT * in production. It fetches every column, even those you do not need: it is slower, wastes memory, and your code breaks silently if the column order changes. Always name the columns you want.

WHERE: keep only some rows

Without a filter, SELECT returns all rows. The WHERE clause keeps only those matching a condition:

SELECT nom, prix
FROM produits
WHERE categorie = 'informatique';

Here, only products in the informatique category come out. You can compare numbers:

SELECT nom, prix
FROM produits
WHERE prix > 20;

Text is compared between single quotes ('informatique'), numbers without quotes (20). The next lesson explores WHERE in depth (AND, OR, LIKE, IN...).

ORDER BY and LIMIT: sort and limit

ORDER BY sorts the result. ASC = ascending (default), DESC = descending.

SELECT nom, prix
FROM produits
ORDER BY prix DESC;

LIMIT caps the result to a number of rows. The boss's request — the 5 most expensive products — becomes:

SELECT nom, prix
FROM produits
ORDER BY prix DESC
LIMIT 5;

The clause order is always the same: SELECT → FROM → WHERE → ORDER BY → LIMIT. If you reverse it, the query fails.

To paginate (page 2, 10 per page), add OFFSET: LIMIT 10 OFFSET 10 skips the first 10 rows and returns the next 10.

À vous d'essayer — la base est déjà remplie :

CREATE TABLE clients (id INTEGER, nom TEXT, email TEXT, ville TEXT);
INSERT INTO clients VALUES (1, 'Alice Durand', 'alice@exemple.fr', 'Dijon');
INSERT INTO clients VALUES (2, 'Marc Petit', 'marc@exemple.fr', 'Lyon');
INSERT INTO clients VALUES (3, 'Léa Martin', 'lea@exemple.fr', 'Dijon');

SELECT nom, email
FROM clients
ORDER BY nom
LIMIT 2;
Avec l'IA

Demandez la requête à l'IA en lui donnant le schéma, puis vérifiez qu'elle nomme bien les colonnes au lieu d'un SELECT * :

J'ai une table produits avec les colonnes : id, nom, categorie, prix, stock. Écris une requête SQL qui renvoie le nom et le prix des 5 produits les plus chers de la catégorie informatique. Nomme les colonnes explicitement (pas de SELECT *) et explique chaque clause.
Ré-explique sans regarder

Sans relire la réponse de l'IA : avec tes mots, pourquoi vaut-il mieux écrire SELECT nom, prix plutôt que SELECT * quand tu ne veux que ces deux colonnes ?

Une bonne explication dit : nommer les colonnes ne renvoie que les données utiles (moins de réseau et de mémoire) ; le résultat reste stable si quelqu'un ajoute ou réordonne une colonne, alors que SELECT * renverrait soudain une colonne en plus ou dans un ordre différent et casserait le code qui lit par position ; et la requête documente clairement ce dont l'application a besoin.
Exercice : Écrivez la requête

Écrivez une requête qui renvoie le nom et le prix des produits de la table produits, triés du moins cher au plus cher, limités à 3 résultats. Utilisez SELECT, FROM, ORDER BY et LIMIT.

Accepter ou rejeter le code de l'IA

Tu as demandé à l'IA « le nom et le prix des 3 produits les plus chers ». Elle te propose cette requête. Ton rôle de relecteur : l'accepter telle quelle ou la rejeter, et dire pourquoi.

SELECT *
FROM produits
ORDER BY prix DESC
LIMIT 3;
À rejeter. Le tri et le LIMIT 3 sont justes, mais tu avais demandé le nom et le prix, et l'IA renvoie SELECT * : toutes les colonnes (id, categorie, stock comprises). C'est plus de données que nécessaire, et surtout c'est fragile : si demain on ajoute une colonne à la table, le résultat change tout seul. Corrige en SELECT nom, prix.
Rappel libre

Sans remonter dans la leçon : écris de mémoire la requête qui renvoie le nom et le prix des 5 produits les plus chers de la table produits. Dans quel ordre s'enchaînent les clauses ?

SELECT nom, prix FROM produits ORDER BY prix DESC LIMIT 5; — l'ordre des clauses est toujours SELECTFROM → (WHERE) → ORDER BYLIMIT. DESC trie du plus cher au moins cher, et LIMIT 5 ne garde que les 5 premières lignes du résultat trié. Inverser cet ordre fait échouer la requête.
Pourquoi éviter SELECT * en production ?
Que fait ORDER BY prix DESC ?
Quelle clause limite le nombre de lignes renvoyées ?
Next step

You can now read every row of a table. But we rarely want everything: the next lesson adds the WHERE filter (AND, OR, LIKE, IN, BETWEEN) and multi-column sorting to keep only the rows that matter.

Lesson 3: Filtering and sorting →
Besoin d'un développeur pour votre projet ?

Réponse sous 24h · Sans engagement