SELECT
, INSERT
, UPDATE
et DELETE
.SQL est omniprésent dans les systèmes informatiques modernes. Il permet à la fois :
CREATE
, ALTER
, DROP
) ;INSERT
, UPDATE
, DELETE
) ;SELECT
, JOIN
, GROUP BY
, etc.) ;GRANT
, REVOKE
) ;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é).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 |
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.
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).nom
et prenom
: 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 |
+------------+----------+--------+---------------+
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).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');
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.
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.
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.
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é.
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.
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
).
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;
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) |
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.
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
.
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 |
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_etudiants
donne un nom lisible à la colonne résultante.GROUP BY
SELECT idCours, AVG(note) AS moyenne
FROM Inscription
GROUP BY idCours;
Ici, la moyenne est calculée pour chaque cours.
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.
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 :
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)
);
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
.Inscription
que si cette valeur existe déjà dans la table référencée.