Les requêtes SQL
- Comprendre le rôle du langage SQL dans la gestion des bases de données relationnelles.
- Créer une base de données et des tables avec des contraintes simples.
- Manipuler les données avec les instructions
SELECT,INSERT,UPDATEetDELETE. - Interroger les données avec des filtres, des tris, des jointures simples et des fonctions d’agrégation.
À quoi sert SQL ?
SQL est omniprésent dans les systèmes informatiques modernes. Il permet à la fois :
- De créer et structurer une base de données (
CREATE,ALTER,DROP) ; - D’ajouter, modifier ou supprimer des données (
INSERT,UPDATE,DELETE) ; - D’interroger et exploiter les données (
SELECT,JOIN,GROUP BY, etc.) ; - De contrôler les accès et la sécurité (
GRANT,REVOKE) ; - De générer des statistiques simples (moyennes, totaux, comptages).
Pourquoi le SQL est-il toujours utilisé aujourd’hui ?
- Standardisé : SQL est un langage reconnu par tous les grands systèmes de gestion de bases de données (MySQL, PostgreSQL, Oracle, SQL Server…).
- Lisible : sa syntaxe proche du langage naturel le rend facilement compréhensible.
- Puissant : il permet de traiter efficacement de très grandes quantités de données.
- Transverse : il est utilisé dans presque tous les métiers liés à la donnée.
- Informatique : authentification, gestion des comptes, suivi des activités utilisateur.
- BTP : planification des interventions, suivi des livraisons, gestion des équipements.
- Énergie : gestion des capteurs, alertes sur la consommation, historique des relevés.
- Transport : géolocalisation des véhicules, affectation des tournées, suivi des colis.
- Industrie : traçabilité des produits, contrôle qualité, gestion de la maintenance.
Types de données courants
| Type SQL | Description |
|---|---|
INT, BIGINT | Nombres entiers (positifs ou négatifs) |
SMALLINT, TINYINT | Entiers de plus petite taille (moins de mémoire utilisée) |
DECIMAL(p,s) | Nombres décimaux précis avec p chiffres au total et s après la virgule |
FLOAT, REAL | Nombres décimaux à virgule flottante (moins précis, plus légers) |
CHAR(n) | Texte fixe de longueur n (utile pour des codes, comme un INSEE) |
VARCHAR(n) | Texte variable jusqu’à n caractères |
TEXT | Texte long (commentaires, descriptions…) |
DATE | Date au format AAAA-MM-JJ |
TIME, DATETIME | Heure seule ou date avec heure |
BOOLEAN | Valeur logique : TRUE ou FALSE |
ENUM(...) | Valeur choisie parmi une liste définie (ex : 'Homme', 'Femme') |
BLOB | Données binaires (images, fichiers, sons…) |
nom VARCHAR(50): chaîne de texte pouvant aller jusqu’à 50 caractères.montant DECIMAL(8,2): valeur numérique avec 6 chiffres avant la virgule et 2 après (ex : 123456.78).sexe ENUM('Homme', 'Femme', 'Autre'): contraint la valeur à une liste prédéfinie.codePostal CHAR(5): champ texte fixe pour un code à 5 chiffres.photo BLOB: stocke une image en base de données (rarement conseillé).
Familles de commandes SQL
Le langage SQL est divisé en plusieurs familles de commandes, selon leur rôle dans la gestion d’une base de données relationnelle.
| Catégorie | Signification | Exemples |
|---|---|---|
| DDL (Data Definition Language) | Sert à définir ou modifier la structure des objets de la base (tables, vues, clés...). | CREATE TABLE, ALTER, DROP |
| DML (Data Manipulation Language) | Sert à ajouter, modifier ou supprimer des données dans les tables. | INSERT, UPDATE, DELETE |
| DQL (Data Query Language) | Sert à interroger les données pour les lire ou les analyser. | SELECT |
| DCL (Data Control Language) | Sert à gérer les permissions et la sécurité d’accès aux données. | GRANT, REVOKE |
- DDL : Créer une nouvelle table dans la base.
- DML : Ajouter un étudiant ou modifier son prénom.
- DQL : Rechercher tous les étudiants nés après 2001.
- DCL : Donner à un utilisateur le droit de modifier la table `Etudiant`.
Structure d'une base de données
Création d’une base de données
CREATE DATABASE Ecole;
USE Ecole;
CREATE DATABASE crée une base nommée Ecole. La commande USE permet de travailler à l’intérieur de cette base.Création d’une table
CREATE TABLE Etudiant (
idEtudiant INT PRIMARY KEY,
nom VARCHAR(50),
prenom VARCHAR(50),
dateNaissance DATE
);
PRIMARY KEY signifie que la colonne idEtudiant est unique et obligatoire pour chaque ligne. Elle sert à identifier de manière sûre un enregistrement.idEtudiant: un entier (identifiant unique).nometprenom: des textes de longueur maximale 50 caractères.dateNaissance: une date (au format AAAA-MM-JJ).
+------------+----------+--------+---------------+
| idEtudiant | nom | prenom | dateNaissance |
+------------+----------+--------+---------------+
| 1 | Martin | Alice | 2001-05-12 |
| 2 | Durand | Lucas | 2000-11-03 |
+------------+----------+--------+---------------+
Ajout d’une contrainte sur une colonne
On peut ajouter d'autres contraintes, par exemple rendre une colonne obligatoire :
CREATE TABLE Cours (
idCours INT PRIMARY KEY,
intitule VARCHAR(100) NOT NULL,
volumeHoraire INT CHECK (volumeHoraire > 0)
);
NOT NULL: le champ ne peut pas rester vide.CHECK: impose une condition logique (ici, un volume horaire strictement positif).
Manipuler les données avec SQL
Insertion de données : INSERT
INSERT INTO Etudiant (idEtudiant, nom, prenom, dateNaissance)
VALUES (1, 'Durand', 'Claire', '2001-03-25');
Etudiant, en précisant les colonnes concernées et les valeurs associées.Insérer plusieurs lignes à la fois :
INSERT INTO Etudiant (idEtudiant, nom, prenom, dateNaissance)
VALUES
(2, 'Dupont', 'Pierre', '2000-05-12'),
(3, 'Martin', 'Sophie', '2002-07-18');
Sans nommer les colonnes (déconseillé) :
INSERT INTO Etudiant
VALUES (4, 'Lefevre', 'Luc', '2001-11-30');
Lecture des données : SELECT
SELECT nom, prenom
FROM Etudiant
WHERE dateNaissance > '2001-01-01'
ORDER BY nom ASC;
SELECT permet d’afficher les données souhaitées. Ici, on affiche les colonnes nom et prenom des étudiants nés après le 1er janvier 2001, triés par nom croissant.Afficher toutes les colonnes :
SELECT * FROM Etudiant;
Filtrer un nom précis :
SELECT prenom
FROM Etudiant
WHERE nom = 'Dupont';
SELECT * dans les applications : cela surcharge inutilement les requêtes. - Utilisez des **filtres** pour limiter le volume de données retourné. - Triez avec ORDER BY pour faciliter la lecture des résultats.Mise à jour : UPDATE
UPDATE Etudiant
SET nom = 'Dupond'
WHERE nom = 'Dupont';
Dupont pour le changer en Dupond.WHERE pour éviter de modifier **toutes les lignes** de la table accidentellement.Suppression : DELETE
DELETE FROM Etudiant
WHERE nom = 'Lefevre';
Lefevre.Supprimer toutes les données de la table (⚠️ dangereux) :
DELETE FROM Etudiant;
WHERE, la commande DELETE supprime toutes les lignes de la table. Utilisez-la uniquement en connaissance de cause.Requêtes avec jointures
Une jointure permet de combiner des données provenant de plusieurs tables. Cela est essentiel dans une base de données relationnelle, où les informations sont souvent réparties sur plusieurs tables. Il existe différents types de jointures, selon le résultat souhaité.
Jointure interne (INNER JOIN ou JOIN)
La jointure interne ne conserve que les lignes qui ont des correspondances dans toutes les tables jointées. C'est à dire, elle ne retourne que les enregistrements qui existent dans les deux tables. C'est le type de jointure le plus courant.
SELECT e.nom, c.intitule
FROM Etudiant e
JOIN Inscription i ON e.idEtudiant = i.idEtudiant
JOIN Cours c ON i.idCours = c.idCours;
JOIN (ou INNER JOIN) ne conserve que les lignes présentes dans toutes les tables jointes. Si un étudiant n’a pas d’inscription, il n’apparaîtra pas dans le résultat.Jointure externe gauche (LEFT JOIN)
La jointure externe gauche conserve toutes les lignes de la première table (à gauche) et les lignes correspondantes de la seconde table (à droite). Si aucune correspondance n'est trouvée, les colonnes de la seconde table contiendront des valeurs nulles.
SELECT e.nom, c.intitule
FROM Etudiant e
LEFT JOIN Inscription i ON e.idEtudiant = i.idEtudiant
LEFT JOIN Cours c ON i.idCours = c.idCours;
LEFT JOIN conserve toutes les lignes de gauche (`Etudiant`), même si elles n'ont pas de correspondance dans la table droite. Cela permet de voir les étudiants même sans cours inscrit (le champ `intitule` sera alors NULL).Jointure avec filtres
Il est possible d'ajouter des filtres dans la clause WHERE pour restreindre les résultats. Par exemple, pour ne garder que les cours de plus de 20 heures :
SELECT e.nom, c.intitule
FROM Etudiant e
JOIN Inscription i ON e.idEtudiant = i.idEtudiant
JOIN Cours c ON i.idCours = c.idCours
WHERE c.volumeHoraire > 20;
Résumé des types de jointures
| Type de jointure | Résultat attendu |
|---|---|
INNER JOIN | Correspondances exactes dans toutes les tables |
LEFT JOIN | Toutes les lignes de gauche, même sans correspondance |
RIGHT JOIN | Toutes les lignes de droite (rarement utilisé) |
FULL JOIN | Toutes les lignes des deux tables (non supporté par MySQL) |
Requêtes avec agrégats
Les fonctions d’agrégation permettent de faire des calculs sur plusieurs lignes d’une table. Elles sont très utiles pour obtenir des statistiques ou des résumés de données.
Exemple simple
SELECT AVG(note) AS moyenne, COUNT(*) AS nb_inscrits
FROM Inscription
WHERE idCours = 1;
Cette requête retourne la moyenne des notes et le nombre d'inscrits pour le cours dont l'identifiant est 1.
Fonctions d’agrégation utiles
| Fonction | Rôle |
|---|---|
AVG() | Calcule la moyenne |
SUM() | Fait la somme des valeurs |
COUNT() | Compte le nombre de lignes |
MAX() | Renvoie la valeur maximale |
MIN() | Renvoie la valeur minimale |
Renommer une colonne avec AS
AS permet de donner un alias (nom temporaire) à une colonne ou une expression dans le résultat d’une requête.SELECT COUNT(*) AS total_etudiants
FROM Etudiant;
AS total_etudiantsdonne un nom lisible à la colonne résultante.- C’est utile notamment pour les fonctions d’agrégation qui n’ont pas de nom par défaut.
Regrouper des résultats : GROUP BY
SELECT idCours, AVG(note) AS moyenne
FROM Inscription
GROUP BY idCours;
Ici, la moyenne est calculée pour chaque cours.
Filtrer les groupes : HAVING
SELECT idCours, AVG(note) AS moyenne
FROM Inscription
GROUP BY idCours
HAVING AVG(note) > 12;
Cette requête retourne les cours dont la moyenne des notes est strictement supérieure à 12.
HAVING ?HAVING permet de filtrer les résultats après un GROUP BY, là où WHERE filtre les lignes avant regroupement.Exemple complet
SELECT c.intitule, COUNT(*) AS nb_etudiants, AVG(i.note) AS moyenne
FROM Cours c
JOIN Inscription i ON c.idCours = i.idCours
GROUP BY c.intitule
HAVING AVG(i.note) >= 10
ORDER BY moyenne DESC;
Cette requête :
- Affiche chaque cours avec le nombre d’étudiants inscrits et la moyenne des notes,
- Ne garde que les cours avec une moyenne ≥ 10,
- Trie les résultats par moyenne décroissante.
Créer une table avec une clé étrangère
CREATE TABLE Inscription (
idEtudiant INT,
idCours INT,
note DECIMAL(4,2),
PRIMARY KEY (idEtudiant, idCours),
FOREIGN KEY (idEtudiant) REFERENCES Etudiant(idEtudiant),
FOREIGN KEY (idCours) REFERENCES Cours(idCours)
);
idEtudiantetidCoursforment ensemble une clé primaire composite, garantissant qu’un étudiant ne peut s’inscrire qu’une seule fois à un même cours.FOREIGN KEYétablit des liens avec d'autres tables :idEtudiantfait référence à la tableEtudiant,idCoursfait référence à la tableCours.
Inscription que si cette valeur existe déjà dans la table référencée.