Chapitre 227 minDébutant
Aide-mémoire : les commandes SQL
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- retrouver vite la syntaxe de chaque instruction ;
- retenir l'ordre d'évaluation d'une requête ;
- comprendre les messages d'erreur fréquents.
Cet aide-mémoire SQL rassemble sur une page la syntaxe des commandes, l'ordre d'écriture et d'évaluation d'une requête, les types et les fonctions de MySQL les plus utilisés, et les messages d'erreur fréquents. Chaque commande est détaillée dans son chapitre : CREATE TABLE, INSERT, UPDATE et DELETE, SELECT, jointures, GROUP BY, transactions et GRANT.
Syntaxe des instructions
-- Syntaxe : structure
CREATE DATABASE nom CHARACTER SET utf8mb4;
CREATE TABLE t (
id INT AUTO_INCREMENT PRIMARY KEY,
col TYPE [NOT NULL] [DEFAULT v] [UNIQUE],
CONSTRAINT ck_t CHECK (condition),
CONSTRAINT fk_t FOREIGN KEY (col) REFERENCES parent (id) ON DELETE {RESTRICT | CASCADE | SET NULL}
);
ALTER TABLE t ADD COLUMN col TYPE; ALTER TABLE t MODIFY COLUMN col TYPE NOT NULL;
ALTER TABLE t RENAME COLUMN a TO b; ALTER TABLE t DROP COLUMN col;
ALTER TABLE t ADD CONSTRAINT ... ; ALTER TABLE t DROP FOREIGN KEY fk_t;
DROP TABLE IF EXISTS t; TRUNCATE TABLE t;
CREATE INDEX idx ON t (col1, col2); DROP INDEX idx ON t;
CREATE [OR REPLACE] VIEW v AS SELECT ... [WITH CHECK OPTION]; DROP VIEW v;
-- Syntaxe : données
INSERT INTO t (c1, c2) VALUES (v1, v2), (v3, v4);
INSERT INTO t (c1, c2) SELECT ... ;
INSERT INTO t (c1, c2) VALUES (v1, v2) AS n ON DUPLICATE KEY UPDATE c2 = n.c2;
UPDATE t SET c1 = v1, c2 = c2 + 1 WHERE condition;
DELETE FROM t WHERE condition;
-- Syntaxe : lecture
[WITH cte AS (SELECT ...)]
SELECT [DISTINCT] expr [AS alias], ...
FROM t1 a
[INNER | LEFT] JOIN t2 b ON b.cle = a.cle
WHERE condition_sur_les_lignes
GROUP BY colonnes
HAVING condition_sur_les_groupes
ORDER BY expr [ASC | DESC], ...
LIMIT n [OFFSET m];
-- Ensembles : requête1 UNION [ALL] | INTERSECT | EXCEPT requête2
-- Fenêtre : fonction() OVER (PARTITION BY ... ORDER BY ...)
-- Syntaxe : transactions et droits
START TRANSACTION; SAVEPOINT s; ROLLBACK TO SAVEPOINT s; COMMIT; ROLLBACK;
SELECT ... FOR UPDATE;
CREATE USER 'u'@'hote' IDENTIFIED BY 'mot de passe';
GRANT SELECT, INSERT ON base.table TO 'u'@'hote';
GRANT SELECT (col1, col2) ON base.table TO 'u'@'hote';
REVOKE INSERT ON base.table FROM 'u'@'hote';
CREATE ROLE 'r'; GRANT 'r' TO 'u'@'hote'; SET DEFAULT ROLE ALL TO 'u'@'hote';
SHOW GRANTS FOR 'u'@'hote';
Ordre d'écriture, ordre d'évaluation
| Ordre d'écriture | Clause | Ordre d'évaluation |
|---|---|---|
| 1 | SELECT (et DISTINCT) | 5 (puis 6 pour DISTINCT) |
| 2 | FROM et JOIN … ON | 1 |
| 3 | WHERE | 2 |
| 4 | GROUP BY | 3 |
| 5 | HAVING | 4 |
| 6 | ORDER BY | 7 |
| 7 | LIMIT / OFFSET | 8 |
Types et fonctions les plus utilisés
| Besoin | Type MySQL |
|---|---|
| Identifiant | INT AUTO_INCREMENT |
| Montant | DECIMAL(10,2) |
| Texte court | VARCHAR(n) |
| Code de longueur fixe | CHAR(n) |
| Texte long | TEXT |
| Date / date et heure | DATE / DATETIME |
| Booléen | BOOLEAN (TINYINT(1)) |
| Donnée chiffrée | VARBINARY(n) |
| Famille | Fonctions |
|---|---|
| Agrégats | COUNT(*), COUNT(col), COUNT(DISTINCT col), SUM, AVG, MIN, MAX, GROUP_CONCAT |
| Chaînes | CONCAT, CONCAT_WS, UPPER, LOWER, SUBSTRING, CHAR_LENGTH, TRIM, REPLACE, LPAD |
| Nombres | ROUND, TRUNCATE, CEIL, FLOOR, MOD, ABS |
| Dates | NOW, CURDATE, YEAR, MONTH, DATEDIFF, TIMESTAMPDIFF, DATE_ADD, DATE_SUB, DATE_FORMAT, STR_TO_DATE |
| Conditions | CASE WHEN … THEN … ELSE … END, COALESCE, IFNULL, NULLIF, IF |
| Fenêtres | ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD, SUM(...) OVER (...) |
Messages d'erreur fréquents
| Code | Message (début) | Cause | Remède |
|---|---|---|---|
| 1045 | Access denied for user | Mauvais compte, mot de passe ou hôte | Vérifier le couple utilisateur et hôte |
| 1052 | Column '...' in field list is ambiguous | Colonne présente dans deux tables jointes | Préfixer par l'alias de table |
| 1054 | Unknown column '...' | Faute de frappe, ou alias utilisé dans WHERE | Vérifier le schéma, répéter l'expression |
| 1055 | ... isn't in GROUP BY ou Expression #n of SELECT list is not in GROUP BY clause | Colonne non regroupée et non agrégée | L'ajouter au GROUP BY ou l'agréger |
| 1062 | Duplicate entry '...' for key '...' | Doublon sur une clé primaire ou UNIQUE | Changer la valeur, ou ON DUPLICATE KEY UPDATE |
| 1064 | You have an error in your SQL syntax | Faute de syntaxe | Regarder juste avant le texte cité après near |
| 1093 | You can't specify target table '...' for update in FROM clause | Sous-requête sur la table modifiée | Passer par une table dérivée |
| 1111 | Invalid use of group function | Agrégat dans WHERE | HAVING |
| 1142 | ... command denied to user | Privilège manquant | GRANT, ou revoir le besoin |
| 1146 | Table '...' doesn't exist | Mauvaise base courante, faute de frappe | USE base;, vérifier le nom |
| 1175 | You are using safe update mode | UPDATE ou DELETE sans WHERE sur une clé | Ajouter un WHERE précis |
| 1205 | Lock wait timeout exceeded | Ligne verrouillée trop longtemps par une autre transaction | Raccourcir les transactions, rejouer |
| 1213 | Deadlock found when trying to get lock | Interblocage, transaction annulée | Rejouer la transaction |
| 1242 | Subquery returns more than 1 row | Sous-requête scalaire à plusieurs lignes | IN, ou agrégat |
| 1364 | Field '...' doesn't have a default value | Colonne obligatoire absente de l'INSERT | La fournir, ou lui donner un DEFAULT |
| 1406 | Data too long for column '...' | Valeur trop longue pour le type | Agrandir la colonne ou vérifier la saisie |
| 1451 | Cannot delete or update a parent row | Ligne encore référencée par une clé étrangère | Traiter les lignes enfants, ou revoir ON DELETE |
| 1452 | Cannot add or update a child row | Clé étrangère vers une ligne inexistante | Créer le parent d'abord, vérifier la valeur |
| 3819 | Check constraint '...' is violated | Condition CHECK fausse | Corriger la valeur |