Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. SQL
  3. La manipulation des données (LMD)
Extrait - SQL Les fondamentaux du langage (avec exercices et corrigés) - (5e édition)
Extraits du livre
SQL Les fondamentaux du langage (avec exercices et corrigés) - (5e édition)
3 avis
Revenir à la page d'achat du livre

La manipulation des données (LMD)

Introduction

Le langage de manipulation de données permet aux utilisateurs et aux développeurs d’accéder aux données de la base, de modifier leur contenu, d’insérer ou de supprimer des lignes.

Il s’appuie sur quatre ordres de base qui sont SELECT, INSERT, DELETE et UPDATE.

Ces quatre ordres ne sont pas toujours autorisés par l’administrateur de la base qui est le seul à pouvoir attribuer ou non les droits d’utilisation sur ces ordres.

Pour l’utilisateur lambda, il pourra indiquer que seul l’ordre SELECT est utilisable. Les ordres de modification de la base ne sont pas accessibles pour certains utilisateurs pour des raisons évidentes de sécurité.

La sélection de données

L’ordre SELECT permet de réaliser des requêtes simples assez rapidement même sans connaissances approfondies en langage de programmation. C’est l’ordre de base qui permet d’indiquer au serveur que l’on désire extraire des données.

Il peut également être très puissant si l’on connaît toutes les fonctions et toutes les possibilités du langage. On peut réaliser des requêtes complexes, avec de nombreuses tables mais il faut toujours faire attention aux performances qui peuvent se dégrader très rapidement sur un ordre SQL mal construit ou n’utilisant pas les bons index dans les tables. Il faut être vigilant et utiliser les outils d’analyse de requête (cf. chapitre Approfondissement - Quelques notions de performances) avant d’exécuter une requête sur une base réelle avec des tables conséquentes.

Les principaux éléments d’une requête de sélection

Clause

Expression

SELECT

Liste des colonne(s) et/ou des éléments d’extraction

FROM

Table(s) source(s)

WHERE

Condition(s) ou restriction(s), optionnelle

GROUP BY

Regroupement(s), optionnelle

HAVING

Condition(s) ou restriction(s) sur le(s) regroupement(s), optionnelle

ORDER BY

Tri(s)

Les tables de base qui sont utilisées dans les sections suivantes sont celles-ci :

images/03RI01V3.PNG

Attention, les résultats complets des requêtes ne sont pas toujours présentés. Parfois, seules les premières lignes sont affichées.

1. L’ordre de sélection de données SELECT

Le SELECT est l’ordre le plus important et le plus utilisé en SQL. Avec cet ordre, nous pouvons ramener des lignes d’une ou plusieurs tables mais également transformer des données par l’utilisation de fonction ou encore réaliser des calculs.

Nous allons décrire progressivement les possibilités de cet ordre dans les paragraphes suivants.

L’utilisation la plus courante consiste à sélectionner des lignes dans une table comme ceci :

SELECT NombreLit, Description FROM TypesChambre; 

Dans cet exemple, nous avons sélectionné deux colonnes de la table TypesChambre.

L’ordre va donc nous ramener toutes les lignes de la table pour ces deux colonnes. 

NombreLit

Description...

L’insertion de données

Après avoir créé la structure des tables et avant de pouvoir sélectionner des données dans la base, il faut insérer des valeurs.

Nous avons vu dans le chapitre sur le LDD (cf. chapitre La définition des données (LDD) - Créer une table à partir d’une sélection de données) qu’il est possible de remplir une table à partir d’une autre lors de la création de la table. Par CREATE TABLE, dans la majorité des cas la table est créée à vide puis ensuite on insère des données. 

1. L’ordre INSERT

L’ordre INSERT va permettre d’insérer des valeurs dans une table.

La méthode la plus simple consiste à insérer une ligne à la fois et toutes les colonnes de la table.

Dans ce cas, il suffit d’indiquer au système toutes les valeurs que l’on veut insérer dans l’ordre des colonnes de la table.

Exemple d’insertion dans la table Tarifs

INSERT INTO Tarifs 
VALUES 
(57, 1, 1, '2025-04-15', '2025-09-30', 58.49); 

Il faut absolument que les valeurs soient dans l’ordre des colonnes dans ce cas précis. C’est assez risqué de travailler ainsi, si la table évolue avec des nouvelles colonnes cet ordre ne fonctionnera plus. Le système indiquera qu’il manque des valeurs.

Il est préférable d’indiquer les colonnes concernées ainsi :

INSERT INTO Tarifs 
(idTarif, Hotel, TypeChambre, DateDebut, DateFin, Prix) 
VALUES 
(58, 1, 2, '2025-04-15', '2025-09-30', 69.99); 

Pour la syntaxe MySQL, il suffit de changer le TO_DATE(’10/04/1985’,’DD/MM/YYYY’) par STR_TO_DATE(’10/04/1985’,’%d/%m/%Y’).

Il est possible d’insérer plusieurs lignes à la fois en séparant les lignes de valeurs par des virgules, ainsi :

INSERT INTO Tarifs 
(idTarif, Hotel, TypeChambre, DateDebut, DateFin, Prix) 
VALUES 
(59, 1, 3, '2025-04-15', '2025-09-30', 81.49), 
(60, 1, 4, '2025-04-15', '2025-09-30', 69.99), 
(61, 1, 5, '2025-04-15', '2025-09-30', 81.49); 

Comme il n’y a pas d’option d’auto-incrémentation...

La suppression de données

La suppression n’est pas l’ordre le plus utilisé mais il est important de connaître la syntaxe. Il faut faire très attention lors de l’utilisation du DELETE car il arrive souvent que l’on supprime plus de lignes que prévu.

Pour éviter cela, deux conseils : tester au préalable avec un SELECT la clause WHERE afin de vérifier le nombre de lignes concernées, et utiliser à bon escient les ordres COMMIT et ROLLBACK que nous détaillerons dans le chapitre Le contrôle de transactions (TCL).

1. L’ordre DELETE

L’ordre DELETE va permettre de supprimer une ou plusieurs lignes dans une table.

La syntaxe de la clause DELETE est simple si l’on ne restreint pas les lignes. Si l’on ne précise pas de clause WHERE, toutes les lignes de la table sont supprimées.

Si ce sont des tables importantes, il est déconseillé d’utiliser un DELETE sans restriction, il existe un risque important de faire planter le système qui ne pourra pas stocker toutes les lignes détruites afin de pouvoir les restituer si un ROLLBACK est demandé (voir chapitre Approfondissement).

Une requête DELETE peut ne pas aboutir si une contrainte d’intégrité n’est plus vérifiée à cause de la suppression d’une ligne.

Exemple de suppression de toutes les lignes d’une...

La modification de données

Nous avons vu l’insertion et la suppression de données, il reste maintenant la modification d’une ou de plusieurs lignes d’une table avec l’ordre UPDATE.

1. L’ordre UPDATE

Cet ordre est syntaxiquement simple à mettre en œuvre. Il permet de mettre à jour 1 à x colonnes d’une table et de 1 à x lignes avec le même ordre.

Comme pour le DELETE, il est possible d’ajouter des restrictions avec la clause WHERE.

Exemple de modification dans la table Tarifs

UPDATE Tarifs SET Prix = 99; 

Si on ne met pas de restriction, tous les prix de la table Tarifs vont passer à 99.

idTarif

hotel

typeChambre

DateDebut

DateFin

Prix

1

1

1

2024-10-01

2025-04-14

99

2

1

2

2024-10-01

2025-04-14

99

3

1

3

2024-10-01

2025-04-14

99

4

1

4

2024-10-01

2025-04-14

99

5

1

5

2024-10-01

2025-04-14

99

6

1

6

2024-10-01

2025-04-14

99

7

1

7

2024-10-01

2025-04-14

99

8

2

1

2024-12-15

2025-04-15

99

Il est donc important avant d’exécuter un ordre UPDATE de bien vérifier le nombre de lignes impactées par cette modification. Il est conseillé de faire un SELECT en amont pour visualiser les lignes sélectionnées.

Dans Oracle, en cas d’erreur, il est toujours possible d’exécuter un ROLLBACK juste après l’UPDATE afin de rétablir les données d’origine.

Exemple de modification dans la table Tarifs sur une seule ligne

UPDATE Tarifs SET Prix = 68.99 
WHERE idTarif = 3; 

Seule la ligne avec le numéro 3 est mise à jour.

idTarif

hotel

typeChambre

DateDebut

DateFin

Prix

1

1

1

2024-10-01

2025-04-14

49,99

2

1

2

2024-10-01

2025-04-14

59,99

3

1

3

2024-10-01

2025-04-14

68,99

4

1

4

2024-10-01

2025-04-14

59,99

5

1

5

2024-10-01

2025-04-14

69,99

UPDATE Tarifs SET Prix = 58.99 
WHERE hotel = 1 AND Prix BETWEEN 50 AND 60; 

Dans ce cas, deux lignes sont mises à jour : la 2 et 4. À noter...

Agir sur les données à partir d’une autre table

1. L’ordre MERGE

Cette fonction permet d’insérer, de modifier ou de supprimer des enregistrements sur une table à partir de données d’une autre table ou vue.

Syntaxe

MERGE INTO <nom table1> 
  USING <nom table2> 
  ON <conditions> 
  WHEN MATCHED THEN 
    UPDATE SET <table1.colonne1> = valeur1, <table1.colonne2> = 
valeur2, ... ... 
    DELETE WHERE <conditions2> 
  WHEN NOT MATCHED THEN 
    INSERT <colonne1>, <colonne3>, ... ...  
    VALUES (valeur1, valeur3, ... ...) 
  • MERGE INTO : table à modifier.

  • USING : les données source.

  • ON : conditions.

  • WHEN MATCHED THEN : les modifications ou suppressions effectuées lorsque la ou les conditions sont vérifiées.

  • WHEN NOT MATCHED THEN : les ajouts effectués lorsque la condition n’est pas vérifiée.

Exemple

Nous souhaitons augmenter le prix de 15% de la table Tarifs lorsque la colonne Commentaire de la chambre contient une donnée.

Voici la requête qui sélectionne les tarifs à augmenter de 15%. La jointure porte sur les deux clés étrangères de la table Tarifs pour qu’il n’y ait pas de doublon. L’idTarif est affiché pour s’en assurer. La restriction permet ne pas sélectionner les commentaires dont la valeur est NULL ou contient un espace.

SELECT idTarif, Prix, Commentaire FROM Tarifs 
INNER JOIN Hotels ON Hotels.idHotel = Tarifs.hotel 
INNER JOIN Chambres ON Hotels.idHotel = Chambres.Hotel AND 
Chambres.TypeChambre = Tarifs.typeChambre 
WHERE Commentaire IS NOT NULL AND Commentaire <> ''; 

Résultat

idTarif

Prix

Commentaire

1

49,99

Belle vue

5

69,99

Belle vue

11

68,99

Vue sur mer

12

80,49

Vue sur mer

16

68,99

Vue sur mer

18

68,99

Vue sur mer

29

57,49

Belle vue

33

80,49

Belle vue

46

59,99

Vue sur mer

47

69,99

Vue sur mer

51

59,99

Vue sur mer

53

59,99

Vue sur mer

57

58,49

Belle vue

61

81,49

Belle vue

Et une requête pour vérifier quelques lignes qui ne vont pas être...

Solutions des exercices

1. Solutions des exercices sur la sélection de données

a. Questions générales

1. Quels sont les quatre types de jointure décrits dans cet ouvrage ?

Interne, externe, naturelle et croisée

2. Quelles sont les fonctions de regroupement utilisables avec un GROUP BY ?

Les plus utilisées sont COUNT, SUM, AVG, MIN, MAX. Il existe également VARIANCE, STDDEV et GROUP_CONCAT pour SQL.

3. Quels sont les trois opérateurs ensemblistes ?

UNION, INTERSECT et EXCEPT

b. Exercices d’application

Les solutions proposées peuvent différer légèrement selon le type de base de données. Télécharger les fichiers complémentaires qui contiennent les scripts exacts pour les quatre SGBDR (SQL Server, Oracle, MySQL et PostgreSQL).

Premier exercice

Sélectionner toutes les informations sur les films réalisés par un réalisateur français trié par le nom du film.

Première possibilité, on connaît la valeur de la colonne NATIONALITE qui correspond à FRANCE : 1.

SELECT * FROM FILM T1, REALISATEUR T2 WHERE 
       T1.IDENT_REALISATEUR = T2.IDENT_REALISATEUR AND 
       T2.NATIONALITE = 1 
ORDER BY T1.TITRE; 

Deuxième possibilité, on ajoute une jointure avec la table PAYS et l’on teste sur le libellé « FRANCE ».

SELECT * FROM FILM T1, REALISATEUR T2, PAYS T3 WHERE 
       T1.IDENT_REALISATEUR = T2.IDENT_REALISATEUR AND 
       T2.NATIONALITE = T3.IDENT_PAYS AND 
       T3.LIBELLE = 'FRANCE' 
ORDER BY T1.TITRE; 

ou autre syntaxe possible :

SELECT * FROM FILM T1
       INNER JOIN REALISATEUR T2 ON T1.IDENT_REALISATEUR = 
                                    T2.IDENT_REALISATEUR 
       INNER JOIN PAYS T3        ON T2.NATIONALITE = T3.IDENT_PAYS 
 
WHERE T3.LIBELLE = 'FRANCE' 
ORDER BY T1.TITRE; 

Résultats

On constate que TOUTES...