Langages de manipulation de données
  Sommaire
  Sélection de données
Le SQL est à la fois un langage de manipulation de données et un langage de définition
de données. Toutefois, la définition de données est l'oeuvre de l'administrateur de la base de
données, c'est pourquoi la plupart des personnes qui utilisent le langage SQL ne se servent que du langage
de manipulation de données, permettant de sélectionner les données qui les intéresse.
La principale commande du langage de manipulation de données est la commande SELECT.
La commande SELECT est basée sur l'algèbre relationnelle,
en effectuant des opéractions de sélection de données sur plusieurs tables
relationnelles par projection. Sa syntaxe est la suivante:
SELECT [ALL] | [DISTINCT] <liste des noms de colonnes> | *
FROM <Liste des tables>
[WHERE <condition logique>]
Il existe d'autres options pour la commande SELECT:
GROUP BY
HAVING
ORDER BY
- L'option ALL est, par opposition à l'option DISTINCT, l'option par
défaut. Elle permet de sélectionner l'ensemble des lignes satisfaisant à la
condition logique
- L'option DISTINCT permet de ne conserver que des lignes distinctes, en éliminant
les doublons
- La liste des noms de colonnes indique la liste des colonnes choisies, séparées
par des virgules. Lorsque l'on désire sélectionner l'ensemble des colonnes d'une table
il n'est pas nécessaire de saisir la liste de ses colonnes, l'option * permet de réaliser
cette tâche
- La liste des tables indique l'ensemble des tables (séparées par des virgules) sur
lesquelles on opère
- La condition logique permet d'exprimer des qualifications complexes à l'aide d'opérateurs
logiques et de comparateurs arithmétiques
  Projections
Une projection est une instruction permettant de sélectionner un ensemble de colonnes
dans une table. Soit la table VOITURE suivante:
Voiture
| Marque |
Modele |
Serie |
Numero |
| Renault |
18 |
RL |
4698 SJ 45 |
| Renault |
Kangoo |
RL |
4568 HD 16 |
| Renault |
Kangoo |
RL |
6576 VE 38 |
| Peugeot |
106 |
KID |
7845 ZS 83 |
| Peugeot |
309 |
chorus |
7647 ABY 82 |
| Ford |
Escort |
Match |
8562 EV 23 |
- La sélection de toutes les colonnes de la table se fait par l'instruction:
SELECT * FROM VOITURE
Résultat
| Marque |
Modele |
Serie |
Numero |
| Renault |
18 |
RL |
4698 SJ 45 |
| Renault |
Kangoo |
RL |
4568 HD 16 |
| Renault |
Kangoo |
RL |
6576 VE 38 |
| Peugeot |
106 |
KID |
7845 ZS 83 |
| Peugeot |
309 |
chorus |
7647 ABY 82 |
| Ford |
Escort |
Match |
8562 EV 23 |
- La sélection des colonnes Modèle et Série de la table se fait par l'instruction:
SELECT Modele, Serie FROM VOITURE
Résultat
| Modele |
Serie |
| 18 |
RL |
| Kangoo |
RL |
| Kangoo |
RL |
| 106 |
KID |
| 309 |
chorus |
| Escort |
Match |
- La sélection des colonnes Modèle et Série en éliminant les doublons se fait par l'instruction:
SELECT DISTINCT Modele, Serie FROM VOITURE
Résultat
| Modele |
Serie |
| 18 |
RL |
| Kangoo |
RL |
| 106 |
KID |
| 309 |
chorus |
| Escort |
Match |
Une restriction consiste à sélectionner les lignes satisfaisant à
une condition logique effectuée sur leurs attributs.
En SQL, les restrictions s'expriment à l'aide de la clause WHERE suivie
d'une condition logique exprimée à l'aide d'opérateurs logiques
de comparateurs de chaîne:
d'opérateurs arithmétiques:
et de comparateurs arithmétiques:
  Restrictions
Soit la table suivante, présentant des voitures d'occasion:
Occaz
| Marque |
Modele |
Serie |
Numero |
Compteur |
| Renault |
18 |
RL |
4698 SJ 45 |
123450 |
| Renault |
Kangoo |
RL |
4568 HD 16 |
56000 |
| Renault |
Kangoo |
RL |
6576 VE 38 |
12000 |
| Peugeot |
106 |
KID |
7845 ZS 83 |
75600 |
| Peugeot |
309 |
chorus |
7647 ABY 82 |
189500 |
| Ford |
Escort |
Match |
8562 EV 23 |
|
Le champ présentant la valeur du kilométrage au compteur de la Ford
Escort est délibérément non renseigné.
- La sélection de toutes les voitures d'occasion ayant un kilométrage inférieur à 100 000 Km se fait par l'instruction:
SELECT * FROM OCCAZ
WHERE (Compteur < 100000)
Résultat
| Marque |
Modele |
Serie |
Numero |
Compteur |
| Renault |
Kangoo |
RL |
4568 HD 16 |
56000 |
| Renault |
Kangoo |
RL |
6576 VE 38 |
12000 |
| Peugeot |
106 |
KID |
7845 ZS 83 |
75600 |
| Ford |
Escort |
Match |
8562 EV 23 |
|
- La sélection des colonnes Marque et Compteur des voitures ayant un kilométrage inférieur à 100 000 Km se fait par l'instruction:
SELECT Marque,Compteur FROM OCCAZ
WHERE (Compteur < 100000)
Résultat
| Marque |
Compteur |
| Renault |
56000 |
| Renault |
12000 |
| Peugeot |
75600 |
| Ford |
|
- La sélection de toutes les voitures d'occasion ayant un kilométrage inférieur ou égal à 100 000 Km, mais supérieur ou égal à 30000Km, se fait par l'instruction:
SELECT * FROM OCCAZ
WHERE (Compteur <= 100000) AND (Compteur >= 30000)
Résultat
| Marque |
Modele |
Serie |
Numero |
Compteur |
| Renault |
Kangoo |
RL |
4568 HD 16 |
56000 |
| Peugeot |
106 |
KID |
7845 ZS 83 |
75600 |
Le prédicat LIKE permet de faire des comparaisons sur des chaines grâce
à des caractères, appelés caractères jokers:
- Le caractère % permet de remplacer une séquence de caractères (éventuellement nulle)
- La caractère _ permet de remplacer un caractère (l'équivalent du "blanc" au scrabble...)
- Les caractères [-] permettent de définir un intervalle de caractères (par exemple [J-M])
- La sélection des voitures dont la marque a un E en deuxième position se fait par l'instruction:
SELECT * FROM OCCAZ
WHERE Marque LIKE "_E%"
Résultat
| Marque |
Modele |
Serie |
Numero |
Compteur |
| Renault |
18 |
RL |
4698 SJ 45 |
123450 |
| Renault |
Kangoo |
RL |
4568 HD 16 |
56000 |
| Renault |
Kangoo |
RL |
6576 VE 38 |
12000 |
| Peugeot |
106 |
KID |
7845 ZS 83 |
75600 |
| Peugeot |
309 |
chorus |
7647 ABY 82 |
189500 |
|
Suivant l'environnement ou vous utilisez ce prédicat, il sera peut-être nécessaire d'"échapperé
les guillemets avec un caractère d'échappement (généralement \).
|
Les prédicats BETWEEN et IN permettent de vérifier
respectivement qu'une valeur se trouve dans un intervalle ou qu'une valeur
appartient à une liste de valeurs:
- La sélection de toutes les voitures d'occasion ayant un kilométrage inférieur ou égal à 100 000 Km, mais supérieur ou égal à 30000Km,
(effectuée plus haut avec des comparateurs arithmétiques) peut se faire par l'instruction:
SELECT * FROM OCCAZ
WHERE Compteur BETWEEN 100000 AND 30000
Résultat
| Marque |
Modele |
Serie |
Numero |
Compteur |
| Renault |
Kangoo |
RL |
4568 HD 16 |
56000 |
| Peugeot |
106 |
KID |
7845 ZS 83 |
75600 |
- La sélection des voitures d'occasion dont la marque est Peugeot ou Ford se fait grâce à l'instruction:
SELECT * FROM OCCAZ
WHERE Marque IN (Peugeot, Ford)
Résultat
| Marque |
Modele |
Serie |
Numero |
Compteur |
| Peugeot |
106 |
KID |
7845 ZS 83 |
75600 |
| Peugeot |
309 |
chorus |
7647 ABY 82 |
189500 |
| Ford |
Escort |
Match |
8562 EV 23 |
|
Lorsqu'un champ n'est pas renseigné, le SGBD lui attribue une valeur spéciale
que l'on note NULL. La recherche de cette valeur ne peut pas se faire à l'aide
des opérateurs standards, il faut utiliser les prédicats IS NULL ou bien
IS NOT NULL.
- La sélection de toutes les voitures d'occasion dont le kilométrage n'est pas renseigné se fait par l'instruction:
SELECT * FROM OCCAZ
WHERE Compteur IS NULL
Résultat
| Marque |
Modele |
Serie |
Numero |
Compteur |
| Ford |
Escort |
Match |
8562 EV 23 |
|
  Tris et regroupements
Il est possible en SQL d'organiser les tuples fournis en résultat grâce à
la clause ORDER BY. La clause ORDER BY est suivie des mots clés ASC
ou DESC, qui précisent respectivement si le tri se fait de manière croissante (par défaut)
ou décroissante. Le classement se fait sur des nombres ou des chaines de caractères.
Prenons l'exemple de la table voiture :
| Marque |
Modele |
Serie |
Numero |
Compteur |
| Renault |
18 |
RL |
4698 SJ 45 |
123450 |
| Renault |
Kangoo |
RL |
4568 HD 16 |
56000 |
| Renault |
Kangoo |
RL |
6576 VE 38 |
12000 |
| Peugeot |
106 |
KID |
7845 ZS 83 |
75600 |
| Peugeot |
309 |
chorus |
7647 ABY 82 |
189500 |
| Ford |
Escort |
Match |
8562 EV 23 |
|
- La sélection de toutes les colonnes de la table trièes par ordre croissant de l'attribut Marque se fait par l'instruction:
SELECT * FROM VOITURE
ORDER BY Marque ASC
| Marque |
Modele |
Serie |
Numero |
Compteur |
| Ford |
Escort |
Match |
8562 EV 23 |
|
| Peugeot |
106 |
KID |
7845 ZS 83 |
75600 |
| Peugeot |
309 |
chorus |
7647 ABY 82 |
189500 |
| Renault |
18 |
RL |
4698 SJ 45 |
123450 |
| Renault |
Kangoo |
RL |
4568 HD 16 |
56000 |
| Renault |
Kangoo |
RL |
6576 VE 38 |
12000 |
- La sélection de toutes les colonnes de la table trièes par ordre croissant de l'attribut Marque, puis par ordre décroissant du compteur, se fait par l'instruction:
SELECT * FROM VOITURE
ORDER BY Marque ASC, Compteur DESC
| Marque |
Modele |
Serie |
Numero |
Compteur |
| Ford |
Escort |
Match |
8562 EV 23 |
|
| Peugeot |
309 |
chorus |
7647 ABY 82 |
189500 |
| Peugeot |
106 |
KID |
7845 ZS 83 |
75600 |
| Renault |
18 |
RL |
4698 SJ 45 |
123450 |
| Renault |
Kangoo |
RL |
4568 HD 16 |
56000 |
| Renault |
Kangoo |
RL |
6576 VE 38 |
12000 |
Il peut être intéressant de regrouper des résultats afin de faire
des opérations par groupe (opérations statistiques par exemple). Cette
opération se réalise à l'aide de la clause GROUP BY, suivie
du nom de chaque colonne sur laquelle on veut effectuer des regroupements.
Les principales fonctions pouvant être effectuées par groupe sont:
- AVG: Calcule la moyenne d'une colonne (ou de chaque regroupement si elle est couplée à la clause GROUP BY)
- COUNT: Calcule le nombre de lignes d'une table (ou de chaque regroupement ...)
- MAX: Calcule la valeur maximale d'une colonne (ou de chaque regroupement ...)
- MIN: Calcule la valeur minimale colonne (ou de chaque regroupement ...)
- SUM: Effectue la somme des valeurs d'une colonne (ou de chaque regroupement ...)
Soit la table VOITURE ci-dessus:
- L'affichage des moyennes des compteurs par marque se fait par l'instruction:
SELECT Marque, AVG(Compteur) AS Moyenne FROM VOITURE
GROUP BY Marque
| Marque |
Moyenne |
| Renault |
63816.6 |
| Peugeot |
132550 |
| Ford |
|
La clause HAVING va de pair avec la clause GROUP BY, elle permet d'appliquer
une restriction sur les groupes créés grâce à la clause GROUP BY.
- L'affichage des moyennes des compteurs non nulles regroupées par marque se fait par l'instruction:
SELECT Marque, AVG(Compteur) AS Moyenne FROM VOITURE
GROUP BY Marque
HAVING Compteur IS NOT NULL
| Marque |
Moyenne |
| Renault |
63816.6 |
| Peugeot |
132550 |
|
Remarquez l'utilisation de AS pour donner un nom à la colonne créée à l'aide de la fonction AVG.
|
  Jointures
Une jointure (ou θ-jointure) est un produit cartésien de deux tables. On appelle
équijointure une θ-jointure dont la qualification est une égalité entre deux colonnes.
En SQL, l'expression d'une jointure se fait en précisant le nom des colonnes
des tables sur lesquelles on fait la jointure, en désignant les colonnes des
différentes tables en écrivant le nom de la table, suivie d'un point puis
du nom de la colonne. La clause WHERE permet de préciser la qualification de la jointure.
Soit les deux tables suivantes:
Table Occaz
| Marque |
Modele |
Serie |
Numero |
Compteur |
| Renault |
18 |
RL |
4698 SJ 45 |
123450 |
| Renault |
Kangoo |
RL |
4568 HD 16 |
56000 |
| Renault |
Kangoo |
RL |
6576 VE 38 |
12000 |
| Peugeot |
106 |
KID |
7845 ZS 83 |
75600 |
| Peugeot |
309 |
chorus |
7647 ABY 82 |
189500 |
| Ford |
Escort |
Match |
8562 EV 23 |
|
| Fiat |
Punto |
GTI |
8941 UD 61 |
|
| Audi |
A4 |
Quattro |
7846 AZS 75 |
21350 |
Table Societe
| Nom |
Pays |
| Renault |
France |
| Fiat |
Italie |
| Peugeot |
France |
| Volkswagen |
Allemagne |
| Ford |
Etats-Unis |
- L'affichage des pays d'origine des voitures par marque/modèle se fait par l'instruction:
SELECT Occaz.Marque, Occaz.Modele, Societe.Pays FROM OCCAZ,SOCIETE
WHERE Occaz.Marque = Societe.Nom
| Marque |
Modele |
Pays |
| Renault |
18 |
France |
| Renault |
Kangoo |
France |
| Renault |
Kangoo |
France |
| Peugeot |
106 |
France |
| Peugeot |
309 |
France |
| Ford |
Escort |
Etats-Unis |
| Fiat |
Punto |
Italie |
|
Il est possible de donner des alias aux noms des tables pour diminuer la taille des requêtes.
SELECT O.Marque, O.Modele, S.Pays FROM OCCAZ O,SOCIETE S
WHERE O.Marque = S.Nom
|
  Sous-requêtes
Effectuer une sous-requête consiste à effectuer une requête à
l'intérieur d'une autre, ou en d'autres termes d'utiliser une requête
afin d'en réaliser une autre.
Une sous-requête doit être placée à la suite d'une clause
WHERE ou HAVING, et doit remplacer une constante ou un groupe de constantes
qui permettraient en temps normal d'exprimer la qualification.
- lorsque la sous-requête remplace une constante utilisée avec des
opérateurs classiques, elle doit obligatoirement renvoyer une seule réponse
(une table d'une ligne et une colonne). Par exemple:
SELECT ---- FROM ----
WHERE ---- < (SELECT ---- FROM ----)
- lorsque la sous-requête remplace une constante utilisée dans une expression
mettant en jeu les opérateurs IN, EXISTS, ALL ou ANY, elle doit obligatoirement renvoyer
une seule ligne.
SELECT ---- FROM ----
WHERE ---- IN (SELECT ---- FROM ----)
Soit la table suivante:
Table Occaz
| Marque |
Modele |
Serie |
Numero |
Compteur |
| Renault |
18 |
RL |
4698 SJ 45 |
123450 |
| Renault |
Kangoo |
RL |
4568 HD 16 |
56000 |
| Renault |
Kangoo |
RL |
6576 VE 38 |
12000 |
| Peugeot |
106 |
KID |
7845 ZS 83 |
75600 |
| Peugeot |
309 |
chorus |
7647 ABY 82 |
189500 |
| Fiat |
Punto |
GTI |
8941 UD 61 |
80232 |
| Audi |
A4 |
Quattro |
7846 AZS 75 |
21350 |
- La sélection des voitures dont le compteur est inférieur à la moyenne se fait par l'instruction:
SELECT * FROM OCCAZ
WHERE Compteur < (SELECT AVG(Compteur) FROM OCCAZ)
Résultat
| Marque |
Modele |
Serie |
Numero |
Compteur |
| Renault |
Kangoo |
RL |
4568 HD 16 |
56000 |
| Renault |
Kangoo |
RL |
6576 VE 38 |
12000 |
| Peugeot |
106 |
KID |
7845 ZS 83 |
75600 |
| Audi |
A4 |
Quattro |
7846 AZS 75 |
21350 |
  Opérations ensemblistes
Les opérations ensemblistes en SQL, sont celles définies dans l'algèbre
relationnelle. Elles sont réalisées grâce aux opérateurs:
- UNION
- INTERSECT (ne fait pas partie de la norme SQL et n'est donc pas implémenté dans tous les SGBD)
- EXCEPT (ne fait pas partie de la norme SQL et n'est donc pas implémenté dans tous les SGBD)
Ces opérateurs s'utilisent entre deux clauses SELECT.
Cet opérateur permet d'effectuer une UNION des tuples sélectionnés par
deux clauses SELECT (les deux tables sur lesquelles on travaille devant avoir le même
schéma).
SELECT ---- FROM ---- WHERE ------
UNION
SELECT ---- FROM ---- WHERE ------
Par défaut les doublons sont automatiquement éliminés. Pour conserver
les doublons, il est possible d'utiliser une clause UNION ALL.
Cet opérateur permet d'effectuer une INTERSECTION des tuples sélectionnés par
deux clauses SELECT (les deux tables sur lesquelles on travaille devant avoir le même
schéma).
SELECT ---- FROM ---- WHERE ------
INTERSECT
SELECT ---- FROM ---- WHERE ------
L'opérateur INTERSECT n'étant pas implémenté dans tous les SGBD, il est possible
de le remplacer par des commandes usuelles:
SELECT a,b FROM table1
WHERE EXISTS ( SELECT c,d FROM table2
WHERE a=c AND b=d )
Cet opérateur permet d'effectuer une DIFFERENCE entre les tuples sélectionnés par
deux clauses SELECT, c'est-à-dire sélectionner les tuples de la seconde table
n'appartenant pas à la première (les deux tables devant avoir le même
schéma).
SELECT a,b FROM table1 WHERE ------
EXCEPT
SELECT c,d FROM table2 WHERE ------
L'opérateur EXCEPT n'étant pas implémenté dans tous les SGBD, il est possible
de le remplacer par des commandes usuelles:
SELECT a,b FROM table1
WHERE NOT EXISTS ( SELECT c,d FROM table2
WHERE a=c AND b=d )
  Modifications de tuples
Le SQL permet la modification d'une table par un utilisateur (pour peu qu'il ait les droits
suffisants...). La modification d'une table consiste à:
- ajouter des tuples
- modifier des tuples existants
- ou bien supprimer des tuples
L'insertion de nouvelles données dans une table se fait grâce à l'ordre
INSERT, qui permet d'insérer de nouvelles lignes dans la table.
L'ordre INSERT attend la clause INTO, suivie du nom de la table, ainsi que du nom de chacune
des colonnes entre parenthèses (les colonnes omises prendront la valeur NULL par défaut).
Les valeurs à insérer peuvent être précisées de deux façons:
- avec la clause VALUES: une seule ligne est insérée, elle contient
comme valeurs, l'ensemble des valeurs passées en paramètre dans la parenthèse
qui suit la clause VALUES. Les données sont affectées aux colonnes dans l'ordre dans
lequel les colonnes ont été déclarées dans la clause INTO
INSERT INTO Nom_de_la_table(colonne1,colonne2,colonne3,...)
VALUES (Valeur1,Valeur2,Valeur3,...)
Lorsque chaque colonne de la table est modifiée, l'énumération de l'ensemble des colonnes est
facultatif
- avec la clause SELECT: plusieurs lignes peuvent être insérées, elle contiennent
comme valeurs, l'ensemble des valeurs découlant de la sélection.
Les données sont affectées aux colonnes dans l'ordre dans
lequel les colonnes ont été déclarées dans la clause INTO
INSERT INTO Nom_de_la_table(colonne1,colonne2,...)
SELECT colonne1,colonne2,... FROM Nom_de_la_table2
WHERE qualification
Lorsque l'on remplace un nom de colonne suivant la clause SELECT par une constante, sa
valeur est affectée par défaut aux tuples. Il n'est pas possible de sélectionner
des tuples dans la table dans laquelle on insère des lignes (en d'autres termes Nom_de_la_table
doit être différent de Nom_de_la_table2)
La modification de données (aussi appelée mise à jour)
consiste à modifier des tuples (des lignes) dans une table grâce à l'ordre
UPDATE. La modification
à effectuer est précisé après la clause SET. Il s'agit
d'une affectation d'une valeur à une colonne grâce à l'opérateur =
suivi d'une expression algèbrique, d'une constante ou du résultat provenant d'une clause SELECT.
La clause WHERE permet de préciser les tuples sur lesquels la mises à jour aura lieu
UPDATE Nom_de_la_table
SET Colonne = Valeur_Ou_Expression
WHERE qualification
La suppression de données dans une table se fait grâce à l'ordre DELETE.
Celui-ci est suivi de la clause FROM, précisant la table sur laquelle la suppression
s'effectue, puis d'une clause WHERE qui décrit la qualification, c'est-à-dire
l'ensemble des lignes qui seront supprimées.
L'ordre DELETE est à utiliser avec précaution car l'opération de
suppression est irréversible. Il faudra donc s'assurer dans un premier temps que les lignes
sélectionnées sont bien les lignes que l'on désire supprimer!
|