PROGRAMME T-SQL — EXERCICES + CORRIGÉS
MODULE 1 — Bases & Requêtes simples
Exercice 1 :
Écrire une requête qui affiche tous les clients inscrits après 2023-01-01.
Correction :
SELECT * FROM Clients WHERE date_inscription > '2023-01-01';
Exercice 2 :
Afficher les clients dont le nom commence par A.
Correction :
SELECT * FROM Clients WHERE nom LIKE 'A%';
Exercice 3 :
Afficher id, nom et ancienneté en années.
Correction :
SELECT id, nom, DATEDIFF(YEAR, date_inscription, GETDATE()) AS Anciennete FROM Clients;
---
MODULE 2 — Jointures
Exercice 1 :
Afficher le nom du client + le montant de chaque commande.
Correction :
SELECT [Link], [Link] FROM Clients c INNER JOIN Commandes cmd ON [Link] = cmd.client_id;
Exercice 2 :
Afficher tous les clients même sans commandes.
Correction :
SELECT [Link], [Link] FROM Clients c LEFT JOIN Commandes cmd ON [Link] = cmd.client_id;
Exercice 3 :
Nom client + pays + montant commande.
Correction :
SELECT [Link] AS Client, [Link] AS Pays, [Link]
FROM Clients c
JOIN Pays p ON c.pays_id = [Link]
LEFT JOIN Commandes cmd ON [Link] = cmd.client_id;
---
MODULE 3 — Agrégations
Exercice 1 :
Total des montants par client.
Correction :
SELECT client_id, SUM(montant) AS Total FROM Commandes GROUP BY client_id;
Exercice 2 :
Clients ayant un total > 10 000.
Correction :
SELECT client_id, SUM(montant) AS Total
FROM Commandes GROUP BY client_id HAVING SUM(montant) > 10000;
Exercice 3 :
Nombre de clients par pays.
Correction :
SELECT pays_id, COUNT(*) AS NbClients FROM Clients GROUP BY pays_id;
---
MODULE 4 — Sous-requêtes & CTE
Exercice 1 :
Clients ayant au moins une commande.
Correction :
SELECT * FROM Clients WHERE id IN (SELECT client_id FROM Commandes);
Exercice 2 :
Pays ayant au moins un client.
Correction :
SELECT * FROM Pays p WHERE EXISTS (SELECT 1 FROM Clients c WHERE c.pays_id = [Link]);
Exercice 3 :
CTE hiérarchie employés.
Correction :
WITH Hierarchie AS (
SELECT id, nom, manager_id, 0 AS Niveau
FROM employes WHERE manager_id IS NULL
UNION ALL
SELECT [Link], [Link], e.manager_id, [Link] + 1
FROM employes e JOIN Hierarchie h ON e.manager_id = [Link]
SELECT * FROM Hierarchie;
---
MODULE 5 — Vues
Exercice :
Créer une vue total commandes par client.
Correction :
CREATE VIEW v_CommandesClients AS
SELECT [Link], SUM([Link]) AS TotalCommandes
FROM Clients c LEFT JOIN Commandes cmd ON [Link] = cmd.client_id
GROUP BY [Link];
---
MODULE 6 — Manipulation (INSERT / UPDATE / MERGE)
Exercice 1 :
Ajouter un client.
Correction :
INSERT INTO Clients(nom, pays_id, date_inscription)
VALUES ('Paul', 2, GETDATE());
Exercice 2 :
Changer pays d’un client.
Correction :
UPDATE Clients SET pays_id = 3 WHERE id = 10;
Exercice 3 :
MERGE Clients / NouveauxClients.
Correction :
MERGE Clients AS cible
USING NouveauxClients AS src ON [Link] = [Link]
WHEN MATCHED THEN UPDATE SET [Link] = [Link]
WHEN NOT MATCHED THEN INSERT (id, nom) VALUES ([Link], [Link]);
---
MODULE 7 — Transactions
Exercice :
Tester ROLLBACK avec erreur.
Correction :
BEGIN TRY
BEGIN TRAN
UPDATE Clients SET pays_id = 1 WHERE id = 7;
UPDATE Commandes SET montant = montant + 100 WHERE client_id = 7;
INSERT INTO Clients(id) VALUES (NULL); -- erreur
COMMIT;
END TRY
BEGIN CATCH
ROLLBACK;
END CATCH;
---
MODULE 8 — Tables temporaires
Exercice :
Clients avec ≥ 2 commandes.
Correction :
SELECT client_id, COUNT(*) AS NbCmd INTO #ClientsActifs
FROM Commandes GROUP BY client_id HAVING COUNT(*) >= 2;
---
MODULE 9 — Procédures & Fonctions
Exercice 1 :
Procédure commandes d’un client.
Correction :
CREATE PROCEDURE sp_GetCommandes @ClientID INT AS
BEGIN SELECT * FROM Commandes WHERE client_id = @ClientID; END;
Exercice 2 :
Fonction commandes montant minimal.
Correction :
CREATE FUNCTION f_CommandesMin(@MontantMin DECIMAL(10,2))
RETURNS TABLE AS RETURN (
SELECT * FROM Commandes WHERE montant > @MontantMin
);
---
MODULE 10 — Triggers
Exercice :
Trigger journal modifications Clients.
Correction :
CREATE TRIGGER trg_LogModifClients ON Clients AFTER UPDATE AS
BEGIN
INSERT INTO LogClients(client_id, ancien_nom, nouveau_nom, date_modif)
SELECT [Link], [Link], [Link], GETDATE()
FROM deleted d JOIN inserted i ON [Link] = [Link];
END;
---
MODULE 11 — Optimisation
Exercice :
Index pour requête filtrant client_id + montant.
Correction :
CREATE INDEX idx_Commandes_Client_Montant
ON Commandes(client_id, montant);