Maîtrise des requêtes SQL fondamentales : SELECT, INSERT, UPDATE, DELETE et toutes les clauses essentielles pour interroger et manipuler les données efficacement.

SELECT - Interroger les données

La commande SELECT est la base de SQL. Elle permet de récupérer des données depuis une ou plusieurs tables.

SELECT simple

SQL
-- Sélectionner toutes les colonnes
SELECT * FROM Customers;

-- Sélectionner des colonnes spécifiques
SELECT CustomerName, Email, City 
FROM Customers;

-- Sélectionner avec alias
SELECT 
    CustomerName AS Nom,
    Email AS Courriel,
    City AS Ville
FROM Customers;

SELECT DISTINCT - Valeurs uniques

SQL
-- Obtenir les villes uniques
SELECT DISTINCT City 
FROM Customers;

-- Combinaisons uniques de plusieurs colonnes
SELECT DISTINCT City, Country 
FROM Customers;
Bonne pratique : Évitez SELECT * en production. Spécifiez toujours les colonnes dont vous avez besoin pour de meilleures performances et une meilleure lisibilité.

WHERE - Filtrer les résultats

La clause WHERE permet de filtrer les lignes selon des conditions.

SQL
-- Condition simple
SELECT * FROM Customers 
WHERE Country = 'Suisse';

-- Plusieurs conditions (AND)
SELECT * FROM Customers 
WHERE Country = 'Suisse' AND City = 'Lausanne';

-- Conditions alternatives (OR)
SELECT * FROM Customers 
WHERE City = 'Lausanne' OR City = 'Genève';

-- Comparaisons numériques
SELECT * FROM Products 
WHERE Price > 100 AND Price <= 500;

-- Vérifier NULL
SELECT * FROM Customers 
WHERE Phone IS NULL;

-- Vérifier NOT NULL
SELECT * FROM Customers 
WHERE Phone IS NOT NULL;

Opérateurs de comparaison

Opérateur Description Exemple
= Égal WHERE Age = 25
!= ou <> Différent WHERE Status != 'Active'
> Supérieur WHERE Price > 100
>= Supérieur ou égal WHERE Quantity >= 10
< Inférieur WHERE Age < 18
<= Inférieur ou égal WHERE Stock <= 5
BETWEEN Entre deux valeurs WHERE Price BETWEEN 10 AND 50
LIKE Correspondance de motif WHERE Name LIKE 'J%'
IN Dans une liste WHERE City IN ('Lausanne', 'Genève')

Opérateur LIKE - Recherche de motifs

SQL
-- Commence par 'A'
SELECT * FROM Customers WHERE Name LIKE 'A%';

-- Se termine par 'son'
SELECT * FROM Customers WHERE Name LIKE '%son';

-- Contient 'tech'
SELECT * FROM Companies WHERE Name LIKE '%tech%';

-- Deuxième lettre est 'a'
SELECT * FROM Customers WHERE Name LIKE '_a%';

-- Exactement 5 caractères
SELECT * FROM Codes WHERE Code LIKE '_____';

ORDER BY - Trier les résultats

ORDER BY permet de trier les résultats par une ou plusieurs colonnes.

SQL
-- Tri ascendant (par défaut)
SELECT * FROM Customers 
ORDER BY CustomerName;

-- Tri descendant
SELECT * FROM Products 
ORDER BY Price DESC;

-- Tri sur plusieurs colonnes
SELECT * FROM Customers 
ORDER BY Country ASC, City ASC, CustomerName ASC;

-- Tri avec alias
SELECT 
    FirstName + ' ' + LastName AS FullName,
    Salary
FROM Employees 
ORDER BY FullName;

TOP / LIMIT - Limiter les résultats

Récupérer un nombre limité de lignes.

SQL
-- SQL Server : TOP
SELECT TOP 10 * 
FROM Products 
ORDER BY Price DESC;

-- MySQL / PostgreSQL : LIMIT
SELECT * FROM Products 
ORDER BY Price DESC 
LIMIT 10;

-- Avec OFFSET (pagination)
SELECT * FROM Products 
ORDER BY ProductID 
OFFSET 20 ROWS 
FETCH NEXT 10 ROWS ONLY;

GROUP BY - Regrouper et agréger

Regrouper les lignes et appliquer des fonctions d'agrégation.

Fonctions d'agrégation

SQL
-- Compter le nombre de clients
SELECT COUNT(*) AS TotalCustomers 
FROM Customers;

-- Compter les valeurs non-NULL
SELECT COUNT(Phone) AS CustomersWithPhone 
FROM Customers;

-- Somme, moyenne, min, max
SELECT 
    COUNT(*) AS NbProduits,
    SUM(Price) AS Total,
    AVG(Price) AS PrixMoyen,
    MIN(Price) AS PrixMin,
    MAX(Price) AS PrixMax
FROM Products;

Regroupement par catégorie

SQL
-- Compter les clients par pays
SELECT 
    Country,
    COUNT(*) AS NbClients
FROM Customers 
GROUP BY Country 
ORDER BY NbClients DESC;

-- Statistiques par catégorie
SELECT 
    CategoryID,
    COUNT(*) AS NbProduits,
    AVG(Price) AS PrixMoyen,
    MAX(Price) AS PrixMax
FROM Products 
GROUP BY CategoryID 
HAVING COUNT(*) > 5;
Attention : Toutes les colonnes dans SELECT doivent être soit dans GROUP BY, soit dans une fonction d'agrégation. Sinon, erreur SQL !

HAVING - Filtrer les groupes

WHERE filtre les lignes AVANT le regroupement, HAVING filtre les groupes APRÈS.

SQL
-- Pays avec plus de 5 clients
SELECT 
    Country,
    COUNT(*) AS NbClients
FROM Customers 
GROUP BY Country 
HAVING COUNT(*) > 5;

-- Catégories avec prix moyen > 100
SELECT 
    CategoryID,
    AVG(Price) AS PrixMoyen
FROM Products 
GROUP BY CategoryID 
HAVING AVG(Price) > 100;

-- Combinaison WHERE et HAVING
SELECT 
    Country,
    COUNT(*) AS NbClients
FROM Customers 
WHERE Active = 1  -- Filtre AVANT regroupement
GROUP BY Country 
HAVING COUNT(*) > 10;  -- Filtre APRÈS regroupement

INSERT - Insérer des données

SQL
-- Insérer une ligne
INSERT INTO Customers (CustomerName, Email, City, Country)
VALUES ('John Doe', 'john@example.com', 'Lausanne', 'Suisse');

-- Insérer plusieurs lignes
INSERT INTO Customers (CustomerName, Email, City, Country)
VALUES 
    ('Alice Smith', 'alice@example.com', 'Genève', 'Suisse'),
    ('Bob Martin', 'bob@example.com', 'Zurich', 'Suisse');

-- Insérer depuis une autre table
INSERT INTO CustomersArchive (CustomerName, Email, City)
SELECT CustomerName, Email, City 
FROM Customers 
WHERE LastOrderDate < '2020-01-01';

UPDATE - Modifier des données

SQL
-- Modifier une ligne spécifique
UPDATE Customers 
SET Email = 'newemail@example.com', 
    City = 'Berne'
WHERE CustomerID = 123;

-- Modifier plusieurs lignes
UPDATE Products 
SET Price = Price * 1.10  -- Augmentation de 10%
WHERE CategoryID = 5;

-- Modifier avec calcul
UPDATE Employees 
SET Salary = Salary * 1.05
WHERE Department = 'IT' AND Salary < 80000;
DANGER : Ne jamais oublier WHERE dans UPDATE ! Sans WHERE, TOUTES les lignes seront modifiées. Toujours tester avec SELECT avant !

DELETE - Supprimer des données

SQL
-- Supprimer une ligne spécifique
DELETE FROM Customers 
WHERE CustomerID = 123;

-- Supprimer plusieurs lignes
DELETE FROM Orders 
WHERE OrderDate < '2020-01-01';

-- Supprimer toutes les lignes (dangereux!)
DELETE FROM TempTable;

-- Alternative plus rapide pour vider une table
TRUNCATE TABLE TempTable;
DANGER : DELETE sans WHERE supprime TOUTES les lignes ! Toujours tester avec SELECT avant. En production, utilisez des transactions.

Ordre d'exécution SQL

Comprendre l'ordre dans lequel SQL exécute les clauses est crucial pour écrire des requêtes correctes.

Ordre Clause Description
1 FROM Identifie la(les) table(s) source
2 JOIN Combine les tables selon les conditions
3 WHERE Filtre les lignes avant regroupement
4 GROUP BY Regroupe les lignes
5 HAVING Filtre les groupes après regroupement
6 SELECT Détermine les colonnes à retourner
7 DISTINCT Élimine les doublons
8 ORDER BY Trie les résultats
9 TOP / LIMIT Limite le nombre de lignes retournées
Pourquoi c'est important : On ne peut pas utiliser un alias défini dans SELECT dans WHERE, car WHERE s'exécute avant SELECT. Par contre, on peut l'utiliser dans ORDER BY !