Le langage SQL

information-icon

Les premières épreuves du bac 2024 sont pour bientôt ! Consulte notre dossier sur le contrôle continu et le calcul des notes de ton bac pour maximiser ta préparation pour les révisions à ton examen 💪

Introduction :

Nous savons que, pour créer une base de données, il est d'abord nécessaire de la modéliser à l'aide d'un MCD, puis d'en déduire le modèle relationnel et, enfin, de procéder à une normalisation du schéma ainsi obtenu. Une fois ces étapes effectuées, il est enfin temps de concrétiser la base de données et de l'utiliser.

Dans ce cours, nous allons découvrir un langage utilisé pour transmettre des ordres à un SGBD relationnel : SQL. Il se décompose selon trois grandes familles d'opérations : la gestion des tables et des vues, la manipulation des données en table et, pour terminer, l'interrogation et la recherche dans les tables.
Commençons par créer les relations de notre modèle relationnel, autrement dit, la structure de la base. Les tables qui en résulteront seront vides, mais prêtes à accueillir les futures données.

La description des données

Le langage utilisé pour créer la structure d'une base de données est un LDD (Langage de description des données). SQL, en plus d'autres langages, est un LDD.

bannière astuce

Astuce

SQL est le sigle de Structured query language qui signifie en français « Langage de requêtes structuré ».

Examinons les requêtes que nous pouvons adresser au SGBD pour créer la structure de notre base de données.

Création de la structure de la base de données

La structure de la base de données comporte l'ensemble de ses tables. Il est donc nécessaire de les créer une à une.
La création d'une table est une opération qu'il faut effectuer avec attention. C'est lors de cette étape que, en plus de ses colonnes, on définit les contraintes d'intégrité de domaine, de relation et de référence.

La syntaxe employée est la suivante :

CREATE TABLE nomTable (

colonne1 type de donnée,
colonne2 type de donnée,
colonne3 type de donnée,
colonne4 type de donnée,
….
PRIMARY KEY (colonnex, colonney, …),
FOREIGN KEY (colonnea, colonneb,…) REFERENCES nomTableX (colonnei, colonnej…) ON DELETE option
…);

bannière à retenir

À retenir

  • Chaque instruction se termine obligatoirement par un « ; ».
  • L'orthographe des termes écrits en lettre capitales uniquement doit être respectée. Ce sont des mots-clés composant la syntaxe.
  • Les termes soulignés sont obligatoires.
  • Les autres termes sont les noms qui sont affectés librement aux attributs et aux tables.
bannière attention

Attention

Cette syntaxe n'est pas exhaustive, mais nous l'avons volontairement limitée aux notions que nous avons jugées les plus utiles pour ce cours.

  • Type de donnée

Le type de donnée constitue en lui-même une contrainte de domaine. Il précise la nature d'un attribut :

  • Numérique
  • INT (codé sur $32\,\text{bits}$) ;
  • SMALLINT (codé sur $16\,\text{bits}$) ;
  • REAL (taille qui dépend du SGBD) ;
  • FLOAT(n) (réel représenté sur $n\,\text{bit}$).
  • Caractère
  • CHAR(n) (chaîne de longueur n, codage ASCII $1\,\text{octet}$) ;
  • VARCHAR(n) (chaîne de longueur maximale n, codage ASCII $1\,\text{octet}$) ;
  • NCHAR(n) (chaîne de longueur n, codage UNICODE $2\,\text{octets}$) ;
  • NVARCHAR(n) (chaîne de longueur maximale n, codage UNICODE $2\,\text{octets}$).
  • Binaire
  • BOOLEAN (booléen) ;
  • BLOB (Binary large object qui permet de stocker tout type binaire tel que photo, document mis en forme…).
  • Date
  • DATE (date) ;
  • TIME(n) (heure, n, optionnel, étant le nombre de décimales pour représenter une fraction de seconde).
  • Clé primaire

Le terme « PRIMARY KEY » désigne le ou les attributs qui constituent la clé primaire de la relation. C'est une contrainte de relation qui garantit l'unicité de la clé primaire.

  • Clé étrangère
  • Le terme « FOREIGN KEY » désigne le ou les attributs qui constituent une clé étrangère dans la relation. C'est une contrainte de référence qui garantit une cohérence entre les données.
  • Le terme « REFERENCE » sert à désigner la table et la ou les colonnes de cette table dont la clé étrangère est issue.
  • Enfin, le terme « ON DELETE » permet de préciser l'option choisie en cas de suppression de la clé étrangère dans la table d'où celle-ci provient.
bannière exemple

Exemple

Si nous reprenons le modèle relationnel de la base de données de notre club de cuisine (voir cours précédents du même chapitre), voici sa traduction en une commande SQL qui permet de créer les tables ville et adherent de notre base.

Schéma relationnel Commande SQL
Ville(idVille, nomVille, codePostal) avec

idVille : clé primaire

CREATE TABLE ville(

idVille INT NOT NULL AUTO_INCREMENT,
nomVille CHAR(50),
codePostal INT,

PRIMARY KEY (idVille)
);

Adherent(idAdherent, nomAdherent, prenom, mail, numero, rue, complement, idVille, passe, telephone) avec

idAdherent : clé primaire
idVille : clé étrangère en référence à idVille de Ville

CREATE TABLE adherent(

idAdherent INT NOT NULL AUTO_INCREMENT,
nomAdherent CHAR(50),
prenom CHAR(50),
mail CHAR(30),numero CHAR(10),
rue CHAR(50),
complement CHAR(50),
idVille INT,
passe CHAR(30),
telephone INT,

PRIMARY KEY (idAdherent),
FOREIGN KEY (idVille) REFERENCES ville(idVille) ON DELETE NO ACTION
;

On remarquera la consigne « AUTO_INCREMENT » qui laisse l'initiative au SGBD d'affecter une valeur numérique à la colonne idAdherent, s'incrémentant de $1$ en $1$ au fur et à mesure que l'on ajoute des lignes dans la table adherent (idem pour idVille).
On notera également la précision « NOT NULL » qui évite qu'une ligne soit insérée sans clé primaire (dans le cas contraire, il serait impossible de l'identifier !).
Enfin, on constate que l'on choisit de ne supprimer aucun enregistrement dans la table ville si sa colonne idVille figure comme clé étrangère dans une ligne de la table adherent.

Nous avons ainsi créé les deux tables vides suivantes :

idVille nomVille codePostal

idAdherent nomAdherent prenom mail numero rue complement idVille passe telephone

Suppression d'une table

La syntaxe pour supprimer une table, et par conséquent son contenu, est la suivante : DROP TABLE nomTable;.

Il va de soi que si des contraintes d'intégrité référentielle ont été posées, dans les autres tables, sur des clés étrangères faisant appel à des colonnes issues de la table que l'on souhaite supprimer, l'opération ne sera pas possible.
Il est donc nécessaire de supprimer au préalable les tables ou les lignes dont les clés étrangères se réfèrent à une ligne de la table que l'on veut supprimer.

bannière exemple

Exemple

DROP TABLE ingredient;

langage SQL

DROP TABLE utilise;

langage SQL

DROP TABLE ingredient;

langage SQL

Dans un premier temps, il n'a pas été possible de supprimer la table ingredient car une ou plusieurs de ses lignes était référencée via une clé étrangère (idIngredient) dans une autre table (la table utilise).
La suppression de la table utilise, qui, elle, n'est référencée dans aucune autre table, a été possible.
Cela a alors permis, par la suite, la suppression de la table ingredient.

Modification d'une table

La commande ALTER TABLE permet de modifier la structure d'une table, que ce soit en ajoutant, supprimant ou modifiant ses colonnes.
Cette opération est plus délicate lorsque la table contient déjà des lignes. Il est par conséquent important d'agir prudemment avec cette commande.

  • Ajout d'une colonne à une table

ALTER TABLE nomTable

ADD COLUMN nouveauChamp TYPEDONNEE;

Notons que l'attribut nouveauChamp sera affecté avec une valeur « NULL » aux enregistrements déjà existants dans la table.

bannière exemple

Exemple

ALTER TABLE recette

ADD COLUMN pays CHAR(30);

Avant ajout de la colonne pays :

idRecette nomRecette niveau duree categorie idAdherent
1 Mayonnaise difficile 15 sauce 7
2 Omelette facile 5 plat 6
3 Pâte brisée moyen 20 autre 6
4 Quatre-quarts facile 10 dessert 4
5 Purée de carottes moyen 15 accompagnement 2
6 Poulet rôti facile 15 plat 2
7 Sole meunière difficile 20 plat 7

Après ajout de la colonne pays :

idRecette nomRecette niveau duree categorie idAdherent pays
1 Mayonnaise difficile 15 sauce 7
2 Omelette facile 5 plat 6
3 Pâte brisée moyen 20 autre 6
4 Quatre-quarts facile 10 dessert 4
5 Purée de carottes moyen 15 accompagnement 2
6 Poulet rôti facile 15 plat 2
7 Sole meunière difficile 20 plat 7
  • Suppression de la colonne d'une table

ALTER TABLE nomTable

DROP COLUMN nomChamp;

bannière exemple

Exemple

ALTER TABLE recette

DROP COLUMN duree;

Après suppression de la colonne duree :

idRecette nomRecette niveau categorie idAdherent pays
1 Mayonnaise difficile sauce 7
2 Omelette facile sauce 6
3 Pâte brisée moyen sauce 6
4 Quatre-quarts facile sauce 4
5 Purée de carottes moyen sauce 2
6 Poulet rôti facile sauce 2
7 Sole meunière difficile sauce 7
  • Modification d'une colonne

Cette opération peut s'avérer délicate s'il s'agit, par exemple, de renommer le nom d'une colonne ou de changer son type. L'appel à une colonne supplémentaire s'avère alors nécessaire.

bannière exemple

Exemple

Supposons que l'on souhaite renommer la colonne rue de la table adherent pour l'appeler voie et que l'on souhaite augmenter sa taille à $100$ caractères maximum.
Il faudra alors procéder comme suit :

/* création d'une colonne portant le nom désiré et du type désiré */

ALTER TABLE adherent
ADD COLUMN voie VARCHAR(100);

/* initialisation de la nouvelle colonne avec les valeurs de l'ancienne colonne */

UPDATE adherent
SET voie=rue;

/* suppression de l'ancienne colonne */

ALTER TABLE adherent
DROP COLUMN rue;

L'instruction UPDATE qui figure dans cet exemple est étudiée plus en détail dans la suite de ce cours. Elle permet ici, pour chaque ligne existante dans la table adherent, de renseigner la valeur du nouveau champ voie avec la valeur du champ existant rue.

Maintenant que nous sommes en mesure de créer la structure de base, nous allons pouvoir commencer à y enregistrer des données. Un Langage de manipulation des données (LMD) nous est nécessaire.

  • SQL en est un.

La manipulation des données

La manipulation des données consiste en leur insertion, modification et suppression dans les tables de la base. Regardons en détail les instructions qui nous permettent de faire réaliser ces opérations par le SGBD.

L'insertion d'une ligne dans une table

Il s'agit d'enregistrer une nouvelle ligne dans une table. Les mécanismes suivants vont être sollicités :

  • contrôle des contraintes d'intégrité lors de l'insertion (domaine, relation et référentielle) ;
  • renseignement des champs avec la valeur « NULL » si aucune valeur n'est précisée et si « NULL » est autorisé pour ces champs.

La syntaxe est la suivante :

INSERT INTO nomTable
(champx, champY, ….)
VALUES (valeurChampX, valeurChampY,…);

bannière à retenir

À retenir

Quelques précisions méritent notre attention :

  • Les valeurs des colonnes doivent être renseignées dans le même ordre que celui de la liste des colonnes donnée juste avant.
  • Si la liste des colonnes n'est pas donnée, alors le SGBD se base sur la liste des colonnes de la table, dans l'ordre où celles-ci ont été définies lors de sa création.
  • Si certaines colonnes sont omises, elles prendront la valeur 'NULL'.
bannière exemple

Exemple

Insérons un ingrédient dans la base de données du club de cuisine :

INSERT INTO ingredient
(nomIngredient, type)
VALUES ("oeuf","viande")

Nous n'avons pas précisé la valeur de la colonne idIngredient car le SGBD se charge lui-même de lui affecter une valeur numérique unique (option "AUTO_INCREMENT" spécifiée lors de la création de la table). Sachant qu'ici, c'est le premier ingrédient que nous insérons dans la table ingredient, la colonne idIngredient prendra la valeur 1.

idIngredient nomIngredient type
1 oeuf viande

La suppression de la ligne d'une table

bannière astuce

Astuce

Comme lors de la suppression d'une table, la suppression d'une ligne est soumise au respect des contraintes d'intégrité.

L'instruction de suppression permet de supprimer une ou plusieurs lignes d'une table. Pour cela, les lignes concernées par l'opération doivent être désignées. Celles-ci sont identifiées avec une condition.

bannière à retenir

À retenir

C'est la clause WHERE qui va nous le permettre.

Ainsi, la syntaxe de la commande SQL pour supprimer une ou plusieurs lignes d'une table est la suivante :

DELETE FROM nomTable
WHERE condition;

La condition consiste en un ou plusieurs critères portant sur le contenu d'une ou plusieurs colonnes. Elle s'exprime à l'aide d'opérateurs de comparaison, comparaison que l'on peut combiner avec d'autres en utilisant des connecteurs logiques.

  • Opérateurs de comparaison

= Égal
<> Différent
< Inférieur strictement
> Supérieur strictement
<= Inférieur ou égal
>= Supérieur ou égal
BETWEEN <valeur1> AND <valeur2> Appartient à un intervalle (<valeur2> incluse)
IN <liste de valeurs> Appartient à un ensemble de valeurs
IS NULL Colonne non renseignée
LIKE <chaîne> Recherche chaînes de caractères correspondant à un modèle
  • Connecteurs logiques

<condition1> AND <condition2> Les $2$ conditions sont vraies simultanément
<condition1> OR <condition2> Au moins une des $2$ conditions est vraie
NOT <condition> Inverse la condition
bannière exemple

Exemple

Supprimons l'ingrédient dont la colonne nomIngredient porte la valeur « rutabaga » dans la table ingredient&nbp;:

DELETE FROM ingredient
WHERE nomIngredient = "rutabaga";

Avant suppression :

idIngredient nomIngredient type
1 oeuf viande
2 moutarde condiment
3 vinaigre condiment
4 huile condiment
5 sel condiment
6 poivre condiment
7 gruyère râpé crèmerie
8 huile d’olive condiment
9 farine épicerie
10 beurre crèmerie
11 sucre épicerie
12 lait crèmerie
13 carotte légume
14 crème fraîche crèmerie
15 cumin condiment
16 muscade condiment
17 poulet viande
18 persil condiment
19 citron fruit
20 sole viande
21 rutabaga légume
22 levure épicerie

Après suppression de la ligne :

idIngredient nomIngredient type
1 oeuf viande
2 moutarde condiment
3 vinaigre condiment
4 huile condiment
5 sel condiment
6 poivre condiment
7 gruyère râpé crèmerie
8 huile d’olive condiment
9 farine épicerie
10 beurre crèmerie
11 sucre épicerie
12 lait crèmerie
13 carotte légume
14 crème fraîche crèmerie
15 cumin condiment
16 muscade condiment
17 poulet viande
18 persil condiment
19 citron fruit
20 sole viande
22 levure épicerie

Le SGBD n'a pas refusé d'exécuter la commande : l'ingrédient supprimé n'était référencé dans aucune autre table, ou, si c'était le cas, l'option a été choisie, dans les tables concernées (ici la table utilise), de supprimer les lignes dont la colonne clé étrangère correspond à l'ingrédient supprimé, ou de renseigner à « NULL » cette clé étrangère.

Nous pouvons émettre une critique sur le critère de sélection : celui-ci porte sur la colonne nomIngredient qui ne constitue pas une clé primaire pour la table ingredient. Cela impose au SGBD de parcourir séquentiellement les lignes de la table jusqu'à trouver celle dont la colonne nomIngredient répond au critère.

bannière astuce

Astuce

Pour être plus efficace et plus fiable, il aurait été préférable de repérer l'ingrédient de nom « rutabaga » par sa colonne idIngredient (en l'occurrence, la ligne 21) : le SGBD aurait atteint la ligne directement, grâce à l'index de la table. De plus, il aurait identifié à coup sûr et de manière unique l'ingrédient visé, ce qui est préférable.

La modification d'une ou plusieurs lignes d'une table

bannière à retenir

À retenir

Une opération de modification requiert que l'on précise :

  • les colonnes concernées ;
  • les nouvelles valeurs prises par ces colonnes ;
  • les lignes concernées, via la clause WHERE.
bannière astuce

Astuce

Comme pour l'insertion ou la suppression d'une ligne dans une table, la modification d'une ligne doit respecter les contraintes d'intégrité spécifiées lors de la création de la structure de la base de données.

La syntaxe d'une modification est la suivante :

UPDATE nomTable
SET nomColonne1 = valeur 1, nomColonne2 = valeur2, …
WHERE condition

bannière exemple

Exemple

Modifions le nom de la recette dont la colonne nomRecette contient « Omelette » et le niveau de difficulté actuellement évalué à « facile », sachant que son identifiant est 2.

UPDATE recette
SET nomRecette = "Omelette au fromage", niveau = "moyen"
WHERE idRecette = 2;

Avant modification :

idRecette nomRecette niveau duree categorie idAdherent
1 Mayonnaise difficile 15 sauce 7
2 Omelette facile 5 plat 6
3 Pâte brisée moyen 20 autre 6
4 Quatre-quarts facile 10 dessert 4
5 Purée de carottes moyen 15 accompagnement 2
6 Poulet rôti facile 15 plat 2
7 Sole meunière difficile 20 plat 7

Après modification de la ligne :

idRecette nomRecette niveau duree categorie idAdherent
1 Mayonnaise difficile 15 sauce 7
2 Omelette au fromage moyen 5 plat 6
3 Pâte brisée moyen 20 autre 6
4 Quatre-quarts facile 10 dessert 4
5 Purée de carottes moyen 15 accompagnement 2
6 Poulet rôti facile 15 plat 2
7 Sole meunière difficile 20 plat 7

Nous savons maintenant enregistrer, modifier et supprimer des données dans une base. L'objectif final de tout ce qui a été réalisé jusqu'ici est cependant de pouvoir consulter ces données, selon des critères variés. Nous allons donc aborder maintenant la manière d'interroger la base.

Interrogation des données

Pour interroger les données d'une base, on a recours à un LID (Langage d'interrogation des données).

  • SQL intègre un LID.

Lorsque l'on effectue une recherche dans une base de données, le résultat de celle-ci se présente lui-même sous forme d'une table, que l'on nommera par la suite « table résultat ».
Détaillons maintenant la syntaxe d'une instruction de recherche, autrement dénommée requête.

La projection

La projection consiste à sélectionner la ou les colonnes que l'on souhaite voir apparaître dans la table résultat. C'est l'instruction SELECT qui permet cela.

  • La clause SELECT

La syntaxe d'une recherche est la suivante :

SELECT nomColonne1, nomColonne2, …
FROM nomTable;

Si l'on souhaite que toutes les colonnes apparaissent dans la table résultat, il suffit alors d'employer la syntaxe suivante :

SELECT *
FROM nomTable;

bannière exemple

Exemple

On souhaite obtenir la liste des recettes du club, présentée en trois colonnes : le nom de la recette, sa durée et son niveau de difficulté.

Le schéma de la relation recette est le suivant :

recette(idRecette, nomRecette, niveau, duree, categorie, idAdherent) avec

idRecette : clé primaire

idAdherent : clé étrangère en référence à idAdherent dans adherent

La commande SQL sera donc la suivante :

SELECT nomRecette, duree, niveau
FROM recette;

nomRecette duree niveau
Mayonnaise 15 difficile
Omelette au fomage 5 moyen
Pâte brisée 20 moyen
Quatre-quarts 10 facile
Purée de carottes 15 moyen
Poulet rôti 15 facile
Sole meunière 20 difficile
  • Valeurs distinctes d'une colonne

Si l'on souhaite connaître toutes les valeurs prises par une colonne dans une table, sans que celles-ci soient répétées autant de fois qu'elles s'y retrouvent, on le précise avec la clause DISTINCT.

bannière exemple

Exemple

La table adhérent est ainsi constituée :

1 DURAND Jacques j.durand@orange.fr 16b rue brune 1 motdepass1 0601020304
2 DUVAL Paul paul.d@sfr.fr 135 avenue rouge 4 motdepass2 0704030201
3 DELORS Sophie sodelors@outlook.com 22a bd vert 3 motdepass3 0606060202
4 VERGER Jehan jverger@aol.com 4ter impasse jaune 5 motdepass4 0601020102
5 MONVILLE Fleur fleur1212@free.fr 9 sente aux loups 2 motdepass5 0707020201
6 BRIARD Paul paul.briard27@hotmail.fr 191 rue violette 4 motdepass6 0612345678
7 LÉGER Marguerite mag0506@perso.com 17 place noire 3 motdepass7 0687654321
8 FLAMAND Lise flise@gmail.com 329 route bleue 2 motdepass8 0632323232

On souhaite connaître la liste des prénoms de tous les adhérents du club de cuisine. La commande SQL qui nous vient est :

SELECT prenom
FROM adherent;

Jacques
Paul
Sophie
Jehan
Fleur
Paul
Marguerite
Lise

Mais si plusieurs adhérent·e·s portent le même prénom, par exemple deux adhérents s'appellent Paul, on retrouvera deux fois le prénom Paul dans la table résultat de la requête. Pour éviter cela, on affine notre commande avec la clause DISTINCT :

SELECT DISTINCT prenom
FROM adherent;

Jacques
Paul
Sophie
Jehan
Fleur
Marguerite
Lise

La sélection

La sélection (ou restriction) est le recours à un ou plusieurs critères pour retenir certaines lignes dans la table résultat de la requête.

  • C'est avec la clause WHERE que l'on précise ces critères.

Nous avons déjà détaillé cette clause lorsque nous avons étudié les commandes de suppression et de modification de lignes. Ces commandes requièrent en effet de préciser sur quelles lignes elles portent, donc nécessitent la clause SELECT. L'usage de SELECT dans une requête d'interrogation ne diffère pas de celui dans les requêtes de suppression ou de mise à jour de lignes.

Ainsi, si l'on souhaite effectuer une projection sur une sélection, la commande SQL prendra la forme
SELECT colonnex, colonney, …
FROM nomTable
WHERE conditions

bannière exemple

Exemple

La commande SQL qui suit recueille la liste des recettes dont la durée n'excède pas $10$ minutes, constituée du nom de la recette, de sa durée et de sa catégorie :

SELECT nomRecette, duree, categorie
FROM recette
WHERE (duree <= 10);

nomRecette duree categorie
Omelette au fromage 5 plat
Quatre-quarts 10 dessert

Conclusion :

Nous achevons ici ce cours relatif aux commandes SQL de base. Nous savons créer des tables, les modifier et les supprimer. Nous avons vu comment insérer, supprimer ou modifier des lignes dans une table. Et nous pouvons également effectuer des recherches dans celle-ci.
Nous ne savons pas encore effectuer des recherches faisant appel à plusieurs tables, ni des calculs ou des tris sur les résultats de nos recherches. C'est ce que nous aborderons dans le cours qui suit.