Aller au contenu principal

Le SQL

Point histoire

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.
Tout afficher

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
idmarquemodèlecouleurimmatriculationnom_proprioville_proprio
1RenaultClioRougeAA123AABernierParis
2Peugeot807BleuAB123NBBoscoloMetz
3PorscheCayenneNoirDE001TRDupontLille
4RenaultTwingoJauneZX987FRGrimardNantes
  • 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

idProduitnomProduitprix
1Smartphone699.99
2Ordinateur999.99
3Casque Audio199.99

Commandes

idCommandeidProduitquantite
112
231
323

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 :

CommandeIDProduitPrixUnitaireQuantiteTotal
1Smartphone699.9921399.98
2Casque Audio199.991199.99
3Ordinateur999.9932999.97
AS

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

idProduitnomProduitprix
1Smartphone699.99
2Ordinateur999.99
3Casque Audio199.99

Commandes

idCommandeidProduitquantite
112
231
323

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 :

idProduitnomProduitprix
1Smartphone629.99
2Ordinateur999.99
3Casque Audio199.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

idProduitnomProduitprix
1Smartphone699.99
2Ordinateur999.99
3Casque Audio199.99

Commandes

idCommandeidProduitquantite
112
231
323

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

idProduitnomProduitprix
1Smartphone699.99
2Ordinateur999.99
3Casque Audio199.99
4Télévision599.99

Commandes

idCommandeidProduitquantite
112
231
323
442

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

idProduitnomProduitprix
1Smartphone699.99
2Ordinateur999.99
3Casque Audio199.99

Commandes

idCommandeidProduitquantite
112
231
323

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

idCommandeidProduitquantite
112
231

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.

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.

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;