SQL

BTS SIO - Fiche de Révision Requêtes SQL

1 Commandes de base (DML)

SELECT - Sélectionner des données

SELECT colonne1, colonne2 FROM table;
SELECT * FROM clients; -- Toutes les colonnes
SELECT DISTINCT ville FROM clients; -- Sans doublons

INSERT - Insérer des données

INSERT INTO clients (nom, prenom, ville) VALUES ('Dupont', 'Jean', 'Paris');

UPDATE - Modifier des données

UPDATE clients SET ville = 'Lyon' WHERE id = 5;

DELETE - Supprimer des données

DELETE FROM clients WHERE ville = 'Paris';

2 Clause WHERE - Filtrer les données

SELECT * FROM produits WHERE prix > 50;
SELECT * FROM produits WHERE prix > 50 AND stock > 0;
SELECT * FROM produits WHERE prix BETWEEN 10 AND 50;
SELECT * FROM clients WHERE ville IN ('Paris', 'Lyon', 'Marseille');
SELECT * FROM clients WHERE nom LIKE 'Dup%'; -- Commence par "Dup"
SELECT * FROM clients WHERE email IS NULL;

3 Tri et limitation

ORDER BY - Trier les résultats

SELECT * FROM produits ORDER BY prix ASC; -- Ordre croissant (par défaut)
SELECT * FROM produits ORDER BY prix DESC; -- Ordre décroissant
SELECT * FROM clients ORDER BY ville ASC, nom ASC; -- Tri multiple

LIMIT - Limiter le nombre de résultats

SELECT * FROM produits ORDER BY prix DESC LIMIT 5; -- Les 5 produits les plus chers

4 Fonctions d'agrégation

SELECT COUNT(*) FROM clients;
SELECT SUM(prix) AS total FROM commandes;
SELECT AVG(prix) AS prix_moyen FROM produits;
SELECT MAX(prix), MIN(prix) FROM produits;

5 GROUP BY et HAVING

GROUP BY - Regroupement

SELECT ville, COUNT(*) AS nb_clients FROM clients GROUP BY ville;
📊 Résultat exemple :
ville nb_clients
Paris 25
Lyon 18
Marseille 12

HAVING - Filtrer les groupes

SELECT ville, COUNT(*) AS nb_clients FROM clients GROUP BY ville HAVING COUNT(*) > 10; -- Uniquement les villes avec plus de 10 clients

6 Jointures (JOINS)

INNER JOIN - Jointure interne

Retourne uniquement les lignes qui ont une correspondance dans les deux tables.

SELECT clients.nom, commandes.numero FROM clients INNER JOIN commandes ON clients.id = commandes.client_id;

LEFT JOIN - Jointure externe gauche

Retourne toutes les lignes de la table de gauche + les correspondances de droite.

SELECT clients.nom, commandes.numero FROM clients LEFT JOIN commandes ON clients.id = commandes.client_id; -- Inclut les clients sans commande (NULL)

RIGHT JOIN - Jointure externe droite

Retourne toutes les lignes de la table de droite + les correspondances de gauche.

SELECT clients.nom, commandes.numero FROM clients RIGHT JOIN commandes ON clients.id = commandes.client_id;

Jointures multiples

SELECT c.nom, cmd.numero, p.libelle FROM clients c INNER JOIN commandes cmd ON c.id = cmd.client_id INNER JOIN produits p ON cmd.produit_id = p.id;

7 Sous-requêtes

Sous-requête dans WHERE

SELECT nom FROM produits WHERE prix > (SELECT AVG(prix) FROM produits); -- Produits plus chers que la moyenne

Sous-requête avec IN

SELECT nom FROM clients WHERE id IN ( SELECT client_id FROM commandes WHERE date > '2024-01-01' );

Sous-requête dans SELECT

SELECT nom, prix, (SELECT AVG(prix) FROM produits) AS prix_moyen FROM produits;

8 Définition de données (DDL)

CREATE TABLE - Créer une table

CREATE TABLE clients ( id INT PRIMARY KEY AUTO_INCREMENT, nom VARCHAR(50) NOT NULL, prenom VARCHAR(50), email VARCHAR(100) UNIQUE, date_inscription DATE DEFAULT CURRENT_DATE );

Contraintes importantes

Clé étrangère (FOREIGN KEY)

CREATE TABLE commandes ( id INT PRIMARY KEY AUTO_INCREMENT, client_id INT, date_commande DATE, FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE CASCADE ON UPDATE CASCADE );

ALTER TABLE - Modifier une table

ALTER TABLE clients ADD COLUMN telephone VARCHAR(15);
ALTER TABLE clients DROP COLUMN telephone;
ALTER TABLE clients MODIFY COLUMN nom VARCHAR(100);

DROP TABLE - Supprimer une table

DROP TABLE clients;

9 Transactions et vues

Transactions - Garantir l'intégrité

START TRANSACTION; UPDATE comptes SET solde = solde - 100 WHERE id = 1; UPDATE comptes SET solde = solde + 100 WHERE id = 2; COMMIT; -- Valide la transaction -- OU ROLLBACK; -- Annule la transaction

Vues (VIEWS)

Table virtuelle basée sur une requête SQL.

CREATE VIEW clients_actifs AS SELECT nom, prenom, email FROM clients WHERE actif = 1;
SELECT * FROM clients_actifs; -- Utiliser la vue
DROP VIEW clients_actifs; -- Supprimer la vue

10 Index et performances

Index - Accélérer les requêtes

Créer un index pour optimiser les recherches sur une colonne.

CREATE INDEX idx_nom ON clients(nom);
CREATE INDEX idx_ville_nom ON clients(ville, nom); -- Index composite (multiple colonnes)
DROP INDEX idx_nom ON clients;

💡 Conseils et pièges à éviter