Chapitre 6
Le langage SQL
SQL (Structured Query Language) est le langage de programmation de facto utilisé
pour définir et manipuler des bases de données relationnelles organisées sous forme
de tables contenant des lignes et des colonnes.
SQL est à la fois un langage de définition de données et un langage de manipulation
de données :
— D’une part, en tant que langage de définition de données, SQL permet d’implémenter
physiquement un modèle relationnel au sein d’un système de gestion de bases
de données en offrant des instructions qui permettent de créer des tables et des
colonnes.
— D’autre part, en tant que langage de manipulation de données, SQL offre une
multitude d’opérations permettant de faire la recherche, l’insertion, la suppression
et la mise à jour de données.
Afin de présenter de manière harmonieuse la syntaxe des instructions du langage
SQL, nous allons nous appuyer sur le modèle relationnel World vu dans le chapitre
précédent avec de légères modifications au niveau des noms des attributs et des
tables :
Modèle relationnel World
country(Code, Name, Continent, SurfaceArea, Population, HeadOfState, #Capital)
— Capital référence [Link]
city(ID, Name, #CountryCode, Population)
— CountryCode référence [Link]
countrylanguage(#CountryCode, Language)
— CountryCode référence [Link]
6.1 Langage de définition de données
6.1.1 Création d’une table
L’instruction SQL qui permet de créer une table s’appelle CREATE TABLE. Sa
syntaxe est la suivante :
53
Chapitre 6 Le langage SQL
CREATE TABLE [ Nom_De_La_table ] (
/* Definition des colonnes de la table */
[ Colonne ] [ Type ] [ Contraintes ] ,
[ Colonne ] [ Type ] [ Contraintes ] ,
...
[ Colonne ] [ Type ] [ Contraintes ] ,
/* Contraintes multicolonnes ( si besoin ) */
[ Co ntr a intes _m u lticolonnes ]
);
L’instruction CREATE TABLE permet de créer une table et de définir le nom, le type
de données et les éventuelles contraintes d’intégrité de chaque colonne.
Types de données
L’ensemble des types de données utilisés dans les différents SGBDs du marché
varie légèrement d’un SGBD à un autre. Néanmoins, dans le cadre de ce cours, nous
allons nous limiter à l’ensemble des types de données illustrés dans le tableau 6.1
Types Signification Exemples de valeurs
INTEGER Entiers relatif 1 -45 10 0
REAL Nombres réels 1.25 -5.58 0.4
TEXT Chaînes de caractère ’Leon’ ’Oran’ ’Messaoud’
TABLE 6.1 – Types de données pris en considération dans ce cours
Contraintes d’intégrité
Une contrainte d’intégrité est un mécanisme qui s’assure que les valeurs d’une
colonne donnée soient toujours cohérentes. Dans le cadre de ce cours, quatre contraintes
d’intégrités seront prises en considération :
— PRIMARY KEY : Déclare la colonne comme étant la clé primaire de la table. Cette
contrainte peut être utilisée dans sa version multi-colonne pour définir une clé
primaire composée de plusieurs attributs.
— NOT NULL : S’assure que la colonne ne contienne pas de valeurs NULL.
— CHECK(C) : S’assure que toutes les valeurs de la colonne satisfont la condition
C.
— REFERENCES Tab(Col) : Déclare la colonne comme clé étrangère qui référence
la colonne Col de la table Tab.
54
6.1 Langage de définition de données
Exemple de création de tables
Les instruction respectives de création des tables country, city et countryLanguage
de la base de données World sont données dans ce qui suit :
CREATE TABLE country (
Code TEXT PRIMARY KEY ,
Name TEXT NOT NULL ,
Continent TEXT NOT NULL ,
SurfaceArea REAL NOT NULL CHECK ( SurfaceArea > 0) ,
Population INTEGER NOT NULL CHECK ( Population > 0) ,
HeadOfState TEXT NOT NULL ,
Capital INTEGER NOT NULL REFERENCES city ( ID )
);
La table country contient sept colonnes :
— Code : est l’identifiant unique d’un pays e.g. ’DZA’ pour Algérie, ’FIN’ pour
Finlande, etc. Son type est TEXT et c’est la clé primaire de la table country.
— Name : est le nom du pays e.g. ’Algeria’, ’Finland’, ’Sweden’. Son type est TEXT
et sa valeur ne peut pas être NULL.
— Continent : est le nom du continent où se trouve le pays e.g. ’Africa’, ’Europe’,
etc. Son type est TEXT et sa valeur ne peut pas être NULL.
— SurfaceArea : est la superficie du pays e.g. 2381741.00 pour l’Algérie. Son
type est REAL et sa valeur est strictement positive et ne peut pas être NULL.
— Population : est la population du pays. Son type est INTEGER et sa valeur est
strictement positive et ne peut pas être NULL.
— HeadOfState : est le nom du chef d’état du pays e.g. ’Vladimir Putin’ pour la
Russie. Son type est TEXT et sa valeur ne peut pas être NULL.
— Capital : est la capitale du pays. Son type est INTEGER et c’est une clé étrangère
qui référence la colonne ID de la table city. Sa valeur ne peut pas être NULL.
CREATE TABLE city (
ID INTEGER PRIMARY KEY ,
Name TEXT NOT NULL ,
CountryCode TEXT NOT NULL REFERENCES country ( Code ) ,
Population INTEGER NOT NULL CHECK ( Population > 0)
);
La table city contient quatre colonnes :
— ID : est l’identifiant unique d’une ville. Son type est INTEGER et c’est la clé
primaire de la table city.
— Name : est le nom de la ville e.g. ’Annaba’, ’New York City’, etc. Son type est
TEXT et sa valeur ne peut pas être NULL.
— countryCode : est le code du pays où se situe la ville. Son type est TEXT, c’est
une clé étrangère qui référence la colonne Code de la table country. Sa valeur
ne peut pas être NULL.
55
Chapitre 6 Le langage SQL
— Population : est la population de la ville. Son type est INTEGER, sa valeur est
strictement positive et ne peut pas être NULL.
CREATE TABLE countrylanguage (
CountryCode TEXT NOT NULL REFERENCES country ( Code ) ,
Language TEXT NOT NULL ,
PRIMARY KEY ( CountryCode , Language )
);
La table countryLanguage contient deux colonnes :
— CountryCode : est le code du pays où la langue est parlée. Son type est TEXT,
c’est une clé étrangère qui référence la colonne Code de la table country et elle
ne peut pas être NULL.
— Language : est le nom de la langue parlée dans le pays dont le code est
countryCode e.g. ’Arabic’, ’Berberi’ pour l’Algérie. Son type est TEXT et sa valeur
ne peut pas être NULL.
• La clé primaire de la table countryLanguage est composée des deux colonnes
CountryCode et Language.
6.1.2 Suppression d’une table
L’instruction SQL qui permet de supprimer une table s’appelle DROP TABLE. Sa
syntaxe est la suivante :
DROP TABLE [ Nom_de_la_table ];
Exemple de suppression d’une table
Les instructions suivantes permettent de supprimer les tables country, city et countryLanguag
DROP TABLE country ;
DROP TABLE city ;
DROP TABLE countrylanguage ;
6.2 Langage de manipulation de données
6.2.1 Insertion de données
L’instruction SQL qui permet d’insérer des données dans une table s’appelle INSERT
INTO. Sa syntaxe est la suivante :
INSERT INTO [ Nom_de_la_table ]
VALUES ( v1 , v2 , ... );
56
6.2 Langage de manipulation de données
Où v1,v2, ... sont les valeurs du tuple à ajouter dans la table. Ces valeurs
doivent être données dans l’ordre dans lequel les colonnes ont été déclarées lors
de l’utilisation de l’instruction CREATE TABLE.
Exemples d’insertion de données
Afin d’illustrer l’utilisation de l’instruction INSERT INTO, ce qui suit est un exemple
d’ajout de la ville d’Alger dans la table city :
INSERT INTO city
VALUES (35 , ’ Alger ’ , ’ DZA ’ , 2168000);
Ce qui suit est un autre exemple d’ajout dans la table countryLanguage des langues
parlées en Algérie :
INSERT INTO countrylanguage
VALUES ( ’ DZA ’ , ’ Arabic ’ );
INSERT INTO countrylanguage
VALUES ( ’ DZA ’ , ’ Berberi ’ );
6.2.2 Suppression de données
L’instruction SQL qui permet de supprimer des données dans une table s’appelle
DELETE FROM. Sa syntaxe est la suivante :
DELETE FROM [ Nom_de_la_table ]
WHERE [ Condition ];
Cette instruction supprime tous les tuples d’une table qui vérifient la condition qui
suit le mot-clé WHERE.
Exemple de suppression de données
Afin d’illustrer l’utilisation de l’instruction DELETE FROM, ce qui suit est un exemple
de suppression de tous les pays d’Afrique :
DELETE FROM country
WHERE Continent = ’ Africa ’;
6.2.3 Mise à jour de données
L’instruction SQL qui permet de mettre à jour les données d’une table s’appelle
UPDATE. Sa syntaxe est la suivante :
57
Chapitre 6 Le langage SQL
UPDATE [ Nom_de_la_table ]
SET [ Colonne ] = [ Valeur ]
WHERE [ Condition ];
L’instruction UPDATE effectue la modification qui suit le mot clé SET sur tous les tuples
de la table qui vérifient la condition qui suit le mot clé WHERE.
Exemple de mise à jour de données
Afin d’illustrer l’utilisation de l’instruction UPDATE, ce qui suit est un exemple qui fait
la mise à jour suivante « Donald Trump est le nouveau président des USA » :
UPDATE country
SET HeadOfState = ’ Donald ␣ Trump ’
WHERE Code = ’ USA ’;
6.2.4 Recherche de données
La recherche de données en SQL se fait de manière similaire à celle de l’algèbre
relationnel dans la mesure où elle s’appuie entre autres sur les opérations de projection,
de restriction et de jointure. L’instruction SQL qui permet d’effectuer une recherche de
données s’appelle SELECT. Sa syntaxe est la suivante :
SELECT [ Colonne ] , [ Colonne ] , ...
FROM [ Table ] , [ Table ] , ...
WHERE [ Condition ];
L’instruction SELECT retourne :
— la projection sur les colonnes qui suivent le mot-clé SELECT (Le symbole * peut
être utilisée pour projeter sur toutes les colonnes).
— du produit cartésien des tables qui suivent le mot-clé FROM
— et restreint le résultat aux tuples qui satisfont la condition qui suit le mot-clé
WHERE. Les opérateurs logique AND et OR peuvent être utilisés pour construire
la condition
Exemples de requêtes d’interrogations d’une seule table
Afin d’illustrer l’utilisation de l’instruction SELECT, nous allons traduire des requêtes
exprimées en langage naturel vers des requêtes exprimées en SQL :
— Donner le nom de chaque pays et le nom de son chef d’état.
SELECT Name , HeadOfState
FROM country ;
58
6.2 Langage de manipulation de données
— Donner le nom de chaque pays et le code de sa capitale.
SELECT Name , Capital
FROM country ;
— Donner le nom des pays dont la superficie dépasse 1000000m2 .
SELECT Name
FROM country
WHERE SurfaceArea > 1000000;
— Donner le nom de tous les pays d’Europe.
SELECT Name
FROM country
WHERE Continent = ’ Europe ’;
— Donner le nom des pays africains dont la superficie est inférieur à 500000m2 .
SELECT Name
FROM country
WHERE Continent = ’ Africa ’
AND SurfaceArea < 500000;
— Qui est le chef d’état du Zimbabwe ?
SELECT HeadOfState
FROM country
WHERE Name = ’ Zimbabwe ’;
— Quelle est la superficie de l’Algérie ?
SELECT SurfaceArea
FROM country
WHERE Name = ’ Algeria ’;
— Donner les langues parlées en Suisse sachant que ce pays porte le code
CHE.
SELECT Language
FROM countryLanguage
WHERE countryCode = ’ CHE ’;
Exemples de requêtes d’interrogations sur plusieurs tables
Nous allons à présent exprimer des requêtes un peu plus complexes qui portent
sur deux ou plusieurs tables et qui nécessitent de faire des jointures :
— Donner le nom de toutes les villes d’Algérie. Cette requête nécessite de
faire une jointure entre les tables city et country. Elle peut être exprimée de la
manière suivante :
59
Chapitre 6 Le langage SQL
SELECT city . Name
FROM country , city
WHERE CountryCode = Code
AND country . Name = ’ Algeria ’;
À partir de l’exemple précédent, nous pouvons émettre deux remarques concernant
la recherche de données à travers plusieurs tables :
1. La jointure est exprimée comme une condition du WHERE. C’est-à-dire qu’il
n’est pas nécessaire de faire appel à une autre instruction SQL pour faire la
jointure. En outre, les éventuelles restrictions peuvent être exprimées avant
(ou après) la jointure en utilisant l’opérateur AND. Cette manière d’exprimer
la jointure comme une restriction découle du fait qu’en algèbre relationnelle,
une jointure peut être vue comme un produit cartésien suivi d’une restriction.
2. Il est éventuellement nécessaire de désambiguïser le nom des colonnes. En
effet, dans l’exemple précédent, la colonne Name existe dans deux tables
différentes : city et country. Pour faire la différence entre ces deux colonnes,
il est nécessaire de précéder le nom de la colonne par le nom de la table
suivi d’un point. Par exemple [Link] pour la colonne Name de la table
city et [Link] pour la colonne Name de la table country.
— Donner le nom de toutes les villes européennes ainsi que le pays dans
lequel se trouve chaque ville.
SELECT city . Name , country . Name
FROM city , country
WHERE countryCode = Code
AND Continent = ’ Europe ’;
— Donner le nom de toutes les capitales européennes ainsi que le pays dans
lequel se trouve chaque capitale.
SELECT city . Name , country . Name
FROM city , country
WHERE ID = Capital
AND Continent = ’ Europe ’;
— Donner le nom de tous les pays africains francophones.
SELECT Name
FROM country , countryLanguage
WHERE Code = CountryCode
AND Continent = ’ Africa ’
AND Language = ’ French ’;
— Quelles sont les langues parlées en Suisse (Switzerland) ?
60
6.2 Langage de manipulation de données
SELECT Language
FROM country , countryLanguage
WHERE Code = CountryCode
AND Name = ’ Switzerland ’;
— Quelles sont les langues parlées dans le pays dont la capitale est Londres
(London) ?
SELECT Language
FROM city , countryLanguage , country
WHERE countryLanguage . countryCode = Code
AND ID = Capital
AND city . Name = ’ London ’;
6.2.5 Opérations ensemblistes
À l’instar de l’algèbre relationnelle, le langage SQL offre les trois principales opérations
ensemblistes vues dans le chapitre qui porte sur l’algèbre relationnelle, à savoir :
— L’union en utilisant le mot-clé UNION ;
— L’intersection en utilisant le mot-clé INTERSECT ;
— La différence en utilisant le mot-clé EXCEPT.
Ces trois opérations peuvent être utilisées entre deux instructions SELECT. Et comme
en algèbre relationnelle, les deux instructions SELECT doivent avoir les mêmes colonnes,
c’est-à-dire, la même projection.
La syntaxe de l’utilisation des opérations ensemblistes est la suivante :
SELECT [ Colonne ] , [ Colonne ] , ...
FROM [ Table ] , [ Table ] , ...
WHERE [ Condition ]
OPER ATION_ENSEMBLISTE
SELECT [ Colonne ] , [ Colonne ] , ...
FROM [ Table ] , [ Table ] , ...
WHERE [ Condition ];
Exemples :
— Donner le nom des pays d’Afrique et d’Asie. Nous pouvons diviser cette
requête en deux requêtes : la première retourne les pays d’Afrique et la seconde
retourne les pays d’Asie. Puis, nous devons faire l’union des résultats des deux
requêtes :
61
Chapitre 6 Le langage SQL
SELECT Name
FROM country
WHERE Continent = ’ Africa ’
UNION
SELECT Name
FROM country
WHERE Continent = ’ Asia ’;
— Quelles sont les villes du royaume uni (United Kingdom) qui ont des homonymes
aux Canada ?
SELECT city . Name
FROM city , country
WHERE CountryCode = Code
AND country . Name = ’ United ␣ Kingdom ’
INTERSECT
SELECT city . Name
FROM city , country
WHERE CountryCode = Code
AND country . Name = ’ Canada ’;
— Quelles sont les langues parlées à la fois en Suisse (Switzerland) et en
Belgique (Belgium) ?
SELECT Language
FROM country , countryLanguage
WHERE country . Code = countryLanguage . CountryCode
AND Name = ’ Switzerland ’
INTERSECT
SELECT Language
FROM country , countryLanguage
WHERE country . Code = countryLanguage . CountryCode
AND Name = ’ Belgium ’;
— Quelles sont les langues parlées uniquement en Afrique du sud (South
Africa) ?
SELECT Language
FROM countrylanguage , country
WHERE CountryCode = Code
AND Name = ’ South ␣ Africa ’
EXCEPT
SELECT Language
FROM countrylanguage , country
WHERE CountryCode = Code
AND Name != ’ South ␣ Africa ’;
62
6.2 Langage de manipulation de données
— Donner le nom des pays qui parlent uniquement l’espagnol (Spanish).
SELECT Name
FROM countrylanguage , country
WHERE CountryCode = Code
AND Language = ’ Spanish ’
EXCEPT
SELECT Name
FROM countrylanguage , country
WHERE CountryCode = Code
AND Language != ’ Spanish ’;
6.2.6 Limitation des résultats
Parfois, nous pouvons avoir besoin d’afficher seulement d’un échantillon de tuples
(ou un certain nombre de tuples) et non pas la totalité des tuples d’une requête
SELECT. Le langage SQL offre pour cela l’instruction LIMIT dont la syntaxe est la
suivante :
SELECT [ Colonne ] , [ Colonne ] , ...
FROM [ Table ] , [ Table ] , ...
WHERE [ Condition ]
LIMIT [ Nom bre_ maxi mu m_ de_ tuples ];
L’instruction LIMIT limite le résultat de l’instruction SELECT à un nombre de tuples
égal au maximum au nombre qui suit le mot-clé LIMIT.
Exemple
— Donner le nom de 5 pays d’Afrique.
SELECT Name
FROM country
WHERE Continent = ’ Africa ’
LIMIT 5;
6.2.7 Tri des résultats
Contrairement à l’algèbre relationnelle, SQL offre la possibilité de trier les résultats
retournés par instruction SELECT. Le tri se fait selon l’ordre croissant ou décroissant
des valeurs d’une colonne. L’instruction qui permet de trier les résultats s’appelle
ORDER BY. Sa syntaxe est la suivante :
63
Chapitre 6 Le langage SQL
SELECT [ Colonne ] , [ Colonne ] , ...
FROM [ Table ] , [ Table ] , ...
WHERE [ Condition ]
ORDER BY [ Colonne ] ASC / DESC ;
L’instruction ORDER BY trie le résultat de l’instruction SELECT selon l’ordre croissant
(ASC) ou décroissant (DESC) des valeurs de la colonne qui suit le mot-clé ORDER BY.
Exemples
— Donner le nom et la population des pays du monde selon l’ordre décroissant
de leur population.
SELECT Name , Population
FROM country
ORDER BY Population DESC ;
— Donner le top 5 des pays les plus peuplés du monde.
SELECT Name
FROM country
ORDER BY Population DESC
LIMIT 5;
— Donner le top 3 des pays les plus grands d’Afrique.
SELECT Name
FROM country
WHERE Continent = ’ Africa ’
ORDER BY SurfaceArea DESC
LIMIT 3;
— Quel est le pays le plus petit au monde et quelle est sa superficie ?
SELECT Name , SurfaceArea
FROM country
ORDER BY SurfaceArea ASC
LIMIT 1;
— Donner les cinq capitales les plus peuplées du monde ainsi que le pays
où elles se trouvent ?
SELECT city . Name , country . Name
FROM country , city
WHERE Id = Capital
ORDER BY city . Population DESC
LIMIT 5;
64
6.2 Langage de manipulation de données
6.2.8 Fonctions
Le langage SQL offre plusieurs fonctions pour effectuer des traitements sur les
données. Le tableau suivant donne la signification de chacune de ces fonctions.
TABLE 6.2 – Fonctions fournies par SQL
Fonction Signification
COUNT Retourne le nombre de ligne d’une colonne donnée
MAX Retourne la plus grande valeur d’une colonne donnée
MIN Retourne la plus petite valeur d’une colonne donnée
AVG Retourne la moyenne des valeurs d’une colonne donnée
SUM Retourne la somme des valeurs d’une colonne donnée
L’appel d’une de ces fonction doit se faire directement après le mot-clé SELECT et
ne peut être utilisé que sur une et une seule colonne de projection. La syntaxe de
l’utilisation des fonctions est la suivante :
SELECT FONCTION ([ Colonne ])
FROM [ Table ] , [ Table ] , ...
WHERE [ Condition ];
Exemples
— Combien de pays y a-t-il en Afrique ?
SELECT COUNT ( Code )
FROM country
WHERE Continent = ’ Africa ’;
— Quelle est la superficie du plus grand pays au monde ?
SELECT MAX ( SurfaceArea )
FROM country ;
— Quelle est la superficie du plus petit pays d’Europe ?
SELECT MIN ( SurfaceArea )
FROM country
WHERE Continent = ’ Europe ’;
— Quelle est la population moyenne des pays d’Asie ?
SELECT AVG ( Population )
FROM country
WHERE Continent = ’ Asia ’;
65
Chapitre 6 Le langage SQL
— Quelle est la population d’Afrique ?
SELECT SUM ( Population )
FROM country
WHERE Continent = ’ Africa ’;
66