Académique Documents
Professionnel Documents
Culture Documents
Cours SQL
Cours SQL
Mekni Houssem
Introduction
Le langage SQL est l’un des éléments qui ont contribué au développement et au succès de
l’approche relationnelle dans le monde des bases de données. En effet, la normalisation
internationale du langage garantit la pérennité et la stabilité des données ainsi que des
développements qui leur sont associés, indépendamment du SGBD et du langage utilisés.
Ce chapitre aborde les concepts et la syntaxe du langage SQL, et présente les trois grandes familles
d’opérations que le langage permet d’exprimer:
Le langage SQL manipule l’objet fondamental de l’approche relationnelle: la relation représentée par une table.
SQL est un langage dit « non procédural » ou « déclaratif », c’est-à-dire que l’on ne décrit pas la manière
d’effectuer les opérations pas à pas: c’est le SGBD qui choisit la méthode utilisée pour y parvenir. C’est ce qui
explique que des concours de rapidité de résolution de requête soient organisés chaque année pour tester les
différentes stratégies des éditeurs. Par conséquent, il ne dispose pas d’instructions de structuration, telles que
des boucles.
Les instructions SQL sont alors intégrées dans le langage via une interface spécifique. Les résultats de la requête
SQL sont alors stockés dans des structures de données propres au langage employé (par exemple un tableau)
afin de pouvoir les manipuler. C’est typiquement ce procédé qui est employé pour construire une interface
d’accès à une base de données par le Web.
Le langage de programmation qui intègre le langage SQL est alors appelé langage hôte (voir figure.1). De
petites différences de syntaxe peuvent apparaître entre une requête SQL exprimée interactivement et la version
« intégrée» dans un langage de programmation.
1985-12-03 10 000 1 1
1996-03-30 70 000 2 4
Vente
1998-06-14 30 000 4 1
2000-04-02 45 000 5 2
2.1 PROJECTION
(SELECT)
L’opération de projection consiste à sélectionner la (les) colonne(s) que l’on veut voir figurer
dans la table « résultat ». On spécifie la liste des colonnes à inclure dans cette table derrière
l’instruction SELECT en les séparant par des virgules. Si l’on désire afficher toutes les colonnes,
on les désigne par le caractère « * ».
Nom Ville
Nestor Paris
SELECT Nom, Ville Irma Lille
FROM personne ; Henri Paris
Josette Lyon
Jacques Bordeaux
NumAch Nom Age Ville Sexe
Projection sur tous les champs de la table ‘Personne’. 1 Nestor 96 Paris M
2 Irma 20 Lille F
SELECT * 3 Henri 45 Paris M
FROM personne ; 4 Josette 34 Lyon F
5 Jacques 50 Bordeaux M
Les colonnes de la table « résultat » peuvent être renommées par le mot clé AS.
City
SELECT Ville AS City Paris
FROM personne ; Lille
Paris
Lyon
Bordeaux
Valeurs distinctes d’une colonne
Une colonne « Salutations» ne devrait contenir que les valeurs normalisées « Madame », « Monsieur », «
Mademoiselle ». L’affichage des valeurs distinctes permet de lister les différentes valeurs prises par la colonne
pour repérer d’éventuelles incohérences comme la présence d’une valeur « Mr. », « M. », etc. Afin d’éliminer les
doublons éventuels des valeurs d’une colonne de la table « résultat », on fait précéder le nom de la colonne par le
mot clé DISTINCT.
Marque
Projection sur les valeurs distinctes du champ Peugeot
SELECT DISTINCT Marque Citroen
‘Marque’ de la table ‘voiture’. Opel
FROM voiture ;
Renault
+ Addition
- Soustraction
Opérateurs d’expressions de SQL * Multiplication
/ Division
% Modulo
SQL dispose de nombreuses autres fonctions intégrées, parfois dépendantes du SGBD utilisé, qui permettent
par exemple le traitement des colonnes de types caractères, date...
Exemple: Transformation d’une colonne ‘Nom’ de la table ‘Personne’ en majuscules ou Extraction du mois de
la colonne 'DateVente' de la table 'Vente'. NomMajuscule
NESTOR
SELECT UPPER(Nom) AS NomMajuscule IRMA
FROM personne ;
HENRI
JOSETTE
JACQUES
Mois
12
Les fonctions statistiques s’appliquent à l’ensemble des données d’une colonne (sauf pour la fonction COUNT qui s’applique aux lignes de la
table entière). Pour toutes ces opérations, la table « résultat » contiendra une seule ligne et souvent une seule colonne.
Nombre_Personne
Calcul du nombre de personnes
SELECT COUNT(*) AS Nombre_Personne 5
(le nombre de lignes en réalité) de FROM personne ;
la table ‘personne’.
Remarque:
Dans le cas de la fonction COUNT, on ne spécifie pas la colonne sur laquelle s’applique la fonction puisqu’il s’agit
de la table entière.
2.2 SÉLECTION OU RESTRICTION (WHERE)
L’opération de sélection (ou restriction) consiste à indiquer un ou plusieurs critères pour choisir les
lignes à inclure dans la table « résultat ». Ces critères utilisent évidemment le contenu des valeurs des
colonnes. Le critère de sélection est indiqué à la suite du mot clé WHERE. Il est constitué d’expressions
de conditions composées à l’aide d’opérateurs de comparaison et combinées à l’aide de connecteurs
logiques.
= Egal
<> Différent
< Inférieur
Opérateurs de comparaison de SQL. > Supérieur
Inférieur ou
<=
égal
Supérieur ou
>=
égal
Exemple: Extraction des enregistrements de la table vente dont le prix est supérieur à 50 000.
SELECT *
DateVente Prix NumVoit NumAch
FROM vente
WHERE Prix > 50
1996-03-30 70 000 2 4
000 ;
BETWEEN <valeur> AND <valeur> Appartient à un intervalle
Opérateurs de comparaison spécifiques à IN <liste de valeurs> Appartient à un ensemble de valeurs
Teste si la colonne n’est pas
SQL permettant de constituer des IS NULL
renseignée
expressions. LIKE Compare des chaînes de caractères
On obtient dans ce cas le même résultat que si l’on avait utilisé le mot clé DISTINCT vu précédemment.
L’utilisation courante de cette opération est d’appliquer en une seule instruction les fonctions statistiques déjà
abordées aux différents sous-ensembles d’une table ainsi constitués.
Calcul de la moyenne d’âge par SELECT Ville, AVG(Âge) AS Ville Moyenne_Age
ville à partir de la table ‘personne’. Bordeaux 50.0000
Moyenne_Age FROM personne
Lille 20.0000
GROUP BY Ville ; Lyon 34.0000
Paris 70.5000
Restriction sur le résultat
Le résultat de l’opération de groupage peut lui-même être filtré: c’est-à-dire que l’on effectue une
sélection des lignes par rapport au contenu des colonnes obtenues dans la table « résultat» précédente.
En pratique, on filtre sur le résultat des opérations statistiques appliquées aux sous-ensembles définis par
le groupage.
On reprend l’exemple précédent qui a permis de calculer le nombre de voitures par marques. On
suppose que l’on élimine du résultat les marques dont on possède moins de deux voitures en considérant
que ces marques ne sont pas représentatives du parc.
Lorsque l’on utilise plusieurs tables dans une requête SQL, il peut exister une ambiguïté dans les
expressions sur les noms de colonnes. En effet, deux tables peuvent avoir une colonne de nom identique.
Pour cette raison, on préfixera le nom de la colonne par le nom.
Marque Couleur
Qualification des Peugeot Rouge
SELECT voiture. Marque, voiture. Couleur
attributs par leur table Citroen
Opel
Noire
Blanche
d’appartenance FROM voiture ; Peugeot Blanche
Renault Rose
Renault Bleue
Cette notation peut devenir rapidement fastidieuse si le nombre de tables est élevé et si leurs noms sont
longs. Dans ce cas, on désigne la table par un alias plus commode, qui peut être réduit à une simple
lettre, plutôt que par son nom complet. L’alias est indiqué simplement à la suite du nom de la table ou à
l’aide du mot clé AS qui est optionnel.
Marque Couleur
Peugeot Rouge
Citroen Noire
Opel Blanche
SELECT Vo.Marque,
Peugeot Blanche
Vo.Couleur FROM voiture Renault Rose
Renault Bleue
AS Vo;
Produit cartésien
Le produit cartésien est la combinaison de toutes les lignes d’une table avec toutes les lignes d’une autre
table sans tenir aucun compte du « sens» associé aux données. C’est une opération qui n’a guère d’intérêt
en pratique. En SQL, cette opération s’écrit simplement.
SELECT *
FROM personne, voiture ;
Il s’agit de l’opération de base de l’algèbre relationnelle. Elle permet de lier deux tables entre elles en
introduisant un critère de « sens des données issu du monde réel » par opposition à l’opération
précédente. Elle peut s’exprimer de plusieurs manières en SQL. La première est semblable à la restriction
du produit cartésien précédent, mais dans ce cas la requête n’est généralement pas traitée de manière
optimale par le SGBD.
Une autre manière d’exprimer la jointure interne passe par un opérateur de jointure spécifique JOIN. Il
faut bien sûr spécifier la colonne sur laquelle s’effectue la jointure.
SELECT voiture.Marque, voiture.Couleur, vente.Prix
FROM vente JOIN voiture ON voiture.NumVoit=vente.NumVoit ;
2.5 Tri du résultat d’une requête
Il est possible de préciser l’ordre de tri par les mots clés ASC (croissant
par défaut) ou DESC (décroissant).
Prix DateVente
Tri par Marque de la table ‘voiture’ SELECT Prix, DateVente
70 000 1996-03-30
FROM vente
en ordre décroissant. ORDER BY Prix DESC ;
45 000 2000-04-02
30 000 1998-06-14
10 000 1985-12-03
Le langage SQL comprend une partie manipulation de données pour gérer les tables. Les
opérations de création, de suppression et de modification des tables mettent à jour le dictionnaire
de données du SGBD. On rappelle que le dictionnaire de données est une structure propre au
SGBD qui contient la description des objets du SGBD (base de données, tables, colonnes, droits,
etc.).
Création
La création d’une table est une opération importante qu’il faut entreprendre avec soin. C’est lors
de cette étape que l’on définit le type de données, la clé, les index éventuels et qu’il convient
d’imposer des contraintes de validation garantissant la bonne qualité des informations entrées
dans la table. La forme générale de l’instruction de création de table est la suivante:
CREATE TABLE <Nom de la table> ( liste des colonnes avec leur type séparé
par ,) ;
DATE Date
Types de données date de SQL. Heure, n (optionnel) est le nombre de décimales
TIME[(n)]
représentant la fraction de secondes
BOOLEAN Booléen
Binary Large Object : permet de stocker tout type
Types de données binaires de SQL. BLOB
binaire (photo, fichier traitement de texte...)
Suppression
La commande DROP TABLE permet de supprimer une table.
DROP TABLE voiture
Modification
SELECT * FROM
voiture ;
Lors de l’étape de conceptualisation, on a défini la notion de « domaine », qui décrira l’ensemble des
valeurs que peut prendre un attribut. Au niveau de SQL, une première approche du domaine est établie
par le choix du type de la colonne, mais cela n’est pas assez restrictif en général.
SQL vous permet de définir des conditions de validité plus fines lors de la création de la table, que l’on
nomme contraintes d’intégrité. C’est le SGBD qui applique ces conditions au moment de l’insertion, de la
modification ou même de la suppression de données dans le cas ou ces dernières sont liées à d’autres
tables. Cette étape est parfois fastidieuse, mais elle garantit la cohérence des données et évite de se
retrouver avec des bases de données, conceptuellement correctes, mais inutilisables faute de données
valides.
On peut distinguer différents types de contraintes sur les colonnes:
Lorsque les deux conditions précédentes sont réunies, la colonne peut servir à identifier un
enregistrement et constitue donc une « clé primaire ». On rappelle qu’il ne peut y avoir qu’une seule clé
que l’on désignera en SQL par le mot clé PRIMARY KEY.
Ici, on indique que la colonne ‘NumAch’ est choisie comme clé de la table (donc implicitement unique et
non nulle) et que la colonne ‘Nom’ doit toujours être renseignée.
CREATE TABLE
voiture( NumVoit INT
PRIMARY KEY, Marque
CHAR(30) NOT NULL, Type
CHAR(20),
Couleur CHAR(40),
CHECK Couleur IN
(‘Rouge’,’Vert’,’Bleu’));
Par une expression (>, < , BETWEEN...).
Par exemple, On vérifie que l’âge est compris entre 1 et 80.
Les commandes SQL sont présentées dans cette section concernent non plus la gestion
qui de la structure
tables, mais celle des contenus. On dispose classiquement de trois
opérations
des : l’insertion, la suppression et la mise à jour, pour gérer les données d’une table.
L’insertion se fait enregistrement par enregistrement, mais cela peut se révéler fastidieux. Cependant,
l’insertion de données est possible également à partir de la lecture d’un fichier externe dont le format
est accepté par le SGBD. Ces instructions dépendent donc du SGBD utilisé.
Les opérations de suppression et de modification des données se font à partir de critères de sélection des
enregistrements (lignes) à modifier ou à supprimer. Par exemple, on peut décider de supprimer toutes les
personnes qui habitent Paris. Autre exemple : on actualise le prix en euros de l’ensemble des ventes qui ont
eu lieu après la date du passage à l’euro.
Ces critères s’expriment de la même manière que pour les opérations de sélection vues précédemment. Il est
également possible d’utiliser le résultat d’une requête pour déterminer l’ensemble des valeurs d’une colonne
afin d’effectuer cette sélection.
INSERTION (INSERT INTO)