logo

Les requêtes SQL

Objectifs Pédagogiques
  • 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, UPDATE et DELETE.
  • Interroger les données avec des filtres, des tris, des jointures simples et des fonctions d’agrégation.

À quoi sert SQL ?

Définition
SQL (Structured Query Language) est un langage déclaratif utilisé pour interagir avec des bases de données relationnelles. Il permet de définir des structures, de manipuler des données, et d’interroger des informations rapidement et efficacement.

SQL est omniprésent dans les systèmes informatiques modernes. Il permet à la fois :

Pourquoi le SQL est-il toujours utilisé aujourd’hui ?

Exemples d'application
  • 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.
À retenir
SQL est un outil essentiel pour manipuler et exploiter efficacement des données relationnelles. Il est utilisé dans tous les secteurs d’activité, quel que soit le volume ou le type d'information à gérer.

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…)
Exemples
  • 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é).
À retenir
Le bon choix du type de donnée permet d’optimiser la performance, la clarté et la fiabilité de la base. Par exemple : ne stockez pas des nombres dans des champs texte, et limitez la taille des chaînes de caractères.

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
Exemples par usage
  • 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`.
À retenir
Les commandes DML et DQL sont les plus courantes pour interagir avec les données au quotidien. Les commandes DDL et DCL sont essentielles pour la structure et la sécurité de la base.

Structure d'une base de données

Création d’une base de données

CREATE DATABASE Ecole;
USE Ecole;
Explication
La commande 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
);
Clé primaire
PRIMARY KEY signifie que la colonne idEtudiant est unique et obligatoire pour chaque ligne. Elle sert à identifier de manière sûre un enregistrement.
Structure
Chaque champ correspond à une colonne :
  • idEtudiant : un entier (identifiant unique).
  • nom et prenom : des textes de longueur maximale 50 caractères.
  • dateNaissance : une date (au format AAAA-MM-JJ).
Exemple
Une fois la table créée, vous pourrez y stocker des données comme :

+------------+----------+--------+---------------+
| 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)
);
Contraintes supplémentaires
  • NOT NULL : le champ ne peut pas rester vide.
  • CHECK : impose une condition logique (ici, un volume horaire strictement positif).
À retenir
Bien définir ses contraintes dès la création des tables permet de garantir la cohérence et la qualité des données dans la base.

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');
Explication
On insère ici une ligne dans la table 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');
À retenir
Il est toujours préférable de **préciser les colonnes** dans l'ordre d'insertion. Cela rend le code plus lisible, robuste et évite des erreurs en cas de changement dans la structure de la table.

Lecture des données : SELECT

SELECT nom, prenom
FROM Etudiant
WHERE dateNaissance > '2001-01-01'
ORDER BY nom ASC;
Explication
La commande 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';
Bonnes pratiques
- Évitez d’utiliser 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';
Explication
On modifie ici tous les étudiants portant le nom Dupont pour le changer en Dupond.
À retenir
Toujours utiliser WHERE pour éviter de modifier **toutes les lignes** de la table accidentellement.

Suppression : DELETE

DELETE FROM Etudiant
WHERE nom = 'Lefevre';
Explication
Supprime uniquement l'étudiant dont le nom est Lefevre.

Supprimer toutes les données de la table (⚠️ dangereux) :

DELETE FROM Etudiant;
Attention
Sans clause 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;
Explication
Cette requête retourne la liste des étudiants inscrits avec les cours auxquels ils participent. Elle s’appuie sur deux jointures : - Entre `Etudiant` et `Inscription` via `idEtudiant` - Entre `Inscription` et `Cours` via `idCours` Les tables sont reliées par leurs clés primaires / étrangères.
Jointure interne
Une 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;
Jointure externe
Une 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)
À retenir
- Les jointures permettent de croiser les informations de plusieurs tables. - Il est essentiel de bien utiliser les **clés étrangères** pour relier les données. - Utilisez `LEFT JOIN` pour conserver les lignes même sans correspondance.

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

Définition
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;
À retenir
- `AS` n'est pas obligatoire mais recommandé pour la lisibilité. - Cela ne modifie pas le nom réel de la colonne dans la base. - On peut aussi utiliser un alias sans `AS`, mais cela nuit à la clarté.

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.

À quoi sert 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 :

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)
);
Explication
Cette table permet de gérer les inscriptions des étudiants à des cours.
  • idEtudiant et idCours forment 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 :
    • idEtudiant fait référence à la table Etudiant,
    • idCours fait référence à la table Cours.
À retenir
Une clé étrangère (foreign key) permet de garantir l'intégrité référentielle entre deux tables : on ne peut insérer une valeur dans la table Inscription que si cette valeur existe déjà dans la table référencée.
Exemple concret
On ne peut pas inscrire un étudiant (id = 99) à un cours (id = 42) si cet étudiant ou ce cours n’existent pas déjà dans leurs tables respectives.

Ressources complémentaires