MySQL : requêtes SQL
Requêtes courantes sur les tables clients et commandes de la page Bases et tables.
INSERT INTO clients (nom, email, ville) VALUES ('Alice Martin', 'alice@exemple.com', 'Lyon');
INSERT INTO clients (nom, email, ville) VALUES ('Bruno Durand', 'bruno@exemple.com', 'Paris'), ('Chloé Petit', 'chloe@exemple.com', 'Lyon'), ('David Moreau', 'david@exemple.com', NULL);
INSERT INTO commandes (client_id, montant, statut) VALUES (1, 49.90, 'payee'), (1, 120.00, 'nouvelle'), (2, 15.50, 'payee'), (3, 300.00, 'expediee');
SELECT LAST_INSERT_ID(); -- identifiant de la dernière insertionLire des données
Section intitulée « Lire des données »SELECT * FROM clients;SELECT nom, ville FROM clients WHERE ville = 'Lyon';SELECT nom FROM clients WHERE ville IS NULL;SELECT nom FROM clients WHERE nom LIKE 'A%'; -- commence par ASELECT nom FROM clients WHERE ville IN ('Lyon', 'Paris');SELECT id, montant FROM commandes WHERE montant BETWEEN 20 AND 200;SELECT DISTINCT ville FROM clients;SELECT nom FROM clients ORDER BY nom DESC LIMIT 2;SELECT nom FROM clients ORDER BY nom LIMIT 2 OFFSET 2; -- paginationSELECT COUNT(*) AS nb FROM clients;Modifier et supprimer
Section intitulée « Modifier et supprimer »UPDATE clients SET ville = 'Marseille' WHERE email = 'david@exemple.com';UPDATE commandes SET statut = 'payee' WHERE id = 2;DELETE FROM commandes WHERE statut = 'annulee';Jointures
Section intitulée « Jointures »-- INNER JOIN : uniquement les clients qui ont des commandesSELECT c.nom, o.montant, o.statutFROM clients cJOIN commandes o ON o.client_id = c.idORDER BY c.nom;
-- LEFT JOIN : tous les clients, même sans commandeSELECT c.nom, COUNT(o.id) AS nb_commandesFROM clients cLEFT JOIN commandes o ON o.client_id = c.idGROUP BY c.id, c.nom;Agrégats
Section intitulée « Agrégats »SELECT statut, COUNT(*) AS nb, SUM(montant) AS total, ROUND(AVG(montant), 2) AS moyenneFROM commandesGROUP BY statutORDER BY total DESC;
SELECT client_id, SUM(montant) AS totalFROM commandesGROUP BY client_idHAVING SUM(montant) > 100; -- HAVING filtre après regroupementSous-requêtes et expressions de table
Section intitulée « Sous-requêtes et expressions de table »SELECT nom FROM clientsWHERE id IN (SELECT client_id FROM commandes WHERE montant > 100);
WITH totaux AS ( SELECT client_id, SUM(montant) AS total FROM commandes GROUP BY client_id)SELECT c.nom, t.totalFROM totaux tJOIN clients c ON c.id = t.client_idORDER BY t.total DESC;Fonctions de fenêtre
Section intitulée « Fonctions de fenêtre »SELECT id, client_id, montant, SUM(montant) OVER (PARTITION BY client_id ORDER BY id) AS cumul_client, RANK() OVER (ORDER BY montant DESC) AS rangFROM commandes;Dates et chaînes
Section intitulée « Dates et chaînes »SELECT NOW(), CURDATE(), DATE_FORMAT(NOW(), '%d/%m/%Y %H:%i');SELECT * FROM commandes WHERE passee_le >= NOW() - INTERVAL 7 DAY;SELECT UPPER(nom), CONCAT(nom, ' <', email, '>') FROM clients;SELECT COALESCE(ville, 'inconnue') AS ville FROM clients; -- remplace NULLInsérer ou mettre à jour (upsert)
Section intitulée « Insérer ou mettre à jour (upsert) »INSERT INTO clients (nom, email, ville) VALUES ('Alice Martin', 'alice@exemple.com', 'Nice')ON DUPLICATE KEY UPDATE ville = VALUES(ville);Si l’e-mail existe déjà (clé unique), la ville est mise à jour au lieu de provoquer une erreur.
Transactions
Section intitulée « Transactions »Un groupe d’opérations qui réussit ou échoue en bloc :
START TRANSACTION;UPDATE commandes SET statut = 'payee' WHERE id = 2;INSERT INTO commandes (client_id, montant, statut) VALUES (2, 10.00, 'nouvelle');COMMIT; -- valide-- ROLLBACK; -- annule tout depuis START TRANSACTIONHors transaction, chaque instruction est validée immédiatement (autocommit).
Expliquer une requête
Section intitulée « Expliquer une requête »EXPLAIN SELECT * FROM commandes WHERE statut = 'payee';Voir Index et performances.
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Manuel : SELECT