Le SQL
Le Structured Query Language
(SQL) est un langage formalisé pour l'exploitation des bases des données.
Il a été mis au point en 1974 par IBM, et n'a pas connu énormément de modifications au fil des années. La dernière version date de 2016, et une version de 2023 semble se profiler.
Ce langage a été normalisé sous le nom ISO/CEI 9075
.
Le SQL est donc un langage permettant de formuler ce que l'on appelle des requêtes
, celles-ci effectuant donc des opérations dans les bases de données.
Parmi les opérations, on retrouve :
- La recherche d'informations ;
- La modification d'informations ;
- La suppression d'informations ;
- L'ajout d'informations.
Chacune de ces requêtes s'écrit différemment, avec leurs propres mot-clés
, et un ordre à respecter.
Chercher des données
L'opération à effectuer consiste à sélectionner des données.
Dans une table
On a la structure suivante :
SELECT attribut1, attribut2...
FROM nom_table
WHERE condition1 and/or condition2...
- SELECT : permet de choisir les attributs que l'on souhaite afficher ;
- FROM : on choisit la table d'où provien(ne)t le(s) attribut(s) ;
- WHERE : optionnel, permet de choisir spécifiquement des enregistrements grâce à des conditions.
Si l'on souhaite afficher tous les attributs d'une table dans le SELECT, on utilise le symbole *
:
SELECT *
FROM table
Cette instruction permet d'afficher tous les enregistrements d'une table.
Exemple
id | marque | modèle | couleur | immatriculation | nom_proprio | ville_proprio |
---|---|---|---|---|---|---|
1 | Renault | Clio | Rouge | AA123AA | Bernier | Paris |
2 | Peugeot | 807 | Bleu | AB123NB | Boscolo | Metz |
3 | Porsche | Cayenne | Noir | DE001TR | Dupont | Lille |
4 | Renault | Twingo | Jaune | ZX987FR | Grimard | Nantes |
- On souhaite afficher le nom des modèles de toutes les Renault :
SELECT modèle
FROM voitures
WHERE marque = "Renault"
On choisit d'afficher seulement les informations de l'attribut "modèle" de la table "voitures" dont l'information de l'attribut "marque" de tous les enregistrements vaut "Renault".
- On souhaite afficher toutes les informations des propriétaires habitant Metz et Lille :
SELECT *
FROM voitures
WHERE ville_proprio = "Metz" and ville_proprio = "Lille"
Dans plusieurs tables (jointure)
On a la structure suivante :
SELECT table1.attribut1, table2.attribut2...
FROM table1 JOIN table2 ON (table1.attribut_cle_primaire = table2.attribut_cle_etrangere)
WHERE condition1 and/or condition2...
On effectue ici ce que l'on appelle une JOINTURE
, c'est-à-dire que l'on lie 2 (ou plusieurs) tables suivant un attribut commun (qui est la clé primaire de l'une et la clé étrangère de l'autre). Il existe plusieurs types de jointure. Celle-ci s'appelle inner join
, ou jointure interne.
Les jointures permettent donc, à partir d'une table, d'obtenir des informations liées d'une autre table.
Exemple
On dispose des 2 tables suivantes :
Produits
idProduit | nomProduit | prix |
---|---|---|
1 | Smartphone | 699.99 |
2 | Ordinateur | 999.99 |
3 | Casque Audio | 199.99 |
Commandes
idCommande | idProduit | quantite |
---|---|---|
1 | 1 | 2 |
2 | 3 | 1 |
3 | 2 | 3 |
Avec une requête SQL, on peut savoir quel est le produit acheté en 3 exemplaires, avec son prix :
select Produits.nomProduit, Produits.prix
from Produits join Commandes on (Produits.idProduit = Commandes.idProduit)
where Commandes.quantite = 3
Et, en allant plus loin, afficher pour chaque commande, le prix total :
SELECT Commandes.idCommande AS CommandeID, Produits.nomProduit AS Produit, Produits.prix AS PrixUnitaire, Commandes.quantite AS Quantite, (Produits.prix * Commandes.quantite) AS Total
FROM Commandes
JOIN Produits ON Commandes.idProduit = Produits.idProduit;
Cela donnerait :
CommandeID | Produit | PrixUnitaire | Quantite | Total |
---|---|---|---|---|
1 | Smartphone | 699.99 | 2 | 1399.98 |
2 | Casque Audio | 199.99 | 1 | 199.99 |
3 | Ordinateur | 999.99 | 3 | 2999.97 |
AS
est un mot-clé permettant, lors de requêtes de sélection, d'afficher lors du résultat de la requête un alias
de l'attribut à afficher. Concrètement, pour les attributs à afficher, on peut renommer leur colonne.
Modifier des données
L'opération à effectuer consiste à mettre à jour des données.
On a la structure suivante :
UPDATE nom_table
SET attribut1 = nouvelle_valeur1, attribut2 = nouvelle_valeur2...
WHERE condition1 and/or condition2 ...
- UPDATE : permet de choisir quelle table doit être mise à jour ;
- SET : on indique la nouvelle valeur à donner aux attributs à modifier ;
- WHERE : optionnel, permet de choisir spécifiquement des enregistrements grâce à des conditions.
Exemple
On dispose des 2 tables suivantes :
Produits
idProduit | nomProduit | prix |
---|---|---|
1 | Smartphone | 699.99 |
2 | Ordinateur | 999.99 |
3 | Casque Audio | 199.99 |
Commandes
idCommande | idProduit | quantite |
---|---|---|
1 | 1 | 2 |
2 | 3 | 1 |
3 | 2 | 3 |
C'est le black friday, on souhaite faire une réduction de 10% sur le smartphone :
UPDATE Produits
SET prix = prix - (prix * 0.1)
WHERE nomProduit = "Smartphone"
On obtient :
idProduit | nomProduit | prix |
---|---|---|
1 | Smartphone | 629.99 |
2 | Ordinateur | 999.99 |
3 | Casque Audio | 199.99 |
Ajouter des données
L'opération à effectuer consiste à insérer des données.
On a la structure suivante :
INSERT INTO nom_table(attribut1, attribut2,...)
VALUES (valeur1,valeur2,...)
- INSERT INTO : permet d'indiquer dans quelle table (et quels attributs) ajouter le nouvel enregistrement ;
- VALUES : pour chaque attribut spécifié juste avant, on écrit les valeurs à donner.
Exemple
On dispose des 2 tables suivantes :
Produits
idProduit | nomProduit | prix |
---|---|---|
1 | Smartphone | 699.99 |
2 | Ordinateur | 999.99 |
3 | Casque Audio | 199.99 |
Commandes
idCommande | idProduit | quantite |
---|---|---|
1 | 1 | 2 |
2 | 3 | 1 |
3 | 2 | 3 |
On souhaite rajouter une nouvelle gamme de produit, une télévision, au prix de 599,99€, et en acheter 2 :
INSERT INTO Produits(nomProduit, prix)
VALUES ('Télévision', 599.99)
INSERT INTO Commandes(idProduit, quantite)
VALUES (4, 2)
On part ici du principe que les attributs idProduit
et idCommande
sont en auto-incrémentation, on ne précise donc pas leur attribut lors de l'ajout dans les tables (et c'est pourquoi on indique la valeur 4
lors de l'ajout dans la table Commandes
).
On obtient : Produits
idProduit | nomProduit | prix |
---|---|---|
1 | Smartphone | 699.99 |
2 | Ordinateur | 999.99 |
3 | Casque Audio | 199.99 |
4 | Télévision | 599.99 |
Commandes
idCommande | idProduit | quantite |
---|---|---|
1 | 1 | 2 |
2 | 3 | 1 |
3 | 2 | 3 |
4 | 4 | 2 |
Supprimer des données
L'opération à effectuer consiste à supprimer des données. On a la structure suivante :
DELETE FROM nom_table
WHERE condition1 and/or condition2...
- DELETE FROM : permet d'indiquer dans quelle table supprimer des enregistrements ;
- WHERE : on spécifie à l'aide de conditions les enregistrements spécifiques à supprimer.
Exemple
On dispose des 2 tables suivantes :
Produits
idProduit | nomProduit | prix |
---|---|---|
1 | Smartphone | 699.99 |
2 | Ordinateur | 999.99 |
3 | Casque Audio | 199.99 |
Commandes
idCommande | idProduit | quantite |
---|---|---|
1 | 1 | 2 |
2 | 3 | 1 |
3 | 2 | 3 |
On ne souhaite plus acheter d'ordinateur :
DELETE FROM Commandes
WHERE idProduit = 2
Cela fonctionne si l'on connait l'identifiant attribué à l'ordinateur. Si on ne le connait pas :
DELETE FROM Commandes
WHERE idProduit = (SELECT idProduit FROM Produits WHERE nomProduit = 'Ordinateur')
On obtient :
Commandes
idCommande | idProduit | quantite |
---|---|---|
1 | 1 | 2 |
2 | 3 | 1 |
Fonctions d'agrégation
Les fonctions d'agrégation en SQL permettent de calculer des valeurs récapitulatives à partir d'un ensemble de lignes dans une table. Elles sont souvent utilisées avec les clauses GROUP BY
et HAVING
pour analyser et regrouper des données.
Les fonctions d'agrégation les plus couramment utilisées sont :
COUNT()
SUM()
AVG()
MIN()
MAX()
Elles prennent en paramètre une colonne ou une expression et retournent une valeur unique.
- COUNT()
- SUM()
- AVG()
- MIN()
- MAX()
Compte le nombre de lignes non nulles dans une colonne.
Exemple :
SELECT COUNT(*) AS nombre_total FROM commandes
Compte le nombre de lignes (renommé en nombre_total
) présentes dans la table commandes
.
SELECT COUNT(client_id) AS clients_uniques FROM commandes
Compte le nombre de lignes dont l'attribut client_id
n'est pas nul.
Calcule la somme des valeurs dans une colonne numérique.
Exemple :
SELECT SUM(montant) AS total_ventes FROM commandes
total_ventes
contient la somme des valeurs de la colonne montant
de la table commandes
.
Calcule la moyenne des valeurs dans une colonne numérique.
Exemple :
SELECT AVG(montant) AS montant_moyen FROM commandes
montant_moyen
contient la moyenne des valeurs de la colonne montant
de la table commandes
.
Retourne la valeur minimale d'une colonne.
Exemple :
SELECT MIN(montant) AS montant_minimal FROM commandes
montant_minimal
contient la valeur minimale de la colonne montant
de la table commandes
.
Retourne la valeur maximale d'une colonne.
Exemple :
SELECT MAX(montant) AS montant_maximal FROM commandes
montant_maximal
contient la valeur maximale de la colonne montant
de la table commandes
.
GROUP BY
Les fonctions d'agrégation sont souvent combinées avec GROUP BY
pour regrouper les données selon une ou plusieurs colonnes.
Exemple :
SELECT categorie, COUNT(*) AS nombre_produits, AVG(prix) AS prix_moyen
FROM produits
GROUP BY categorie
HAVING
La clause HAVING
est utilisée pour filtrer les groupes créés par GROUP BY
, en fonction des résultats des fonctions d'agrégation.
Exemple :
SELECT categorie, COUNT(*) AS nombre_produits
FROM produits
GROUP BY categorie
HAVING COUNT(*) > 10;