Tout ce qu'il faut connaître par cœur pour interroger une table : vocabulaire, syntaxe, ordre des clauses, pièges et questions d'auto-évaluation.
Cette fiche rassemble ce qu'il faut savoir par cœur pour trier, filtrer, compter et regrouper les lignes d'une table ; les exemples portent sur la table eleve (colonnes id, nom, prenom, date_naissance, commune, email, absences).
| Terme | En anglais | Définition |
|---|---|---|
| requête | query | Question posée à la base de données, écrite en langage SQL. |
| clause | clause | Morceau de requête qui commence par un mot-clé (SELECT, FROM, WHERE…). Les clauses présentes doivent apparaître dans un ordre imposé. |
trier (ORDER BY) |
sort | Ranger les lignes d'un résultat selon les valeurs d'une ou plusieurs colonnes. Le tri change l'ordre d'affichage, pas le contenu de la table. |
| condition | condition | Affirmation vérifiée sur chaque ligne, vraie ou fausse. WHERE ne garde que les lignes pour lesquelles elle est vraie. |
| opérateur de comparaison | comparison operator | Symbole qui compare deux valeurs : =, <>, <, >, <=, >=. |
| priorité | operator precedence | Ordre dans lequel les opérateurs sont évalués. AND est évalué avant OR ; les parenthèses imposent un autre ordre. |
| motif | pattern | Modèle de texte qui décrit une famille de valeurs. LIKE garde les valeurs qui correspondent au motif. |
| joker | wildcard | Caractère qui, dans un motif, remplace d'autres caractères : % pour n'importe quelle suite (même vide), _ pour exactement un caractère. |
| NULL | null value | Marque d'une valeur absente ou inconnue. Ce n'est ni 0, ni le texte vide ''. |
| IS NULL / IS NOT NULL | IS NULL | Tests vrais quand la case est vide / contient une valeur. Seuls moyens fiables de tester NULL. |
| LIMIT | limit | Ne garde que les n premières lignes du résultat, après le filtre et le tri. |
| DISTINCT / doublon | distinct / duplicate | DISTINCT affiche chaque ligne du résultat une seule fois ; deux lignes identiques sont des doublons. |
| fonction d'agrégation | aggregate function | Fonction qui calcule une seule valeur à partir d'un ensemble de lignes : COUNT, SUM, AVG, MIN, MAX. |
regroupement (GROUP BY) |
group by | Range les lignes en groupes de même valeur ; les agrégats sont calculés pour chaque groupe, une ligne par groupe. |
SELECT = sélectionne (les colonnes), FROM = depuis (la table). AS = en tant que : renomme une colonne dans le résultat.
SELECT prenom, nom AS nom_de_famille
FROM eleve;
Ordonner par. ASC = croissant (par défaut), DESC = décroissant, pour la seule colonne qu'il suit.
SELECT nom, commune, absences
FROM eleve
ORDER BY commune, absences DESC;
Où. Texte et dates entre apostrophes, nombres sans.
SELECT prenom, nom
FROM eleve
WHERE absences > 4;
SELECT prenom, nom
FROM eleve
WHERE date_naissance < '2010-01-01';
AND = et (toutes vraies), OR = ou (au moins une vraie).
SELECT prenom, nom
FROM eleve
WHERE (commune = 'Perwez' OR commune = 'Hannut')
AND absences > 3;
Entre. Les deux bornes sont comprises ; la plus petite s'écrit en premier.
SELECT prenom, nom
FROM eleve
WHERE absences BETWEEN 1 AND 4;
Dans / pas dans.
SELECT prenom, nom
FROM eleve
WHERE commune IN ('Perwez', 'Hannut', 'Ramillies');
Comme. % = n'importe quelle suite de caractères, _ = exactement un caractère.
SELECT prenom, nom
FROM eleve
WHERE nom LIKE 'D%'; -- commence par D
SELECT prenom, email
FROM eleve
WHERE email LIKE '%@ecole.be'; -- se termine par @ecole.be
Est nul / n'est pas nul.
SELECT prenom, nom
FROM eleve
WHERE email IS NULL;
Limite. Toujours avec un ORDER BY. OFFSET n (décalage) saute les n premières lignes.
SELECT prenom, nom, absences
FROM eleve
ORDER BY absences DESC
LIMIT 3;
Juste après SELECT. S'applique à toutes les colonnes du SELECT.
SELECT DISTINCT commune
FROM eleve
ORDER BY commune;
COUNT = compter, SUM = somme, AVG = moyenne, MIN / MAX, ROUND(valeur, n) = arrondir à n décimales.
SELECT COUNT(*) AS nb_eleves,
COUNT(email) AS nb_emails,
COUNT(DISTINCT commune) AS nb_communes,
SUM(absences) AS total,
ROUND(AVG(absences), 1) AS moyenne,
MIN(date_naissance) AS plus_ancienne
FROM eleve;
Regrouper par. Le SELECT ne contient que les colonnes regroupées et des agrégats.
SELECT commune, COUNT(*) AS nb_eleves
FROM eleve
GROUP BY commune
ORDER BY nb_eleves DESC, commune;
Les clauses sont facultatives, sauf SELECT (et FROM pour lire une table). Celles qui sont présentes apparaissent toujours dans cet ordre :
SELECT ... -- 1. Qu'est-ce que je veux voir ?
FROM ... -- 2. Où sont les données ?
WHERE ... -- 3. Quelles lignes ?
GROUP BY ... -- 4. Regroupées comment ?
ORDER BY ... -- 5. Dans quel ordre ?
LIMIT ...; -- 6. Combien ?
Une clause mal placée provoque l'erreur near "…": syntax error, où … est le mot où SQLite s'est perdu.
| Piège | Ce qui se passe | La bonne écriture |
|---|---|---|
WHERE email = NULL |
Aucune ligne, jamais, sans erreur : une comparaison avec NULL est inconnue, pas vraie. |
WHERE email IS NULL |
WHERE email <> 'x@ecole.be' |
Les lignes NULL disparaissent aussi. |
ajouter OR email IS NULL si tu les veux |
WHERE a = 1 OR b = 2 AND c = 3 |
AND est évalué d'abord : a = 1 OR (b = 2 AND c = 3). |
parenthèses : (a = 1 OR b = 2) AND c = 3 |
WHERE prenom = Emma |
Erreur no such column: Emma : sans apostrophes, c'est un nom de colonne. |
WHERE prenom = 'Emma' |
WHERE date_naissance > 2010-01-01 |
Aucune erreur mais résultat faux : 2010-01-01 est le calcul 2008. |
WHERE date_naissance > '2010-01-01' |
COUNT(email) pour compter des élèves |
Les NULL ne sont pas comptés : 9 au lieu de 12. |
COUNT(*) |
LIMIT 3 sans ORDER BY |
« Les trois premiers » selon un ordre non garanti. | ORDER BY … LIMIT 3 |
WHERE commune = 'Jodoigne' |
La ligne encodée jodoigne est ratée : = fait la différence entre majuscules et minuscules. |
LIKE 'jodoigne' pour chercher, puis corriger la donnée |
LIKE 'GÉRARD' |
LIKE ignore la casse des lettres sans accent seulement : É et é restent différents. |
respecter les accents et leur casse |
| Tri du texte | Majuscules, puis minuscules, puis lettres accentuées : jodoigne après Wavre, Léa après Lucas. |
écrire les données de façon cohérente |
WHERE COUNT(*) >= 2 |
Erreur misuse of aggregate : WHERE agit avant le calcul. |
HAVING COUNT(*) >= 2 après GROUP BY |
Réponds sur papier, sans regarder la fiche, puis vérifie avec les réponses.
WHERE, ORDER BY et GROUP BY ?LIMIT, FROM, ORDER BY, SELECT, WHERE, GROUP BY ?ORDER BY ? Comment l'inverser ?WHERE email = NULL ne renvoie-t-il jamais rien ? Que faut-il écrire ?NULL, 0 et '' ?WHERE date_naissance > 2010-01-01, sans apostrophes ? Pourquoi ?WHERE commune = 'Perwez' OR commune = 'Hannut' AND absences > 3, quelle partie est évaluée en premier ? Réécris la condition pour « Perwez ou Hannut, et plus de 3 absences ».BETWEEN 1 AND 4 garde-t-il les valeurs 1 et 4 ?% et _ ? Écris un motif pour « nom de cinq lettres qui commence par L ».WHERE commune LIKE 'jodoigne' trouve-t-il Jodoigne ? Et WHERE nom LIKE 'GÉRARD' trouve-t-il Gérard ?ORDER BY avec LIMIT ?eleve, COUNT(*) vaut 12 et COUNT(email) vaut 9. Explique l'écart.SELECT DISTINCT commune FROM eleve renvoie six lignes pour cinq communes réelles. Que peut-on en conclure ?WHERE COUNT(*) >= 2 provoque-t-il une erreur ?GROUP BY commune, pourquoi ne faut-il pas ajouter nom dans le SELECT ?WHERE = où ; ORDER BY = ordonner par ; GROUP BY = regrouper par.SELECT, FROM, WHERE, GROUP BY, ORDER BY, LIMIT.ASC). On l'inverse avec DESC après la colonne.NULL donne un résultat inconnu, et WHERE ne garde que les conditions vraies. Il faut écrire WHERE email IS NULL.NULL : aucune valeur, inconnue. 0 : un nombre connu qui vaut zéro. '' : un texte connu qui ne contient aucun caractère.2010-01-01 est le calcul 2010 − 1 − 1 = 2008 ; SQLite compare les dates au texte '2008', et toutes les dates de la table commencent par 2009 ou 2010, donc la condition est toujours vraie.commune = 'Hannut' AND absences > 3 est évalué en premier. Réécriture : (commune = 'Perwez' OR commune = 'Hannut') AND absences > 3.% : n'importe quelle suite de caractères, même vide ; _ : exactement un caractère. Motif : LIKE 'L____'.Jodoigne : LIKE ignore la casse des lettres sans accent. Non pour Gérard : É et é sont vus comme différents.ORDER BY, l'ordre des lignes n'est pas garanti : « les premières lignes » ne correspondent à aucune question précise.COUNT(email) ne compte pas les cases NULL : trois élèves n'ont pas d'adresse email.jodoigne en minuscules, que SQLite considère comme différente de Jodoigne.WHERE travaille ligne par ligne avant la formation des groupes : il n'y a encore rien à compter. Pour filtrer les groupes, on utilise HAVING.