Lire les données — SELECT
SELECT *, SELECT colonnes. WHERE (=, !=, >, <, AND, OR, NOT). IN, BETWEEN, LIKE (%), IS NULL. ORDER BY (ASC, DESC). LIMIT, OFFSET (pagination). AS (alias). DISTINCT. Colonnes calculées.
Concepts Théoriques
SELECT est la requête que vous utiliserez le plus — probablement 80% de toutes vos requêtes SQL. Elle lit les données de la base et les retourne sous forme de tableau. Maîtriser SELECT en profondeur est la compétence SQL la plus importante.
SELECT de base
SELECT * FROM products; retourne toutes les colonnes et toutes les lignes de la table products. L'étoile (*) signifie "toutes les colonnes".
En production, ne faites JAMAIS SELECT * — listez les colonnes explicitement : SELECT name, price, stock FROM products;. Pourquoi ? Parce que SELECT * charge TOUTES les colonnes, y compris les TEXT longs et les BLOB que vous n'avez pas besoin. Sur une table avec 30 colonnes dont une description de 10 000 caractères, SELECT * est 10 fois plus lent que SELECT name, price.
WHERE — filtrer les résultats
WHERE est le filtre. Sans WHERE, SELECT retourne TOUTES les lignes.
Opérateurs de comparaison :
- = égal : WHERE category_id = 1
- != ou <> différent : WHERE status != 'cancelled'
- > >= < <= supérieur/inférieur : WHERE price > 10000
- Ces opérateurs fonctionnent aussi sur les dates : WHERE created_at >= '2026-01-01'
Opérateurs logiques :
- AND — les deux conditions doivent être vraies : WHERE price > 5000 AND stock > 0
- OR — au moins une condition doit être vraie : WHERE category_id = 1 OR category_id = 4
- NOT — inverse la condition : WHERE NOT is_active = TRUE
IN — vérifier si la valeur est dans une liste (remplace plusieurs OR) : WHERE category_id IN (1, 2, 3) est équivalent à WHERE category_id = 1 OR category_id = 2 OR category_id = 3 — mais beaucoup plus lisible.
BETWEEN — dans un intervalle (bornes incluses) : WHERE price BETWEEN 5000 AND 20000 retourne les produits de 5000 à 20000 FCFA. Fonctionne aussi avec les dates : WHERE created_at BETWEEN '2026-01-01' AND '2026-03-31'.
LIKE — recherche de texte avec jokers :
- % remplace n'importe quel nombre de caractères : WHERE name LIKE '%wax%' (contient "wax"), WHERE name LIKE 'Sam%' (commence par "Sam"), WHERE email LIKE '%@gmail.com' (termine par @gmail.com)
- _ remplace exactement UN caractère : WHERE sku LIKE 'TEL-__1' (TEL- suivi de 2 caractères et 1) LIKE est insensible à la casse en MySQL (par défaut avec utf8mb4_unicode_ci).
IS NULL / IS NOT NULL — tester l'absence de valeur : WHERE compare_price IS NOT NULL retourne les produits en promo (qui ont un ancien prix). Attention : WHERE compare_price = NULL ne fonctionne PAS — NULL n'est "égal" à rien, il faut utiliser IS NULL.
ORDER BY — trier les résultats
ORDER BY price ASC trie du plus petit au plus grand (ASC est le défaut, on peut l'omettre). ORDER BY price DESC trie du plus grand au plus petit. ORDER BY category_id ASC, price DESC trie d'abord par catégorie (croissant) puis par prix (décroissant) à l'intérieur de chaque catégorie. ORDER BY RAND() trie aléatoirement (utile pour afficher des produits au hasard, mais lent sur de grosses tables).
LIMIT et OFFSET — paginer
LIMIT 10 retourne les 10 premiers résultats. LIMIT 10 OFFSET 10 saute les 10 premiers et retourne les 10 suivants (= page 2). LIMIT 10 OFFSET 20 = page 3.
La formule de pagination : OFFSET = (numéro_de_page - 1) * nombre_par_page.
AS — renommer une colonne dans le résultat
SELECT name AS produit, price AS prix_fcfa FROM products; — les colonnes dans le résultat s'appellent "produit" et "prix_fcfa" au lieu de "name" et "price". Utile pour la lisibilité et quand deux tables ont des colonnes du même nom.
DISTINCT — valeurs uniques
SELECT DISTINCT category_id FROM products; retourne chaque category_id une seule fois, même s'il y a 50 produits dans la même catégorie. Utile pour lister les valeurs existantes.