Référence SQL
Wiki SQL
Syntaxe, exemples et astuces pour chaque commande SQL.
- fiches
- 48
- catégories
- 12
- SGBD
- SQLite
Lecture (DQL)
Interroger, trier et paginer des données.
- SELECTSELECT est la question posée à la base : quelles colonnes afficher et depuis quelle table (FROM). C'est le point de départ de toute requête de lecture, du simple listing au rapport.
- WHEREWHERE ne garde que les lignes qui vérifient une condition, avant tout regroupement. C'est le filtre de base pour cibler un client, une période, un statut ou une plage de valeurs.
- ORDER BYORDER BY trie le résultat final, croissant par défaut (ASC) ou décroissant (DESC). Plusieurs colonnes servent à départager les ex æquo, par exemple le prix puis le nom.
- DISTINCTDISTINCT supprime les lignes en double du résultat, en comparant toutes les colonnes listées. On s'en sert pour obtenir la liste des valeurs possibles d'une colonne, comme les villes clientes.
- LIMIT / OFFSETLIMIT garde les n premières lignes du résultat trié, OFFSET en saute m avant de commencer. C'est l'outil des classements (top 3) et de la pagination d'une liste dans une application.
- Ordre logique d'exécutionUne requête ne s'évalue pas dans l'ordre où on l'écrit : FROM vient d'abord, SELECT presque à la fin. Connaître cet ordre explique la plupart des erreurs d'alias et d'agrégats.
Modification (DML)
Insérer, mettre à jour, supprimer et fusionner des lignes.
- INSERTINSERT ajoute de nouvelles lignes dans une table, une par une, par lot ou à partir d'une requête. Les colonnes non citées prennent leur valeur par défaut, ou NULL si aucune n'est prévue.
- UPDATEUPDATE modifie les valeurs de lignes existantes. La clause WHERE désigne les lignes visées, SET les nouvelles valeurs, qui peuvent se calculer à partir des anciennes (hausse de prix, statut).
- DELETEDELETE retire des lignes d'une table tout en conservant sa structure. On l'utilise pour purger des données obsolètes ou annulées, toujours avec un WHERE vérifié au préalable.
- UPSERT (ON CONFLICT)Un UPSERT insère une ligne ou, si sa clé existe déjà, met à jour la ligne en place. C'est la façon sûre de synchroniser un catalogue ou un import sans tester l'existence au préalable.
- RETURNINGRETURNING renvoie les lignes touchées par un INSERT, un UPDATE ou un DELETE, dans la même instruction. On récupère ainsi l'identifiant généré ou les nouvelles valeurs sans requête supplémentaire.
Structure (DDL)
Créer et faire évoluer le schéma, tables et vues.
- CREATE TABLECREATE TABLE déclare une nouvelle table : ses colonnes, leurs types et les contraintes qui protègent les données. C'est la traduction concrète d'un modèle MLD en schéma de base.
- ALTER TABLEALTER TABLE fait évoluer une table existante sans perdre ses données : ajouter, renommer ou supprimer une colonne, renommer la table. C'est l'outil des migrations de schéma.
- DROP TABLEDROP TABLE supprime définitivement une table, ses données, ses index et ses triggers. On le réserve aux tables temporaires ou aux migrations, jamais sans sauvegarde sur des données réelles.
- CREATE VIEW (vues)Une vue est une requête enregistrée sous un nom, qu'on interroge ensuite comme une table. Elle évite de réécrire une jointure complexe et permet de n'exposer que certaines colonnes.
Jointures
Relier plusieurs tables entre elles.
- INNER JOININNER JOIN associe les lignes de deux tables qui se correspondent, en général une clé étrangère et la clé primaire qu'elle référence. Les lignes sans correspondance disparaissent du résultat.
- LEFT JOINLEFT JOIN garde toutes les lignes de la table de gauche, avec ou sans correspondance à droite (les colonnes de droite valent alors NULL). Idéal pour compter des zéros ou repérer des absents.
- RIGHT JOINRIGHT JOIN est le miroir du LEFT JOIN : il garde toutes les lignes de la table de droite, complétées par NULL à gauche. Disponible dans SQLite depuis la 3.39, donc dans le playground.
- CROSS JOINCROSS JOIN combine chaque ligne de A avec chaque ligne de B, soit |A| × |B| lignes. Il sert à fabriquer une grille complète (clients × catégories, jours × produits) avant d'y joindre les faits.
- SELF JOINUne auto-jointure relie une table à elle-même grâce à deux alias. Elle sert pour les hiérarchies (employé et manager) et pour comparer des lignes d'une même table entre elles.
- FULL OUTER JOINFULL OUTER JOIN garde toutes les lignes des deux tables, appariées quand c'est possible et complétées par NULL sinon. C'est l'outil du rapprochement entre deux listes ou deux périodes.
Agrégations
Compter, sommer, regrouper et pivoter des données.
- COUNT & GROUP BYGROUP BY range les lignes en groupes selon une ou plusieurs colonnes, puis COUNT, SUM ou AVG calculent une valeur par groupe. On obtient un tableau de synthèse, une ligne par groupe.
- SUM, AVG, MIN, MAXCes fonctions résument une colonne numérique en une seule valeur : total, moyenne, plus petite et plus grande valeur, sur toute la table ou par groupe. Base de tout indicateur chiffré.
- HAVINGHAVING filtre les groupes après le calcul des agrégats, là où WHERE filtre les lignes avant. On l'utilise pour garder, par exemple, les clients ayant passé au moins deux commandes.
- Agrégation conditionnellePlacer un CASE dans un agrégat permet de calculer plusieurs indicateurs en un seul passage, un par colonne. C'est la technique du tableau croisé : une ligne par client, une colonne par statut.
- GROUP_CONCAT / string_aggGROUP_CONCAT assemble les valeurs d'un groupe en une seule chaîne séparée par un délimiteur. Pratique pour afficher la liste des élèves d'une classe ou des produits d'une commande sur une ligne.
Filtrage avancé
IN, LIKE, NULL, EXISTS et le piège de NOT IN.
- IN, BETWEEN, LIKEIN teste l'appartenance à une liste, BETWEEN un intervalle bornes comprises, LIKE un motif de texte avec jokers. Ces trois opérateurs raccourcissent les conditions répétitives de WHERE.
- IS NULL / IS NOT NULLNULL signifie « valeur inconnue » et ne se compare pas avec =. IS NULL et IS NOT NULL sont les seuls tests fiables pour trouver une donnée manquante, comme une classe sans professeur.
- EXISTS & IN (sous-requête)EXISTS vérifie qu'une sous-requête renvoie au moins une ligne, IN qu'une valeur figure dans sa liste. Tous deux répondent à « a-t-il au moins un… ? » sans dupliquer les lignes comme le ferait un JOIN.
- Piège NOT IN et NULLNOT IN renvoie zéro ligne dès que sa sous-requête contient un NULL, sans aucun message d'erreur. Pour chercher des éléments absents d'une autre table, NOT EXISTS donne toujours le bon résultat.
Sous-requêtes & CTE
Requêtes imbriquées, expressions WITH et récursivité.
- Sous-requêtesUne sous-requête est un SELECT placé à l'intérieur d'une autre requête, dans WHERE, FROM ou SELECT. Elle calcule une valeur intermédiaire, comme une moyenne, à laquelle on compare chaque ligne.
- WITH (CTE)Une CTE (WITH) donne un nom à un résultat intermédiaire, utilisable ensuite comme une table dans la requête. On découpe ainsi un calcul complexe en étapes lisibles et vérifiables.
- CTE récursive (WITH RECURSIVE)Une CTE récursive part d'un point de départ puis se rappelle elle-même pour avancer d'un niveau à chaque tour. Elle parcourt une hiérarchie complète ou génère une suite de dates.
Fonctions de fenêtre
Classements, comparaisons et cumuls sans perdre le détail des lignes.
- Fonctions de fenêtre (OVER)Une fonction de fenêtre calcule un agrégat sur un groupe de lignes tout en gardant chaque ligne, à l'inverse de GROUP BY. On compare ainsi chaque salaire à la moyenne de son service.
- ROW_NUMBER, RANK, DENSE_RANKLes fonctions de classement numérotent les lignes selon un tri, éventuellement par groupe. Elles répondent aux questions de type « top N par catégorie » qu'un simple LIMIT ne sait pas traiter.
- LAG, LEAD et cumulsLAG lit la valeur de la ligne précédente, LEAD celle de la suivante, et SUM() OVER (ORDER BY …) calcule un cumul. On compare ainsi une période à la précédente ou on suit un total qui grandit.
Opérations ensemblistes
UNION, INTERSECT, EXCEPT.
- UNION / UNION ALLUNION empile les lignes de deux requêtes compatibles en un seul résultat. UNION supprime les doublons, UNION ALL les garde et va plus vite. Utile pour fusionner des listes de même nature.
- INTERSECT & EXCEPTINTERSECT garde les lignes présentes dans les deux requêtes, EXCEPT celles de la première absentes de la seconde. Idéal pour répondre à « qui est dans cette liste mais pas dans l'autre ? ».
Fonctions SQL
CASE, COALESCE, texte, dates et conversions de type.
- COALESCE & CASECASE introduit une logique « si… alors… sinon » dans une requête, COALESCE renvoie la première valeur non NULL. Ils servent à classer des lignes en catégories ou à remplacer une valeur manquante.
- Fonctions texteLes fonctions texte nettoient, découpent et assemblent les chaînes : mettre en majuscules, retirer des espaces, extraire un domaine d'e-mail. Indispensables avant de comparer ou de dédoublonner.
- Fonctions date & heureSQLite stocke les dates en texte ISO et fournit date(), strftime() et julianday() pour les calculer, les formater et les découper. Base des indicateurs par mois, des délais et des échéances.
- CAST et types de donnéesCAST convertit une valeur d'un type à un autre, typeof() révèle le type réellement stocké. Dans SQLite, où le typage est souple, ils évitent les tris, comparaisons et divisions faussés.
Contraintes & intégrité
Clés primaires, étrangères et validations.
- PRIMARY KEYLa clé primaire identifie chaque ligne de façon unique et stable : jamais deux fois la même valeur, jamais NULL. C'est elle que référencent les clés étrangères des autres tables.
- FOREIGN KEYUne clé étrangère garantit qu'une valeur pointe vers une ligne qui existe dans une autre table, comme l'élève d'une absence. Elle empêche les références orphelines et encadre les suppressions.
- UNIQUE, NOT NULL, CHECKCes contraintes refusent les données invalides dès l'écriture : NOT NULL impose une valeur, UNIQUE interdit les doublons, CHECK valide une règle métier comme une remise comprise entre 1 et 50 %.
Transactions, index & performance
ACID, COMMIT/ROLLBACK, index et plans d'exécution.
- TransactionsUne transaction regroupe plusieurs écritures qui réussissent toutes ou échouent toutes. Une commande et ses lignes, ou un virement entre deux comptes, ne doivent jamais rester à moitié enregistrés.
- CREATE INDEXUn index est une structure triée, comme l'index d'un livre, qui permet de trouver des lignes sans parcourir toute la table. Il accélère lectures et jointures mais ralentit un peu les écritures.
- EXPLAIN QUERY PLANEXPLAIN QUERY PLAN montre comment SQLite compte exécuter une requête : parcours complet de table (SCAN) ou recherche par index (SEARCH). C'est le premier réflexe face à une requête lente.