Вы находитесь на странице: 1из 64

Système d’information

http://www.agroparistech.fr/Systeme-d-Information.html

Partie II

——————————————————-
Bases de données et SQLite
——————————————————-

Liliana Ibănescu
liliana.ibanescu@agroparistech.fr

Cristina Manfredotti
cristina.manfredotti@agroparistech.fr

UFR d’informatique
Département MMIP

Année 2016 - 2017


Ce support de cours s’appuie sur l’ouvrage Bases de données. Concepts,
utilisation et développement de Jean-Luc Hainaut, paru en 2009 aux éditions
Dunod.

2
Table des matières

1 Les bases de données (BD) 6


1.1 La base de données client commande . . . . . . . . . . . . . . . . . 8
1.2 La base de données gie agricole . . . . . . . . . . . . . . . . . . . 9
1.3 BD, tables, lignes et colonnes . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4 Type de donnée et opérateurs . . . . . . . . . . . . . . . . . . . . . . . . 12
1.5 Clé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5.1 Clé primaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5.2 Clés étrangères . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.6 Modification et contraintes d’intégrité . . . . . . . . . . . . . . . . . . . 16
1.6.1 Contraintes imposées par les colonnes obligatoires . . . . . . . . 16
1.6.2 Contraintes d’unicité imposées par les clés primaires . . . . . . . 16
1.6.3 Contraintes référentielles imposées par les clés étrangères . . . . 16
1.7 Schéma et contenu d’une base de donnée . . . . . . . . . . . . . . . . . . 18
1.8 Le langage SQL (Structured Query Language) . . . . . . . . . . . . . . . 21
1.9 Les systèmes de gestion de bases de données (SGBD) . . . . . . . . . . . 22

2 Les instructions du langage SQL 24


2.1 Sites Web de référence pour SQL et SQLite . . . . . . . . . . . . . . . . 24
2.2 Le langage SQL DDL (Data Definition Language) . . . . . . . . . . . . . 24
2.2.1 Création d’un schéma . . . . . . . . . . . . . . . . . . . . . . . 24
2.2.2 Création d’une table (CREATE TABLE) . . . . . . . . . . . . . 25
2.2.3 Suppression d’une table (DROP) . . . . . . . . . . . . . . . . . . 26
2.2.4 Modification du schéma . . . . . . . . . . . . . . . . . . . . . . 26
2.3 Le langage SQL DML (Data Manipulation Language) . . . . . . . . . . . 27
2.3.1 Extraction de données . . . . . . . . . . . . . . . . . . . . . . . 27
2.3.2 Extraction simple (SELECT-FROM) . . . . . . . . . . . . . . . . 28
2.3.3 Extraction de lignes sélectionnées (SELECT-FROM-WHERE) . . 28
2.3.4 Le resultat d’une requête . . . . . . . . . . . . . . . . . . . . . . 29
2.3.5 Extractions et opérations sur les valeurs . . . . . . . . . . . . . . 30
2.3.6 Les sous-requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.3.7 Jointure : extraction de données de plusieurs tables . . . . . . . . 33
2.3.8 Sous-requête ou jointure ? . . . . . . . . . . . . . . . . . . . . . 35
2.3.9 Groupements (clause GROUP BY) . . . . . . . . . . . . . . . . . 37
2.3.10 Ajout de lignes dans une table (INSERT) . . . . . . . . . . . . . 39
2.3.11 Suppression de lignes (DELETE) . . . . . . . . . . . . . . . . . . 40

3
2.3.12 Modification de lignes (UPDATE) . . . . . . . . . . . . . . . . . 40

3 Prise en main de l’environment de développement 41


3.1 Pré-requis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.2 AgroPythia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.3 L’éditeur de texte Notepad++ . . . . . . . . . . . . . . . . . . . . . . . 42
3.3.1 Démarrage de Notepad++ . . . . . . . . . . . . . . . . . . . . . 43
3.3.2 Créer un nouveau fichier . . . . . . . . . . . . . . . . . . . . . . 43
3.3.3 Ouvrir un fichier existant . . . . . . . . . . . . . . . . . . . . . . 43

4 Travaux dirigés en BD 45
4.1 Requêtes simples sur une table . . . . . . . . . . . . . . . . . . . . . . . 46
4.2 Données extraites et fonctions agrégatives . . . . . . . . . . . . . . . . . 50
4.3 Sous-requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.4 Requêtes avec jointures entre tables . . . . . . . . . . . . . . . . . . . . 54
4.5 La clause Group By . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.6 Requêtes de mise à jour . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.7 Modification et contraintes d’intégrité . . . . . . . . . . . . . . . . . . . 60

4
5
Chapitre 1

Les bases de données (BD)

L’objectif de ce chapitre est de présenter de manière formelle et succincte les notions


et le vocabulaire utile en base de données 1 . Comme nous l’avons vu précédemment, dans
la premier partie de ce cours, les fichiers nous permettent de stocker des données que l’on
peut utiliser par la suite dans nos programmes et, à l’inverse, nos programmes peuvent
créer des fichiers pour stocker les résultats des traitements effectués. Néanmoins, selon la
quantité de données et les relations existantes entre elles, les fichiers peuvent rapidement
se révéler insuffisants.
Considérons l’extrait d’un fichier de données de commandes de clients donné en Fi-
gure 1.1. En observant le contenu de ce fichier, nous pouvons rapidement constater un
certain nombre de redondances. Par exemple, si l’on considère le client C400, nous pou-
vons constater que son nom et son adresse apparaissent à plusieurs reprises. En effet, il
a passé plusieurs commandes avec parfois plusieurs produits. De manière analogue, un
même produit commandé à plusieurs reprises aura son libellé noté pour chaque achat.
Tout ceci est nécessaire lorsque l’on veut stocker ces données dans un fichier. Néanmoins
cela est rapidement coûteux. Ici, il ne s’agit que d’un bref exemple considérant unique-
ment quelques clients et quelques produits. Imaginez a qu’il pourait se passer avec un
volume de données analogues à celui d’Amazon ou de la Fnac.
La particularité des données présentées dans cet exemple par rapport à ce que l’on a
pu voir dans les séances précédentes est qu’elles sont ici “liées” : un client est à “ratta-
cher” à un certain nombre de commandes qui elles-mêmes concernent un certain nombre
de produits. Certaines de ces informations sont propres à une entité particulière comme
par exemple l’adresse pour une personne ou le libellé d’un produit, en revanche d’autres
marquent les liens qui les unissent par exemple le numéro de commande permet de re-
trouver tous les produits achetés lors d’un même achat.
Lorsque l’on est confronté à ce cas de figure il devient préférable de stocker ces
données dans ce que l’on appelle une bases de données (BD), database (DB) en anglais
(voir les §1.3 à §1.8). Par ailleurs, en dehors du problème de redondance, il n’est pas aisé
avec un tel fichier de déterminer rapidement et automatiquement par exemple tous les
produits commandés par un client donné.
Les bases de données sont des outils de plus en plus fréquemment utilisés. Elles per-
1. Pour plus de détails vous pourrez vous reporter à l’ouvrage Bases de données. Concepts, utilisation
et développement de Jean-Luc Hainaut, paru en 2009 aux éditions Dunod.

6
F IGURE 1.1 – Un extrait d’un fichier de données de commandes de clients.

mettent de stocker des données nombreuses dans un seul ensemble bien structuré, d’éviter
le plus souvent les doublons, d’assurer la cohérence des informations qu’elles contiennent
et fournissent des moyens d’interrogation performants répondant ainsi à toutes nos réserves
vis-à-vis de l’usage de fichiers pour des données “liées”.
La gestion d’une base de données pose des problèmes complexes et elle est assurée
par des logiciels spécialisés : les systèmes de gestion de bases de données (SGBD), en
anglais DBMS pour database management system (voir le §1.9).
Tout au long de ce cours nous utiliserons deux exemples de bases de données :
1. La base de données appelée client commande, décrite dans le §1.1, est utilisée
pour enregistrer les clients, les produits et les commandes d’une entreprise de
matériaux de construction ; le système d’information construit sur cette base de
données permettra, entre autres, d’éditer des factures, de gérer les stocks et la
comptabilité.
2. La base de données appelée gie agricole, décrite dans le §1.2, est utilisée
par un GIE 2 agricole pour enregistrer les interventions de ses employés sur les
parcelles des agriculteurs ; le système d’information construit sur cette base de
données permettra, entre autres, d’éditer les fiches de paye des employés et les
interventions effectuées pour un agriculteur.

2. GIE = groupement d’intérêt économique

7
1.1 La base de données client commande
La base de données client commande est utilisée par une entreprise de matériaux
de construction pour lui permettre d’éditer des factures pour ses clients et de gérer ses
stocks.
Le schéma de la base de données client commande est présenté dans la figure 1.2 :
1. la table client est utilisée pour enregistrer les propriétés concernant les clients
de l’entreprise : leur nom, leur adresse, etc.
2. la table produit est utilisée pour enregistrer les propriétés concernant les ma-
tériaux de construction disponibles à la vente : leur libellé, le prix à l’unité, la
quantité en stock.
3. la table commande est utilisée pour enregistrer les propriétés concernant une
commande : son numéro, la date de la commande et l’identifiant du client (NCLI)
qui permet de récupérer dans la table client toutes les informations relatives à
ce client.
4. la table detail est utilisée pour enregistrer les “lignes” des commandes : l’iden-
tifiant de la commande (NCOM), l’identifiant du produit (NPRO) et la quantité com-
mandée.

F IGURE 1.2 – Le schéma de la base de données client commande.

A un instant donné, les lignes (ou enregistrements) de la BD client commande


sont ceux donnés dans la figure 1.3.

8
table client table commande

table produit table detail


F IGURE 1.3 – Les lignes de la base de données client commande à un instant donné.

1.2 La base de données gie agricole


La base de données gie agricole est utilisée par un groupement d’intérêt écono-
mique (GIE) agricole pour enregistrer les interventions de ses employés sur les parcelles
des agriculteurs. La main d’œuvre pour l’exploitation des parcelles est assurée par les em-
ployés du GIE, payés selon un salaire journalier brut. La BD permet, entre autre, d’éditer
les fiches de payes mensuelles des employés et de lister les interventions effectuées pour

9
un agriculteur.
Le schéma de la base de données gie agricole est présenté dans la figure 1.4 :
1. la table agriculteur est utilisée pour enregistrer les propriétés concernant un
agriculteur : son nom, son prénom et son adresse.
2. la table parcelle est utilisée pour enregistrer les propriétés concernant les par-
celles des agriculteurs : leur nom, leur lieu, leur superficie et l’identifiant de leur
propriétaire.
3. la table employe est utilisée pour enregistrer les propriétés concernant les em-
ployés.
4. la table intervention est utilisée pour enregistrer les interventions des em-
ployés du GIE sur les parcelles des agriculteurs.

F IGURE 1.4 – Le schéma de la base de données gie agricole.

A un instant donné, les lignes (ou enregistrements) de la BD gie agricole sont


ceux donnés dans la figure 1.5.

10
table agriculteur table tarif

table parcelle

table employe

table intervention
F IGURE 1.5 – Les lignes de la base de données gie agricole à un instant donné.

11
1.3 BD, tables, lignes et colonnes
Une base de données est composée d’un ensemble de tables.
Une table contient une collection/suite de lignes, aussi appelées enregistrements.
Une ligne d’une table est une suite de valeurs, chacune d’un type déterminé. Une ligne
regroupe les données relatives à une entité ou un fait du domaine d’application (la partie
du monde à laquelle on s’intéresse). Toutes les lignes d’une table ont le même format ou
structure.
Une colonne est définie par son nom et le type de ses valeurs.

Exemple 1. La figure 1.6 représente les informations enregistrées à un instant donné dans
la table produit de la BD client commande : la table a 7 lignes (enregistrements)
décrivant chacune un produit. On trouve dans chaque ligne quatre valeurs représentant
respectivement le code, le libellé, le prix à l’unité d’un produit, ainsi que la quantité restant
en stock. La colonne LIBELLE contient des valeurs qui sont des chaı̂nes de caractères,
les valeurs de la colonne PRIX sont des nombres décimaux (dont deux chiffres après la
virgule) et les valeurs de la colonne QSTOCK sont des nombres entiers (cf à la figure 1.2).

F IGURE 1.6 – Les lignes de la table produit de la BD client commande à un instant


donné.

1.4 Type de donnée et opérateurs


Nous rappelons que, en informatique, un type de donnée, ou simplement type, définit
le type des valeurs que peut prendre une donnée, ce qui permet de déterminer les opérateurs
qui peuvent être appliqués à cette donnée. Les types de base sont les suivants :
— type booléen : les valeurs true et false.
— type numérique : des nombres entiers, des nombres décimaux, des nombres réels.
— type chaı̂ne de caractères : du texte.
— type temporel : une date (jour, mois et année), une heure (heure, minute et se-
conde).
Les opérateurs utilisés pour comparer des valeurs sont :

12
= égal à
> plus grand que
< plus petit que
<> différent de
>= plus grand ou égal
<= plus petit ou égal
L’interprétation de ces relations est évidente pour les valeurs numériques. Pour les va-
leurs temporelles, l’expression date1 < date2 s’interprète comme date1 est antérieure à
date2 dans le calendrier. Pour les chaı̂nes de caractères, l’expression ch1 < ch2 pour toute
chaı̂nes ch1 et ch2 , s’interprète comme ch1 est plus petite que ch2 selon l’ordre lexicogra-
phique (celui du dictionnaire). Attention : le caractère “a” n’est pas égal à “A”.
Les opérateurs logiques utilisés pour les valeurs de type booléen sont :
and : conjonction
or : disjonction
not : négation
Lorsqu’une expression complexe comporte plusieurs opérateurs, les priorités des opé-
rateurs (ou précédence des opérateurs) déterminent l’ordre d’exécution des opérations.
Cet ordre peut affecter considérablement la valeur du résultat. Un opérateur de priorité
élevée est évalué avant un opérateur de priorité basse. Lorsque deux opérateurs dans une
expression ont le même niveau de priorité, ils sont évalués de gauche à droite en fonction
de leur position dans l’expression. En règle générale
— les opérateurs arithmétiques de multiplication et de division sont prioritaires sur
les opérateurs arithmétiques d’addition et de soustraction ;
— les opérateurs arithmétiques sont prioritaires sur les opérateurs de comparaison ;
— les opérateurs de comparaison sont prioritaires sur les opérateurs logiques ;
— l’opérateur logique and est prioritaire sur l’opérateur or.
Pour modifier la priorité habituelle des opérateurs dans une expression il faut utiliser
des parenthèses. Tout ce qui se trouve entre parenthèses est évalué en premier pour pro-
duire une seule valeur, qui est ensuite utilisée par un opérateur en dehors des parenthèses.

Exemple 2. L’expression 2 + 3 × 4 est calculée comme l’expression (2 + (3 × 4)) car la


multiplication est prioritaire sur l’addition.
L’expression 5 × 6 : 3 est calculée comme l’expression ((5 × 6) : 3) car la multiplication
et la division ont la même priorité et l’évaluation se fait de gauche à droite. L’expression
age = 16 + 5 or age = 20 and ville = ’Paris’
est calculée comme l’expression
((age = (16 + 5)) or ((age = 20) and (ville = ’Paris’)))
car l’opérateur arithmétique d’addition est prioritaire sur tous les autres opérateurs, l’opé-
rateur de comparaison = est prioritaire par rapport aux opérateurs logiques et l’opérateur
and est prioritaire sur l’opérateur or.

La valeur NULL
L’absence de valeur d’une colonne dans une ligne d’une table se signalera par l’affec-
tation de la valeur conventionnelle NULL à cette colonne.

13
On peut imposer l’interdiction d’assigner la valeur NULL à une colonne : cette colonne
sera alors une colonne obligatoire. Si la valeur NULL est autorisée, cette colonne sera dite
facultative.

Contrainte : Toute tentative d’insérer une ligne qui ne posséderait pas de valeur pour
une colonne obligatoire serait automatiquement signalée comme une erreur.

Exemple 3. Dans la table client de la BD client commande la colonne CAT, pour


catégorie de client, est une colonne facultative. Si au moment de l’enregistrement d’un
client la valeur de la catégorie de ce client n’est pas connue, alors il est possible de ne pas
renseigner cette colonne pour ce client et c’est le marqueur NULL qui sera enregistré.

Remarque : La valeur NULL a un statut particulier par rapport aux autres valeurs, son
usage entraı̂ne de multiples difficultés et certains auteurs recommandent de l’éviter.

1.5 Clé
Une ligne dans une table regroupe des informations sur une entité. Il est primordial de
pouvoir identifier de manière unique une ligne dans une table à l’aide d’un identifiant ou
une clé (key en anglais).

1.5.1 Clé primaire


Parmi les identifiants d’une table, l’un est déclaré identifiant primaire ou clé primaire
(primary key en anglais).
La clé primaire d’une table impose une contrainte d’unicité : le SGBD rejettera auto-
matiquement toute tentative d’insertion d’une ligne dont la valeur de la clé primaire est
déjà présente dans la table.
Une clé primaire peut être composée de plusieurs colonnes, qui doivent toutes être
obligatoires.
Il est recommandé de toujours déclarer une clé primaire dans une table.

Exemple 4. La clé primaire de la table employe de la base de données gie agricole 3


est représentée par la colonne Emp Nss qui contient les numéros de sécurité sociale des
employés, qui sont donc uniques.
La clé primaire de la table detail de la base de données client commande 4 est
représentée par le couple de deux colonnes NCOM et NPRO, ce qui impose qu’on ne pourra
pas enregistrer deux lignes ayant le même numéro de commande et le même numéro de
produit (voir aussi l’exemple 8, page 16).
La clé primaire de la table intervention de la base de données gie agricole 5
est représentée par ses trois premières colonnes.
3. voir la figure 1.4, page 10
4. voir la figure 1.2, page 8
5. voir la figure 1.4, page 10

14
1.5.2 Clés étrangères
Dans une table, appelée table enfant, une de ses colonnes, appelée clé étrangère (fo-
reign key en anglais), peut faire référence à la colonne qui est clé primaire dans une autre
table, appelée table parent. Le couple constitué par une clé étrangère de la table enfant et
la clé primaire de la table parent permet de relier des lignes dans des tables distinctes.

Exemple 5. La table parcelle (table enfant) de la base de données gie agricole 6


a été définie avec une clé étrangère représentée par la colonne Par Prop qui fait référence
à la clé primaire Agr Id de la table agriculteur (table parent). Ceci implique que
pour une ligne de la table parcelle, la valeur de la colonne Par Prop permet de relier
cette ligne à une ligne de la table agriculteur.
Pour la version de la BD de la figure 1.5, sur la troisième ligne de la table parcelle,
la valeur 1 dans la colonne Par Prop permet de relier la parcelle décrite sur cette ligne,
Plan des Bauges, avec la première ligne de la table agriculteur, en retrouvant ainsi
toutes les informations concernant l’agriculteur : son nom (Dulhac), son prénom et son
adresse.

Exemple 6. La table detail (table enfant) de la base de données client commande 7


a deux clés étrangères :
1. la colonne NCOM, appelée dans la suite FK1, qui fait référence à la clé primaire,
la colonne NCOM, de la table commande (table parent) ;
2. la colonne NPRO, appelée dans la suite FK2, qui fait référence à la clé primaire
NPRO, de la la table produit (table parent’).
Pour la version de la BD de la figure 1.3, pour la dernière ligne de la table detail
— la valeur 30188 dans la colonne NCOM permet de relier cette ligne avec la dernière
ligne de la table commande en retrouvant ainsi la date de la commande, le 3
janvier 2009 (par la clé FK1).
— la valeur PH222 dans la colonne NPRO permet de relier cette ligne avec l’avant-
dernière ligne de la table produit en retrouvant ainsi toutes les informations
concernant le produit PL. HETRE 200x20x2 (par la clé FK2).

On notera que le nom d’une colonne formant une clé étrangère peut être le même ou
non de celui de la clé primaire à laquelle elle fait référence.
Pour qu’une clé étrangère joue correctement le rôle de référence, il est nécessaire que
l’ensemble de ses valeurs dans la table enfant soit un sous-ensemble des valeurs de la
clé primaire de la table parent. Cette propriété est appelée contrainte référentielle (voire
aussi le §1.6.3, page 16). Elle est garantie par le SGBD pour autant qu’on ait explici-
tement déclaré les clés étrangères (c.à.d. créer les relations avec les clés primaires aux-
quelles elles font référence) : toute opération qui conduirait à violer cette contrainte serait
automatiquement rejetée.

6. voir la figure 1.4, page 10


7. voir la figure 1.2, page 8

15
1.6 Modification et contraintes d’intégrité
Les colonnes obligatoires, les clés primaires et les clés étrangères, imposent aux
données des contraintes qui doivent toujours être satisfaites. Ces contraintes, désignées
généralement sous le terme de contraintes d’intégrité, seront donc prises en compte lors
de toute tentative de modification sur les données. Ajouter une ligne, supprimer une ligne
ou modifier une valeur de colonne d’une ligne sont des opérations qui ne sont autorisées
que si ces contraintes sont toujours respectées par les données après ces opérations. Si ces
contraintes sont violées, on dit que les données ont perdu leur intégrité.

1.6.1 Contraintes imposées par les colonnes obligatoires


Si une colonne est déclarée obligatoire, chaque ligne doit en posséder une valeur. Lors
des opérations de création et de modification de lignes, cette colonne devra reçevoir une
valeur, à l’exclusion de la valeur NULL.

1.6.2 Contraintes d’unicité imposées par les clés primaires


Une clé primaire (cf. §1.5.1) impose une contrainte d’unicité signifiant qu’à tout ins-
tant les lignes d’une table possèdent des valeurs distinctes pour la ou les colonnes consti-
tuant la clé.
— La création d’une ligne est autorisée s’il n’existe pas de ligne possédant la même
valeur pour la clé primaire.
— Pour la suppression d’une ligne il n’y a pas de contrainte.
— La modification de la clé primaire d’une ligne est autorisée s’il n’existe pas déjà
une ligne possédant cette nouvelle valeur de la clé primaire.
Exemple 7. La clé primaire de la table client de la BD client commande 8 est
représentée par la colonne NCLI.
Pour la version de la BD de la figure 1.3, la création d’une nouvelle ligne ayant comme
valeur C123 dans la colonne NCLI n’est pas autorisée car il existe déjà une ligne, la
sixième, dans cette table ayant cette valeur dans la colonne NCLI.
Exemple 8. La clé primaire de la table detail de la BD client commande 9 est
représentée par le couple de deux colonnes NCOM et NPRO.
Pour la version de la BD de la figure 1.3, la création d’une ligne ayant comme valeur
30188 dans la colonne NCOM et PH222 dans la colonne NPRO n’est pas autorisée car il
existe déjà une ligne, la dernière, ayant ces valeurs pour la clé primaire.

1.6.3 Contraintes référentielles imposées par les clés étrangères


Une contrainte référentielle précise que dans une table enfant chaque colonne iden-
tifiée comme étant une clé étrangère doit à tout instant, pour chaque ligne, contenir une
valeur correspondant à la valeur d’une clé primaire dans une ligne de la table parent.
8. voir la figure 1.2, page 8
9. voir la figure 1.2, page 8

16
Exemple 9. La clé étrangère de l’exemple 5 page 15 pour la BD gie agricole impose
que dans la colonne Par Prop de la table parcelle les seules valeurs acceptées soient
celles déjà présentes dans la colonne Agr Id de la table agriculteur.
Exemple 10. Les deux clés étrangères présentées dans l’exemple 6 page 15 pour la BD
client commande impose deux contraintes référentielles :
1. la première, cf. FK1, indique que toute valeur de la colonne NCOM dans detail
doit faire référence à une valeur de la colonne NCOM de la table commande ;
2. la seconde, cf. FK2, indique que toute valeur de la colonne NPRO dans detail
doit faire référence à une valeur de la colonne NPRO de la table produit.
Exemple 11. La table commande (table enfant) de la BD client commande doit
respecter la contrainte référentielle donnée par la colonne NCLI identifiée comme étant
une clé étrangère, appelée FK3, qui fait référence à la colonne NCLI de la table client
(table parent) : dans la colonne NCLI de la table commande les seules valeurs acceptées
sont celles déjà présentes dans la colonne NCLI de la table client.
La suppression dans la table parent d’une ligne référencée par d’autres lignes dans
une table enfant sera exécutée selon une des stratégies possibles suivantes, appelées delete
mode :
— blocage : la suppression de la ligne dans la table parent est refusée ;
— cascade : la suppression de la ligne dans la table parent est accompagnée de la
suppression des lignes correspondantes dans la table enfant ;
— indépendance : la suppression de la ligne dans la table parent est accompagnée
par la mise à NULL des colonnes correspondant aux clés étrangères des lignes
concernées dans la table enfant.
Exemple 12. Dans la base de données client commande la table detail a pour clé
primaire le couple de colonnes (NCOM, NPRO) (voir aussi l’exemple 4) et doit respecter
les deux contraintes référentielles données dans l’exemple 10. Les conséquences sur la
modification de cette table sont les suivantes :
1. La création d’une ligne dans la table detail est autorisée seulement si :
(a) la valeur de la colonne NCOM de cette nouvelle ligne existe dans la colonne
NCOM de la table commande (cf. FK1) ;
(b) la valeur de la colonne NPRO de cette nouvelle ligne existe dans la colonne
NPRO de la table produit (cf. FK2) ;
(c) le couple de valeurs (NCOM, NPRO) n’existe pas déjà dans une ligne de la table
detail (voir aussi l’exemple 7).
2. La suppression d’une ligne dans la table detail est autorisée.
3. La modification de la clé primaire d’une ligne dans la table detail, c’est-à-
dire le couple de valeurs (NCOM, NPRO), est autorisée seulement si ces valeurs
respectent les contraintes 1(a), 1(b) et 1(c) vues ci-dessus.
Exemple 13. Dans la base de données client commande, la table commande
i) a pour clé primaire la colonne NCOM,

17
ii) est la table parent dans la clé étrangère FK1 (voir aussi l’exemple 6), et
iii) est la table enfant dans la clé étrangère FK3 (voir aussi l’exemple 11).
Les conséquences sur la modification de cette table sont les suivantes :
1. La création d’une ligne dans la table commande est autorisée seulement si :
(a) la valeur de la colonne NCOM de cette nouvelle ligne n’existe pas déjà dans une
ligne de la table commande (NCOM est clé primaire) ;
(b) la valeur de la colonne NCLI de cette nouvelle ligne existe dans la colonne
NCLI de la table client (cf. FK3).
2. Si la stratégie de suppression est en mode blocage, alors la suppression d’une ligne
lcomm dans la table commande est autorisée seulement s’il n’existe pas de lignes
dans la table detail qui font référence à cette ligne lcomm (cf. FK1).
3. La modification de la clé primaire d’une ligne dans la table commande, c’est à
dire la valeur de la colonne NCOM, est autorisée seulement si cette valeur respecte
la contrainte 1(a).

Exemple 14. Dans la base de données client commande, la table client a pour
clé primaire la colonne NCLI et elle est la table parent dans la clé étrangère FK3. Les
conséquences sur la modification de cette table sont les suivantes :
1. La création d’une ligne dans la table client est autorisée seulement si la valeur
de la colonne NCLI de cette nouvelle ligne n’existe pas déjà dans une ligne de la
table.
2. Si la stratégie de suppression est en mode blocage, alors la suppression d’une ligne
lcli dans la table client est autorisée seulement s’il n’existe pas de lignes dans
la table commande qui font référence à cette ligne lcli (cf. FK3).
3. La modification de la clé primaire d’une ligne dans la table client, c’est à dire
la valeur de la colonne NCLI, est autorisée seulement si cette valeur n’existe pas
déjà dans une ligne de la table client.

Exemple 15. Dans la base de données client commande, si la stratégie de suppres-


sion est en mode cascade pour les clés étrangères FK3 et FK1, alors la suppression d’une
ligne dans la table client sera accompagnée de la suppression de toutes les lignes de
la table commande qui y font référence (c.à.d. toutes les commandes de ce client), ainsi
que la suppression de toutes les lignes concernées de la table detail (c.à.d. toutes les
lignes de toutes les commandes de ce client).

1.7 Schéma et contenu d’une base de donnée


Une base de données est composée de deux parties distinctes : son schéma et son
contenu.
Le schéma d’une base de données spécifie la liste des tables et pour chacune son
nom, la liste de ses colonnes, sa clé primaire et, éventuellement, sa/ses clé(s) étrangère(s).
Pour chaque colonne il faut spécifier son nom, son type et préciser si c’est une colonne
obligatoire ou non.

18
Le contenu d’une base de données à un instant t est l’ensemble des lignes de toutes
ses tables.
Le contenu d’une base de données réelle est généralement volumineux (plusieurs
millions de lignes) et est susceptible d’évoluer constamment. En revanche, le schéma
comporte un nombre limité d’éléments (quelques tables à quelques milliers de tables en
général) présentant une relative stabilité dans le temps : on ne modifie la structure d’une
base de données que lorsque la structure du domaine d’application à représenter évolue.
Il existe plusieurs conventions graphiques de représentation d’un schéma de BD,
parmi lesquelles les plus utilisées sont les suivantes :
1. Une table est représentée soit par un rectangle contenant le nom de la table et celui
de chaque colonne, en liste horizontale (à la mode “EXCEL”), soit par une boı̂te
dont le premier compartiment indique le nom de la table et ensuite les noms de ses
colonnes en liste verticale.
2. La clé primaire est soit soulignée d’un trait continu, soit elle est indiquée en gras,
soit elle est spécifiée par la clause “id :”.
3. Une clé étrangère est soit soulignée d’un trait pointillé, soit spécifiée par la clause
“ref :”.
4. Une contrainte référentielle est représentée par une flèche qui part du nom de la
colonne qui est une clé étrangère et qui pointe vers la clé primaire référencée dans
la table cible.

19
Exemple 16. La figure 1.7 donne trois représentations graphiques du schéma de la base
de données client commande, décrite dans le §1.1.

F IGURE 1.7 – Différentes représentations graphiques d’un même schéma d’une BD


(source : “Bases de données. Concepts, utilisation et développement” de Jean-Luc Hai-
naut).

F IGURE 1.8 – Le schéma de la base de données client commande.

20
1.8 Le langage SQL (Structured Query Language)
Les SGBD proposent un langage de requête dénommé SQL (Structured Query Lan-
guage). Présenté pour la première fois en 1973, ce langage a rapidement été adopté comme
standard potentiel et pris en charge par les organismes de normalisation ANSI et ISO qui
ont publié 3 normes : SQL-89, SQL-92 (dénommée aussi SQL2) et SQL : 1999 (SQL3).
Malheureusement, les éditeurs de SGBD ne respectent pas intégralement ces normes :
ils ne reprennent qu’un sous-ensemble de spécifications, modifient la syntaxe, voire l’in-
terprétation des concepts retenus, et ajoutent leur propres fonctions. Dans ce cours, nous
utiliserons la syntaxe SQL2 dans sa version SQLite.
Le langage de bases de données SQL est composé de deux sous-langages :
1. SQL DDL (Data Definition Language) pour la définition et la modification des
structures (table, colonne, contrainte). Les instructions sont : CREATE, ALTER, et
DROP ;
2. SQL DML (Data Manipulation Language) pour l’extraction et la modification des
données. Les instructions sont : SELECT, INSERT, DELETE, et UPDATE.
Une instruction SQL constitue une requête (en anglais query), c’est-à-dire la descrip-
tion d’une opération que le SGBD doit exécuter.
Une requête SQL peut être écrite en utilisant le clavier, générée à partir d’une interface
graphique, ou importée à partir d’un fichier. Le résultat de l’exécution d’une requête peut
apparaı̂tre à l’écran avec des éventuels messages d’erreurs. Dans la première partie de ce
cours, nous utiliserons cette formulation interactive des requêtes SQL.
Une requête peut également être envoyée par un programme (écrit en C, PHP ou Py-
thon, par exemple) au SGBD. Dans ce cas, le résultat de la requête est stocké par le SGBD,
ligne par ligne, dans les variables du programme. Dans la dernier partie du cours, nous
utiliserons du code Python pour envoyer des requêtes au SGBD et exploiter ensuite leurs
résultats dans des programmes.

21
1.9 Les systèmes de gestion de bases de données (SGBD)
La gestion d’une base de données est assurée par des logiciels spécialisés : les SGBD.
Les fonctions d’un SGBD sont les suivantes :
1. Organisation des données : le SGBD organise les données en tables stockées sur
disque et il crée les mécanismes garantissant un accès rapide aux données.
2. Gestion des données : le SGBD garantit l’évolution cohérente des données et il
vérifie que les contraintes (unicité, référence entre tables, etc.) sont respectées.
3. Accès aux données : le SGBD permet l’accès aux données à la fois par un utilisa-
teur occasionnel et par des programmes de traitement de données.
4. Gestion des accès concurrents : le SGBD permet l’accès simultané aux données
par des centaines voire des milliers d’utilisateurs. Il contrôle rigoureusement les
opérations simultanées sur les mêmes données.
5. Contrôle des accès : le SGBD garantit que seuls les utilisateurs autorisés peuvent
accéder aux données et les modifier.
Les différents SGBD sur le marché se différencient par le périmètre d’utilisation des
bases de données. Le périmètre influence le nombre d’utilisateurs simultanés, la taille
des bases de données et la puissance de calcul nécessaire. Certains SGBD, utilisés dans
les entreprises, supportent de très grandes bases de données et nécessitent des ordinateurs
puissants et très couteux. D’autres SGBD fonctionnent sur des ordinateurs personnels bon
marché, avec des limites quant à la taille des bases de données et la puissance de calcul.
Le marché des SGBD 10 se répartit entre :
1. des SGBD commerciaux (payants) :
— Oracle Database 11 ,
— DB2 Database Software 12 d’IBM,
— SQL Server 13 de Microsoft,
— Access 14 , édité par Microsoft, qui fait partie de la suite bureautique MS Office
Pro, etc.
2. des SGBD Open Source (ou libre) :
— SQLite 15 ,
— MySQL 16 ,
— PostgreSQL 17 , etc.
Dans ce cours, nous utiliserons le SGBD SQLite, un logiciel SGBD libre.
SQLite est une bibliothèque écrite en C qui propose un moteur de base de données
relationnelle accessible par le langage SQL. Contrairement aux serveurs de bases de
10. Pour en savoir plus sur les parts de marché consultez, par exemple, http://www.mysql.com/
why-mysql/marketshare/
11. http://www.oracle.com/fr/products/database/index.html
12. http://www-01.ibm.com/software/data/db2/
13. http://www.microsoft.com/france/serveur-cloud/sql/
14. http://office.microsoft.com/fr-fr/access/
15. https://www.sqlite.org/
16. http://www.mysql.fr/
17. http://www.postgresql.org/

22
données traditionnels, comme MySQL ou PostgreSQL, sa particularité est de ne pas
reproduire le schéma habituel client-serveur mais d’être directement intégrée aux pro-
grammes que l’on souhaite développer. L’intégralité de la base de données (déclarations,
tables, index et données) est stockée dans un fichier indépendant de la plateforme.

23
Chapitre 2

Les instructions du langage SQL

Dans la suite nous présentons une syntaxe simplifiée des instructions du langage SQL,
adaptée aux objectifs du cours. Le langage SQL est le standard utilisé pour la définition
du schéma d’une base de donnée et pour la manipulation des données.

2.1 Sites Web de référence pour SQL et SQLite


Une version complète de la syntaxe SQL DDL (Data Definition Language) se trouve,
par exemple, à l’adresse :
http://sqlpro.developpez.com/cours/sqlaz/ddl/
Pour consulter la syntaxe des instruction du SQL DML (Data Manipulation Language)
consultez les adresses suivantes :
http://sqlpro.developpez.com/cours/sqlaz/select/
http://sqlpro.developpez.com/cours/sqlaz/dml/
Sur le site de référence de SQLite se trouvent les instructions/commandes pour la
définition et la manipulation des données : https://www.sqlite.org/lang.html.

2.2 Le langage SQL DDL (Data Definition Language)


Le langage SQL DDL offre des commandes de définition et de modification des struc-
tures permettant de définir (créer), de supprimer et de modifier une table, une colonne ou
une contrainte.

2.2.1 Création d’un schéma


Une base de données est définie par son schéma. Pour créer un schéma vide (sans
tables), en SQLite il suffit de fournir un nom de fichier. En AgroPythia, cela est possible
par le menu Fichier Créer une base de données.

Exemple 17. Pour créer en SQLite la base de données client commande il faut créer
un nouveau fichier client commande.sqlite. Cette opération produit une nouvelle
BD, sans tables.

24
2.2.2 Création d’une table (CREATE TABLE)
Pour créer une table, le langage SQL propose l’instruction CREATE TABLE :
CREATE TABLE nom_table
( nom_colonne type,
nom_colonne type,
...
nom_colonne type )
Il faut spécifier le nom de la nouvelle table, nom table, ainsi que la description de ses
colonnes : pour chaque colonne il faut spécifier son nom, nom colonne, et le type de
ses valeurs. Sur les colonnes on peut ajouter des contraintes :
— pour définir une colonne obligatoire, il faut ajouter NOT NULL après sa définition ;
— pour définir une clé primaire, il faut ajouter PRIMARY KEY ;
— pour définir une clé étrangère, il faut ajouter
FOREIGN KEY REFERENCES table cible (colonne).
Cette opération produit une table vide (c’est-à-dire sans lignes).

Les colonnes et leurs types


SQL offre divers types de données, dits de base, possibles pour une colonne d’une
table. On citera les principaux :
— smallint : entier signé court ;
— integer ou int : entier signé long ;
— numeric(p,q) : nombre décimaux de p chiffres dont q après le point décimal ;
si elle n’est pas mentionnée, la valeur de q est 0 ;
— decimal(p,q) : nombre décimaux d’au moins p chiffres dont q après le point
décimal ; si elle n’est pas mentionnée, la valeur de q est 0 ;
— float(p) ou float : nombre en virgule flottante ;
— character(p) ou char : chaı̂ne de longueur fixe de p caractères ;
— character varying ou varchar(p) : chaı̂ne de longueur variable de p
caractères ;
— date : date (année, mois et jour) ;
— time : instant (heure, minute, seconde, millième de seconde) ;
La norme SQL 3 (1999) a rajouté 3 types fondamentaux : booléen, CLOB et BLOB.
— boolean : type de données valant vrai ou faux ;
— les Binary Large Objects (BLOB) : sorte de contenants génériques pouvant ac-
cueillir des chaı̂nes de bits de longueur non-bornée telles que des images, séquences
vidéo, séquences sonores ou musicales. Les Character Large Objects (CLOB) sont
similaires, mais considérés comme étant formés de caractères ; ce type est utilisé
pour stocker des textes de taille importante.
Exemple 18. Pour créer dans la base de données client commande la table client,
la commande SQLite est la suivante :
1 CREATE TABLE client (
2 NCLI char(8) NOT NULL PRIMARY KEY,

25
3 NOM char(18) NOT NULL,
4 ADRESSE char(24) NOT NULL,
5 LOCALITE char(20) NOT NULL,
6 CAT char(2) DEFAULT NULL,
7 COMPTE decimal(9,2) NOT NULL
8 )

Pour créer la table detail, la commande SQLite est la suivante :


1 CREATE TABLE detail (
2 NCOM INTEGER NOT NULL,
3 NPRO char(10) NOT NULL,
4 QCOM int(11) NOT NULL,
5 PRIMARY KEY (NCOM,NPRO)
6 FOREIGN KEY (NCOM) REFERENCES commande (NCOM),
7 FOREIGN KEY (NPRO) REFERENCES produit (NPRO)
8 )

De plus, la mot clé AUTOINCREMENT noté après la définition d’une colonne de type
entier s’avère particulièrement utile pour les clés primaires et permet d’attribuer à chaque
nouvelle ligne (enregistrement) un numéro unique qui s’incrémente automatiquement. Il
est particulièrement utile lorsque la valeur de la clé n’a pas de sens particulier pour l’entité
décrite.
Le mot clé DEFAULT quant a lui sera utilisé pour préciser une valeur pour défault
pour une colonne.

Exemple 19. Pour créer la table commande, la commande SQLite est la suivante :
1 CREATE TABLE commande (
2 NCOM INTEGER PRIMARY KEY AUTOINCREMENT,
3 NCLI char(10) NOT NULL,
4 Date TEXT NOT NULL DEFAULT NO_Date,
5 FOREIGN KEY (NCLI) REFERENCES client (NCLI)
6 )

2.2.3 Suppression d’une table (DROP)


Pour supprimer une table, le langage SQL propose l’instruction suivante :

DROP nom_table

Attention : Toutes les données ainsi que la structure de la table seront perdues à la suite
de cette opération !

2.2.4 Modification du schéma


La modification du schéma d’une base de données implique le plus souvent des modi-
fications de données. Par exemple, l’ajout d’une colonne à une table contenant des lignes
est suivi de la modification de cette colonne pour chacune des lignes (mises à NULL
ou à la valeur par défaut). Pour pouvoir être appliquées, ces opérations de modification

26
doivent respecter les contraintes d’intégrité définies dans la table. Nous donnons quelques
exemples de règles :
• Ajout d’une colonne. Si la colonne est facultative, l’opération s’effectue sans con-
trainte. Si elle est obligatoire, alors la table doit être vide ou la colonne doit être
accompagnée d’une valeur par défaut.
• Suppression d’une colonne. Cette colonne ne peut pas intervenir dans la compo-
sition d’une clé primaire ou d’une clé étrangère. Si nécessaire, ces clés doivent
d’abord être modifiées ou supprimés.
• Ajout d’une clé primaire. Si la table n’est pas vide, les lignes doivent respecter la
contrainte d’unicité.
• Suppression d’une clé primaire. Cette suppression n’est pas soumise à des condi-
tions sur les données. Cependant, cette clé primaire ne doit pas être référencée par
une clé étrangère.
• Ajout d’une clé étrangère. Si la table n’est pas vide, les lignes doivent respecter la
contrainte référentielle.
Attention ! A cause de toutes ces règles, la modification du schéma d’une base de
données n’est pas une opération fréquente et doit être effectuée avec précautions.

2.3 Le langage SQL DML (Data Manipulation Language)


Le langage SQL DML (Data Manipulation Language) comporte deux grandes classes
de fonctions : l’extraction de données et la modification de données.

2.3.1 Extraction de données


L’extration 1 de données fait l’objet d’une seule commande : la requête select.
Une requête select simple contient trois parties principales :

1. la clause select précise le nom des colonnes dont on veut récupérer les valeurs
dans le résultat de la requête,
2. la clause from indique la ou les tables sur lesquelles portent la requête. Toutes
les colonnes de la clause select doivent appartenir à une des tables de la clause
from.
3. la clause where spécifie les conditions de sélection des valeurs du résultat de la
requête. Cette partie de la requête est facultative.

L’exécution d’une requête select directement en SQLite sans insertion dans un


programme, produit un résultat qui est une table volatile : ses lignes sont envoyées à
l’écran, mais cette table n’est pas créée dans la base de données.

1. Une donnée extraite reste dans la base de données, on en extrait une copie ! La commande delete
est utilisée pour extraire (effacer) une donnée.

27
2.3.2 Extraction simple (SELECT-FROM)
La requête select la plus simple, appelée projection, n’a pas de clause where et
permet l’affichage de toutes les lignes d’une table, mais en ne montrant que certaines
colonnes. Sa forme générale est :

SELECT liste_colonnes
FROM nom_table

Exemple 20. Pour la base de données client commande, la requête


1 SELECT NCLI, NOM, LOCALITE
2 FROM client

affiche pour toutes les lignes de la table client seulement les valeurs des trois colonnes
NCLI, NOM, et LOCALITE.
Pour obtenir les valeurs de toutes les colonnes, la requête est :
1 SELECT *
2 FROM client

2.3.3 Extraction de lignes sélectionnées (SELECT-FROM-WHERE)


Une requête de sélection contient dans la clause where des conditions qui permettent
de ne sélectionner que certaines lignes d’une table. Sa forme générale est :

SELECT liste_colonnes
FROM nom_table
WHERE condition

Exemple 21. Pour la base de données client commande, la requête


1 SELECT NCLI, NOM
2 FROM client
3 WHERE LOCALITE = ’ T o u l o u s e ’

n’affiche que les lignes de la table client dont la valeur de la colonne LOCALITE est
égale à la chaı̂ne de caractères ’Toulouse’. De plus, seules les valeurs des colonnes NCLI
et NOM seront affichées.

Conditions de sélection
Dans la clause where, pour construire la condition de sélection on dispose :
— des noms des colonnes de la table nom table ;
— des opérateurs du §1.4 ;
— des constantes :
• numériques et décimales, comme par exemple : 123, -0.003, 7.12 ;
• chaı̂nes de caractères : valeurs entre ’ et ’ (exemple : ’Jean Mercier’) ;
la présence du caractère ’ dans la chaı̂ne se représente par son redoublement
(exemple : ’rue de l’’Eté’) ;

28
• dates : ’2009-02-14’ (standard SQL 2) ; autres variantes selon les SGBD :
’14-02-2009’, ’14/02/2009’.
Pour les expressions composées, l’usage des parenthèses permet de former des condi-
tions plus élaborées, comme par exemple :
1 SELECT NCLI, NOM
2 FROM client
3 WHERE COMPTE >0 AND (CAT = ’ C1 ’ OR LOCALITE = ’ P a r i s ’)

Conditions de sélection plus complexes


Une condition peut porter sur la présence de la valeur NULL :
1 CAT is null
2 CAT is not null

ou sur l’appartenance à un ensemble :


1 CAT in ( ’ C1 ’, ’ C2 ’, ’ C3 ’)
2 LOCALITE not in ( ’ T o u l o u s e ’, ’ Namur ’, ’ B r e d a ’)

ou encore sur la présence de certains caractères dans une valeur :


1 CAT like ’ 1 ’
2 ADDRESSE like ’%Neuve%’

Dans les deux dernières conditions, le signe ’ ’ désigne un caractère quelconque et ’%’
désigne toute suite de caractères, éventuellement vide.

2.3.4 Le resultat d’une requête


Lignes dupliquées dans le résultat (clause DISTINCT)
Pour éliminer les lignes en double dans le résultat d’une requête, on utilise la clause
distinct
1 SELECT distinct LOCALITE
2 FROM client

Ordre des lignes d’un résultat (clause ORDER BY)


Il est possible d’imposer un ordre de présentation spécifique lors de l’affichage des
lignes du résultat d’une requête en utilisant la clause order by :

SELECT liste_colonnes
FROM nom_table
WHERE condition
ORDER BY liste_colonnes DESC

Par défault, le classement se fait par ordre ascendant des valeurs. On peut également
spécifier explicitement un ordre ascendant (ASC) ou descendant (DESC).

29
Exemple 22. Pour la base de données client commande les lignes résultant de la
requête
1 SELECT *
2 FROM client
3 WHERE CAT is not null
4 ORDER BY LOCALITE

vont apparaı̂tre classées par ordre alphabétique croissant sur les noms des localités.
On peut indiquer plusieurs critères de tri :
1 SELECT *
2 FROM client
3 ORDER BY LOCALITE, CAT

Les clients vont apparaı̂tre classés par localité, puis dans chaque localité, classés par
catégorie.

L’ordre des composants du critère de tri est important. La requête


1 SELECT *
2 FROM client
3 ORDER BY CAT, LOCALITE

affiche les clients classés par catégorie, puis dans chaque catégorie, classés par localité.

2.3.5 Extractions et opérations sur les valeurs


La clause select permet aussi de spécifier des données calculées ou encore des
constantes. Dans l’exemple :
Exemple 23.
1 SELECT ’TVA de ’, NPRO, ’ = ’, 0.196*PRIX*QSTOCK
2 FROM produit
3 WHERE QSTOCK > 500

le résultat de la requête sera un tableau des montants TVA des articles en stock dont
la quantité restante est supérieure à 500 unités. Dans le résultat (voir Figure 2.1), les co-
lonnes reçoivent un nom qui est celui du composant de la clause SELECT (dans l’exemple
precedent TVA de).

F IGURE 2.1 – Le résultat de la requête de l’exemple 23.

On peut aussi, définir explicitement le nom qui apparait en début de colonne grâce à
la clause AS :

30
Exemple 24.
1 SELECT NPRO AS produit, 0.196*PRIX*QSTOCK AS ” m o n t a n t TVA”
2 FROM produit
3 WHERE QSTOCK > 500

le résultat de la requête sera toujours le même, mais les noms affichés seront ceux spécifiés
après la clause AS.

SQLite offre plusieurs fonctions permettant de dériver des valeurs à partir des valeurs
des colonnes des lignes extraites 2 .

Les fonctions agrégatives (ou statistiques)


Il existe des fonctions prédéfinies 3 qui donnent une valeur “agrégée” calculée pour
les lignes sélectionnées par la requête select :
• count(*) compte le nombre de lignes trouvées,
• count(nom colonne) compte le nombre de valeurs de la colonne nom co-
lonne, equivalent au nombre de lignes dans la colonne nom colonne
• avg(nom colonne) calcule la moyenne des valeurs de la colonne,
• sum(nom colonne) calcule la somme des valeurs de la colonne,
• min(nom colonne) calcule le minimum des valeurs de la colonne,
• max(nom colonne) calcule le maximum des valeurs de la colonne.
Il est à noter que ces fonctions, à l’exception de la première (count), ne considèrent que
les valeurs non NULL de la colonne. En outre, chaque valeur est prise en compte, même
si elle apparaı̂t plusieurs fois.

Exemple 25. Pour la base de données client commande la requête


1 SELECT count(*)
2 FROM client

compte le nombre de clients, la requête


1 SELECT count(NCLI)
2 FROM commande

compte le nombre de commandes, la requête


1 SELECT count(distinct NCLI)
2 FROM commande

compte le nombre de clients ayant passé au moins une commande, et la requête


1 SELECT sum(QSTOCK*PRIX)
2 FROM produit
3 WHERE LIBELLE like ’%SAPIN%’

calcule le montant total de produits de type sapin en stock.

Attention : La requête
2. voir https://www.sqlite.org/lang_corefunc.html pour une liste de celle-ci.
3. voir https://www.sqlite.org/lang_aggfunc.html.

31
1 SELECT MAX(DATECOM)
2 FROM commande

affiche bien la date de la dernière commande enregistrée dans la table commande, mais
la requête
1 SELECT MAX(DATECOM), NCOM
2 FROM commande

est fausse car elle ne permet pas de récupérer le numéro de cette dernière commande
(cf.Example 34.) !

2.3.6 Les sous-requêtes


Une sous-requête est une instruction select, cf. §2.3.3, qui intervient dans la clause
where d’une autre instruction select.

Exemple 26. Pour la base de données client commande, la requête


1 SELECT NCLI
2 FROM client
3 WHERE LOCALITE = ’ Namur ’

donne les identifiants des clients qui habitent à Namur. Elle est utilisée comme sous-
requête dans la requête
1 SELECT NCOM, DATECOM
2 FROM commande
3 WHERE NCLI in (SELECT NCLI
4 FROM client
5 WHERE LOCALITE = ’ Namur ’)

pour retrouver les commandes des clients qui habitent à Namur.

Exemple 27. Pour la base de données client commande, la requête


1 SELECT NOM, COMPTE
2 FROM client
3 WHERE COMPTE in (SELECT max(COMPTE)
4 FROM client)

affiche le nom et le compte du client qui a le compte de plus grande valeur.

Une sous-requête peut elle-même contenir une sous-requête.

Exemple 28. Pour la base de données client commande, la requête


1 SELECT NPRO
2 FROM detail
3 WHERE NCOM in (SELECT NCOM
4 FROM commande
5 WHERE NCLI in (SELECT NCLI
6 FROM client
7 WHERE LOCALITE = ’ Namur ’))

32
donne les références des produits des commandes des clients qui habitent à Namur.
Si la sous-requête renvoie une seule ligne, il est permis d’utiliser les opérateurs de
comparaison classiques, par exemple :
1 SELECT *
2 FROM client
3 WHERE COMPTE > (SELECT COMPTE
4 FROM client
5 WHERE NCLI = ’ C400 ’)

2.3.7 Jointure : extraction de données de plusieurs tables


Pour extraire des données corrélées, stockées dans deux tables, on utilise une jointure
(join en anglais), définie par une condition de jointure, spécifiant la règle selon laquelle
les lignes des tables sont reliées :
SELECT liste_colonnes
FROM nom_table_E, nom_table_P
WHERE col_FK_E = col_PK_P
AND condition
Dans la clause FROM on donne la liste des noms des tables à relier.
Dans la clause WHERE on donne la condition de jointure qui se présente sous la forme
d’une égalité entre les valeurs de deux colonnes : col FK E = col PK P, où
i) la colonne col FK E est la clé étrangère de la table nom table E (table enfant),
ii) la colonne col PK P est la clé primaire de la table nom table P (table parent),
et
iii) la table nom table P est la table parent référencée dans la table nom table E
par la clé étrangère col FK E.
Dans la clause WHERE, en plus de la condition de jointure (obligatoire !), on peut ajouter
d’autres conditions de sélection des valeurs dans la partie condition.
Exemple 29. Pour la base de données client commande, la requête
1 SELECT NCOM, DATECOM, NOM, LOCALITE
2 FROM commande, client
3 WHERE commande.NCLI = client.NCLI

affiche pour chaque commande de la table commande, le nom et la ville du client qui a
passé cette commande (voir la figure 2.2).
Les valeurs des colonnes NCOM et DATECOM sont extraites de la table commande
(table enfant) tandis que les valeurs des colonnes NOM et LOCALITE sont extraites de la
table client (table parent). La colonne commande.NCLI est une clé étrangère 4 de la
table commande et fait référence à la clé primaire client.NCLI de la table client.
Remarque 1 : Si les deux tables ont des colonnes qui ont le même nom, il faut le-
ver l’ambiguı̈té et préciser à quelle table appartient la colonne, en utilisant la syntaxe
suivante :
4. notée FK3 dans l’exemple 10, page 17

33
F IGURE 2.2 – Le résultat de la requête de l’exemple 29.

nom_table.nom_colonne
Remarque 2 : L’ordre des noms des tables dans la clause FROM ainsi que l’ordre des
conditions dans la clause WHERE n’a pas d’importance. La requête
1 SELECT NCOM, DATECOM, NOM, LOCALITE
2 FROM client, commande
3 WHERE client.NCLI = commande.NCLI

est la même que la requête de l’exemple 29 et que la requête suivante


1 SELECT NCOM, DATECOM, NOM, LOCALITE
2 FROM client, commande
3 WHERE commande.NCLI = client.NCLI

Le résultat d’une jointure entre deux tables est obtenu comme suit :
1. On construit une table (fictive) en couplant chaque ligne de la première table avec
chaque ligne de la seconde, sans prendre en compte la clause where. Si on lance
la requête de l’exemple 29 sur la base de données client commande contenant
les lignes données dans la figure 1.3, page 9, alors cette table fictive contient 9
colonnes (3 colonnes de la table commande, plus 6 colonnes de la table client),
et 112 lignes (112 = 7 x 16 : 7 lignes de la table commande, multiplié par 16 lignes
de la table client).
2. On sélectionne, parmi les lignes ainsi obtenues, celles qui vérifient la condition de
jointure. Pour l’exemple 29 on garde 7 lignes sur les 112.
3. On ne retient alors que les colonnes demandées. Quatre colonnes seront affichées
pour l’exemple 29.

Par extension, la jointure de trois tables réclamera deux conditions de jointure :


SELECT liste_colonnes
FROM nom_table_E, nom_table_P, nom_table_3
WHERE col_FK_E = col_PK_P
AND col_FK_E2 = col_PK_P2
AND condition

34
La deuxième condition de jointure, col FK E2 = col PK P2, spécifie la règle pour
relier la table nom table 3 à la table nom table E ou à la table nom table P.

Exemple 30. Pour la base de données client commande, la requête


1 SELECT NOM, commande.NCOM, detail.NPRO, detail.QCOM
2 FROM client, commande, detail
3 WHERE client.NCLI = commande.NCLI
4 AND detail.NCOM = commande.NCOM

affiche pour chaque client et pour chaque commande qu’il a passé le numéro de produit
et la quantité commandée.
Pour avoir aussi le libellé du produit il faut faire une requête avec la jointure de quatre
tables en imposant trois conditions de jointure
1 SELECT client.NOM, commande.NCOM, commande.DATECOM, detail.NPRO,
2 detail.QCOM, produit.LIBELLE
3 FROM client, commande, detail, produit
4 WHERE client.NCLI = commande.NCLI
5 AND detail.NCOM = commande.NCOM
6 AND detail.NPRO = produit.NPRO

Attention ! Une requête sans condition de jointure porte le nom de produit cartésien :
chaque ligne de la première table est couplée avec chaque ligne de la deuxième table.
Si dans la requête de l’exemple 29 on oublie d’imposer la condition de jointure, alors la
requête
1 SELECT NCOM, DATECOM, NOM, LOCALITE
2 FROM commande, client

est le produit cartésien des deux tables.


Si on lance cette requête sur la BD client commande contenant les lignes données
dans la figure 1.3, page 9, alors les 7 lignes de la table commande seront reliées à chacune
des 16 lignes de la table client et le résultat de cette requête contiendra 112 lignes
(112 = 7 × 16), ce qui, en général, ne correspond pas à ce qui était attendu.

2.3.8 Sous-requête ou jointure ?


La jointure et la sous-requête permettent d’exprimer des conditions d’association entre
lignes, basées le plus souvent sur l’égalité des valeurs d’une clé étrangère avec celle d’une
clé primaire.

Exemple 31. La requête de l’exemple 26


1 SELECT NCOM, DATECOM
2 FROM commande
3 WHERE NCLI in (SELECT NCLI
4 FROM client
5 WHERE LOCALITE = ’ Namur ’)

peut s’écrire également sous la forme d’une jointure :

35
1 SELECT NCOM, DATECOM
2 FROM commande, client
3 WHERE commande.NCLI = client.NCLI
4 AND LOCALITE = ’ Namur ’

Exemple 32. La requête de l’exemple 28


1 SELECT NPRO
2 FROM detail
3 WHERE NCOM in (SELECT NCOM
4 FROM commande
5 WHERE NCLI in (SELECT NCLI
6 FROM client
7 WHERE LOCALITE = ’ Namur ’))

peut s’écrire également sous la forme d’une jointure :


1 SELECT NPRO
2 FROM detail,commande, client
3 WHERE commande.NCOM = detail.NCOM
4 AND commande.NCLI = client.NCLI
5 AND LOCALITE = ’ Namur ’

Attention : Les structures de select emboı̂tés qui utilisent des conditions de non-
association (not in) ne peuvent pas s’exprimer par une jointure !
Exemple 33. La requête
1 SELECT NCOM, DATECOM, NCLI
2 FROM commande
3 WHERE NCOM not in (SELECT NCOM
4 FROM detail
5 WHERE NPRO = ’ PA60 ’)

désigne les commandes qui ne portent pas sur le produit PA60. Cette requête n’est pas
équivalente à la requête
1 SELECT distinct commande.NCOM, DATECOM, NCLI
2 FROM commande, detail
3 WHERE commande.NCOM = detail.NCOM
4 AND NPRO <> ’ PA60 ’

qui désigne les commandes qui portent au moins sur un produit différent de PA60 (mais
qui par ailleurs peuvent également porter sur le produit PA60).
Exemple 34. La requete
1 SELECT NCOM, DATECOM
2 FROM commande
3 WHERE DATECOM in (SELECT MAX(DATECOM)
4 FROM commande)

qui est une correction de la dernière requête du Section 2.3.5, ne peut pas être écrite sous
la forme d’une jointure.

36
2.3.9 Groupements (clause GROUP BY)
Pour extraire des données regroupées selon une certain valeur de colonne, on utilise
la clause GROUP BY :

SELECT liste_colonnes
FROM nom_table
WHERE condition
GROUP BY liste_colonnes

Exemple 35. Pour la base de données client commande, la requête suivante :


1 SELECT localite, count(*), avg(compte)
2 FROM client
3 GROUP BY localite

affiche pour chaque groupe de clients regroupés par localité, le nom de cette dernière, le
nombre de clients dans le groupe et la valeur moyenne des comptes des clients du groupe.
Le résultat compte autant de lignes qu’il y a de groupes ainsi constitués, et donc autant de
lignes qu’il y a de localités distinctes dans la table client.

Selection de groupes et selection de lignes (clause HAVING)


Des conditions de sélection peuvent être imposées aux groupes a sélectionner. Elles
seront exprimées dans une clause HAVING, ce qui évite toute confusion avec la clause
WHERE qui s’applique à chacune des lignes.

Exemple 36. Dans la requête suivante, on ne retient que les groupes d’au moins trois
clients :
1 SELECT localite, count(*), avg(compte)
2 FROM client
3 GROUP BY localite
4 having count (*) >= 3

Dans cette requête, la condition HAVING peut porter sur les élément cités dans la
clause SELECT, mais aussi sur toute autre fonction d’agrégation calculable sur chaque
groupe.

Exemple 37. La requête suivante traite les lignes de COMMANDE en les regroupant par
client :
1 SELECT NCLI, count(*)
2 FROM commande
3 GROUP BY NCLI

On ne retient ensuite que les groupes d’au moins deux commandes :


1 SELECT NCLI, count(*)
2 FROM commande
3 GROUP BY NCLI
4 HAVING count(*) >= 2

37
Dans le résultat on ne considère ensuite, avant groupement, que les commandes portant
sur le produit PA45. On s’intéresse aux clients qui ont commandé au moins deux fois le
produit PA45 (soit ici l’unique client C400).
1 SELECT NCLI, count(*)
2 FROM commande
3 WHERE NCOM in (SELECT NCOM
4 FROM detail
5 WHERE NPRO = ’ PA45 ’)
6 GROUP BY NCLI
7 HAVING count(*) >= 2

Sélection de groupes et jointures


On peut combiner la sélection de groupes avec des jointures pour répondre à des
questions plus complexes.
Exemple 38. Suivant l’exemple précédent, on peut obtenir la quantité total du produit
PA45 que chaque client a commandé :
1 SELECT NCLI, count(*), sum(QCOM)
2 FROM commande, detail
3 WHERE commande.NCOM = detail.NCOM
4 AND NPRO = ’ PA45 ’
5 GROUP BY commande.NCLI
6 HAVING count(*) >= 2

Exemple 39. La requête suivante :


1 SELECT produite.NPRO, QSTOCK - sum(detail.QCOM)
2 FROM detail, produit
3 WHERE detail.NPRO = produit.NPRO
4 GROUP BY produit.NPRO, QSTOCK

calcule la quantité qui resterait en stock pour chaque produit si on déduisait les quantités
commandées.
Dans l’exemple précédent, on observe la présence de QSTOCK dans le critère de grou-
pement. Ceci est nécessaire par son apparition dans la clause SELECT en dehors d’une
fonction d’agrégation.
Exemple 40. La requête ci-après calcule, pour chaque groupe de mêmes valeurs de
localite et NPRO, le montant total commandé :
1 SELECT localite, produit.NPRO, sum(QCOM*PRIX)
2 FROM client, commande, detail, produit
3 WHERE commande.NCLI = client.NCLI
4 and commande.NCOM = detail.NCOM
5 and detail.NPRO = produit.NPRO
6 GROUP BY localite, produit.NPRO

L’ordre des composants est indifférent : GROUP BY produit.NPRO, localite


donnerait le même résultat.

38
Exemple 41. La requête suivante constitue des groupes de clients selon leurs valeurs de
compte par intervalles de 1000 :
1 SELECT ” de ”, (compte/1000)*1000
2 ” a ” , (compte/1000)*1000,
3 count(*)
4 FROM client
5 GROUP BY (compte/1000)

F IGURE 2.3 – Le résultat de la requête de l’exemple 41.

2.3.10 Ajout de lignes dans une table (INSERT)


Pour ajouter une ligne dans une table on utilise l’instruction INSERT :

INSERT INTO nom_table (liste_colonnes)


VALUES (listes_valeurs)

Exemple 42. Pour la base de données client commande la requête


1 INSERT INTO detail (NCOM, NPRO, QCOM)
2 VALUES ( ’ 30185 ’, ’ PA45 ’, 12)

ajoute une ligne dans la table detail.

L’ordre des valeurs est le même que celui des colonnes. Toute colonne non spécifiée
dans la liste des colonnes prend la valeur NULL ou la valeur par défaut si celle-ci a été
déclarée comme propriété de la colonne. Toute colonne obligatoire (not null) doit
recevoir une valeur, sauf si on lui assigne une valeur par défaut lors de sa déclaration.
Chaque valeur peut être exprimée sous la forme d’une constante, ou plus généralement
de toute expression dont l’évaluation donne une valeur de même type que celui de la
colonne.
Dans tous les cas, les données insérées doivent respecter les contraintes d’intégrité
(unicité, intégrité référentielle, colonnes obligatoires) définies pour à la table dans laquelle
les nouvelles lignes sont insérées, cf. §1.6.

39
2.3.11 Suppression de lignes (DELETE)
L’instruction pour supprimer des lignes dans une table est DELETE :

DELETE FROM nom_table


WHERE condition

où le format de la condition de la clause where est le même que celui de l’instruction
select du §2.3.3.
Après l’opération, la base de données doit être dans un état qui respecte toutes les
contraintes d’intégrité (unicité, intégrité référentielle, colonnes obligatoires) auxquelles
elle est soumise et, en particulier, les contraintes référentielles.

Exemple 43. Pour la base de données client commande la requête


1 DELETE FROM detail
2 WHERE NCOM = ’ 30184 ’

efface les 2 lignes de la table detail pour lesquelles le numéro de commande est 30184.

2.3.12 Modification de lignes (UPDATE)


L’instruction pour modifier des valeurs dans les lignes d’une table est UPDATE :

UPDATE nom_table
SET nom_colonne = nouvelle_valeur,
...
nom_colonne = nouvelle_valeur,
WHERE condition

La modification sera effectuée sur toutes les lignes qui vérifient la condition de sélection.
Les nouvelles valeurs peuvent être obtenues par une expression arithmétique.

Exemple 44. Pour la base de données client commande, la requête


1 UPDATE produit
2 SET PRIX = PRIX * 1.05
3 WHERE LIBELLE like ’%SAPIN%’

enregistre une augmentation de prix de 5% pour les produits de type sapin.

40
Chapitre 3

Prise en main de l’environment de


développement

3.1 Pré-requis
Savoir utiliser un éditeur de texte basique (voir le paragraphe 3.3).
Savoir utiliser le poste de travail (structure arborescente des répertoires, compres-
sion/décompression de fichiers, taper au clavier). Ressource en ligne pour l’autoforma-
tion : http://www.agroparistech.fr/mmip/mc/agro/poste.html.
Savoir utiliser un navigateur pour Internet. Ressource en ligne pour l’autoformation :
http://www.agroparistech.fr/mmip/mc/agro/firefox.html.
Savoir utiliser la messagerie électronique. Ressource en ligne pour l’autoformation :
http://www.agroparistech.fr/mmip/mc/agro/messag.html.
Pas de pré-requis en bases de données.

3.2 AgroPythia
Dans les prochains TDs nous utiliserons une formulation interactive des requêtes SQ-
Lite avec l’application AgroPythia 1 . Vous pouvez télécharger l’application sur le site
web du cours http://www.agroparistech.fr/Systeme-d-Information.
html et la sauvegarder dans votre répertoire personnel. Une fois l’application enregistrée,
il suffit de double cliquer dessus pour l’executer.
A partir du menu Fichier d’AgroPythia on peut se connecter a une base de données ou
en créer une nouvelle (figure 3.1). Une fois connecté à une base de données, les différentes
tables de la base sont affichées dans différents onglet dans la partie en haut de l’interface.
La partie basse de l’interface permet de saisir les requêtes SQL sur n’importe quelles
tables de la base de données sélectionnée. Pour exécuter une requête, il suffit de cliquer sur
le bouton Exécuter en bas de l’écran (Figure 3.2). Le résultat de l’exécution de la requête
apparaı̂tra à l’écran avec des éventuels messages d’erreurs et, en l’absence d’erreurs, sera
enregistré dans un fichier texte nommée log file date bd.text avec date la date
de sauvegarde du fichier et bd le nom de la base de données sur laquelle la requête a éte
1. AgroPythia est un outil developpé par Christine Martin.

41
executée. Ce fichier de sauvegarde vous permet de conserver votre requête et son résultat
afin de pouvoir le réutiliser quand bon vous semble.

F IGURE 3.1 – Le menu de l’application AgroPythia. A partir du menu Fichier on peut se


connecter à une base de données ou en créer une nouvelle.

3.3 L’éditeur de texte Notepad++


Pour réaliser les exercices proposés dans les séances de travaux dirigés, il faut dispo-
ser d’un éditeur de texte pour enregistrer les solutions : Notepad++ 2 . Notepad++ 3 est
un éditeur de texte qui intègre la coloration syntaxique 4 de code source pour plusieurs
langages et fichiers (HTML, PHP, Matlab, etc).
Le projet Notepad++ est sous licence GNU GPL 5 .

2. Notepad++ peut être téléchargé sur http://sourceforge.net/projects/


notepad-plus/
3. Notepad++ peut être téléchargé sur http://sourceforge.net/projects/
notepad-plus/
4. les mots clés du langage ont une couleur spécifique
5. GNU General Public License est la licence de logiciel libre la plus utilisée

42
F IGURE 3.2 – L’application AgroPythia une fois connecté à une base de données. On
peut saisir les requêtes SQL dans la partie en bas et les exécuter en cliquant sur le bouton
Exécuter

3.3.1 Démarrage de Notepad++


Pour lancer Notepad++ sur votre poste de travail, il faut choisir dans le menu Démarrer
de Windows l’option Tous les programmes / Internet + Comm / Notepad++.

3.3.2 Créer un nouveau fichier


Pour créer un nouveau fichier en utilisant Notepad++ :
1. choisir dans le menu de Notepad++ l’option Fichier / Nouveau
2. enregistrer dès le début le fichier, dans le bon répertoire, avec une extension .sql
en utilisant l’option Fichier / Enregister sous ...
Attention ! La présence de l’extension dans le nom du fichier permet de spécifier le lan-
gage utilisé et de bénéficier de la coloration syntaxique qui y est associée.

3.3.3 Ouvrir un fichier existant


Pour ouvrir dans Notepad++ un fichier existant, il faut choisir dans le menu l’option
Fichier / Ouvrir ..., et retrouver ensuite le fichier sur le disque.

43
F IGURE 3.3 – Le résultat de l’exécution d’une requête en l’absence d’erreurs.

44
Chapitre 4

Travaux dirigés en BD

45
4.1 Requêtes simples sur une table
Pour effectuer ces exercices, vous devez avoir lu, avant de venir en TD, le chapitre 1
(pages 6 à 24), ainsi que les paragraphes de 2.3.1 à 2.3.4 (pages 27 à 31).

Premiers pas
En premier lieu, il vous faut récupérer l’archive archive BD.zip qui se trouve à l’adresse
http://www.agroparistech.fr/Systeme-d-Information.html et le sauvegar-
der dans votre repertoire personnel. Décompressez-le et lancez AgroPythia en double
cliquant sur son icône et connectez vous à la base de données client commande 1 .
En utilisant pour chaque table son onglet et sans faire de requêtes en SQL, répondez aux
questions suivantes :
1. Combien de lignes existent-ils dans chaque table ?
2. Quel est le prix du produit ’POINTE ACIER 60 (1K)’ ? Combien en reste-t-il en
stock ?
3. Quels sont les noms des clients de catégorie ’B1’ ?
4. Combien le client ’FERARD’ a-t-il passé de commandes ?
5. Combien le client ’VANBIST’a-t-il passé de commandes ?
6. Quel(s) produits(s) a commandé le client ’VANBIST’ et en quelle quantité ?
7. Pour chacune des colonnes ADRESSE, DATECOM, QSTOCK, COMPTE, NCOM
et NPRO précisez quel est son type et dans quelle table elle se trouve :
champs table type
ADRESSE

DATECOM

QSTOCK

COMPTE

NCOM

NPRO

Exercice 1a : exemples de requêtes


En utilisant l’éditeur de texte Notepad++ 2 , ouvrez le fichier exo 1 req simples.sql
1. voir le paragraphe 3.2, page 41
2. voir le paragraphe 3.3, page 42

46
qui se trouve dans le répertoire BD\TD que vous venez de télécharger.
On suppose que la BD client commande est sélectionnée, que son schéma est celui
de la figure 1.1, page 8, et que la version courante de la BD est celle de la figure 1.3.
Pour chaque requête donnée ci-dessous
Q.1.1. expliquez ce qu’elle fait et trouvez la réponse donnée par SQL, sans l’exécuter ;
Q.1.2. exécutez la requête 3 et comparez les résultats obtenus avec vos réponses.

Requête 1.1
1 SELECT *
2 FROM produit
3 WHERE LIBELLE LIKE ’%ACIER%’
4 ORDER BY PRIX

Requête 1.2
1 SELECT NCOM, DATECOM
2 FROM commande
3 WHERE NCLI = ’ C400 ’
4 AND DATECOM < ’ 2009−01−01 ’

Requête 1.3
1 SELECT NOM, ADRESSE, COMPTE
2 FROM client
3 WHERE COMPTE > 0
4 AND (CAT = ’ C1 ’ OR LOCALITE = ’ P a r i s ’)

Requête 1.4
1 SELECT NOM, ADRESSE, COMPTE
2 FROM client
3 WHERE COMPTE > 0 OR CAT = ’ C1 ’ AND LOCALITE = ’ P a r i s ’

Q.1.3. En supposant maintenant que le contenu des tables n’est pas connu, exprimez le
résultat de ces requêtes “en français” (voir les exemples 20 et 21, page 28).
Q.1.4. Dans l’expression
COMPTE > 0 OR CAT = ’C1’ AND LOCALITE = ’Paris’
dans quel ordre sont évalués les opérateurs logiques OR et AND ?

R1 : ((COMPTE > 0 OR CAT = ’C1’) AND LOCALITE = ’Paris’)


ou
R2 : (COMPTE > 0 OR (CAT = ’C1’ AND LOCALITE = ’Paris’))
Justifiez votre réponse.
3. Copiez la requête á partir du fichier (CTRL+C dans Notepad++), la coller (CTRL+V) en AgroPythia
et l’exécuter.

47
Exercice 1b : requêtes simples sur la base de données client commande
En utilisant l’application AgroPythia écrivez les requêtes SQL qui répondent aux ques-
tions suivantes. Enregistrez ces requêtes dans le fichier exo 1 req simples.sql.

Q.1.5. Affichez par ordre alphabétique la liste des localités où habitent les clients.
Q.1.6. Affichez les commandes passées pendant les dix derniers jours de l’année 2008.
Q.1.7. Affichez le stock de chaque produit de type sapin.
Q.1.8. Affichez les produits dont le prix est inférieur à 200 et le stock est supérieur à 150.
Q.1.9. Affichez le numéro, le nom et la localité des clients de catégorie B1 n’habitant pas
à Paris.

Exercice 1c : requêtes sur la BD gie agricole


Connectez-vous à la base de données gie agricole.
Écrivez les requêtes SQL qui répondent aux questions suivantes. Enregistrez ces requêtes
dans le fichier exo 1 req simples.sql.

Q.1.10. Affichez pour ordre alphabétique la liste des noms des agriculteurs.
Q.1.11. Affichez la liste des noms des parcelles dont la superficie est supérieure à 500.
Q.1.12. Affichez toutes les informations concernant les parcelles situées à Arith dont la
superficie est supérieure à 200 et inférieure à 500.

Pour terminer ces exercices


— Vérifiez que vous avez bien enregistré vos requêtes dans le fichier exo 1 req
simples.sql.
— Mettez à jour la date (ligne 4) et l’auteur (ligne 5) du fichier.
— Enregistrez ce fichier dans votre répertoire.

Questions de révision
Q.R.1

On suppose que la base de données gie agricole (cf. figure 1.4) est sélectionnée.
Expliquez ce que fait la requête suivante et trouvez la réponse donnée par AgroPythia sur
la version courante de la BD (cf. figure 1.5) :
1 SELECT * FROM parcelle
2 WHERE Par_Lieu LIKE ’%Mont%’ AND Par_Superficie >300

Réponse

48
Q.R.2
On suppose que la base de données client commande (cf. figure 1.2) est séle-
ctionnée. Expliquez ce que fait la requête suivante et trouvez les réponses données par
AgroPythia sur la version courante de la BD (cf. figure 1.3) :
1 SELECT LIBELLE, PRIX, QSTOCK FROM produit
2 WHERE PRIX < 100 AND QSTOCK > 0

Réponse

Q.R.3
Expliquez ce que fait la requête suivante et trouvez les réponses données par AgroPy-
thia sur la version courante de la BD (cf. figure 1.3) :
1 SELECT LIBELLE, PRIX, QSTOCK FROM produit
2 WHERE PRIX < 100 OR QSTOCK > 0

Réponse

Q.R.4
Quelle est la syntaxe générale d’une requête simple d’extraction ?
Réponse

49
4.2 Données extraites et fonctions agrégatives
Pour effectuer ces exercices, vous devez avoir lu, avant de venir en TD, le paragraphe
2.3.5 (pages 31 et suivantes).

Exercice 2a : exemples de requêtes


On suppose que vous êtes connecté á la BD client commande, que son schéma est
celui de la figure 1.1, page 8, et que la version courante de la BD est celle de la figure 1.3.
En utilisant l’éditeur de texte Notepad++ 4 , ouvrez le fichier
exo 2 req fonctions.sql.
Pour chaque requête donnée ci-dessous
Q.2.1. expliquez ce qu’elle fait et trouvez la réponse donnée par SQL, sans l’exécuter ;
Q.2.2. exécutez la requête 5 et comparez les résultats obtenus avec vos réponses.
ATTENTION! Le contenu de la base de données sera modifié !

Requête 2.1
1 SELECT nom, max(COMPTE)
2 FROM client

Requête 2.2
1 SELECT count(distinct commande.NCOM)
2 FROM commande, detail, produit
3 WHERE commande.NCOM = detail.NCOM
4 AND detail.NPRO = produit.NPRO
5 AND LIBELLE like ’%ACIER%’

Requête 2.3
1 SELECT sum(QCOM*PRIX) as MONTANT
2 FROM detail, produit
3 WHERE detail.NPRO = produit.NPRO
4 AND LIBELLE like ’%ACIER%’

Requête 2.4
1 SELECT LIBELLE, PRIX as PrixUnitaire, QCOM, QCOM*PRIX as SousTotal
2 FROM detail, produit
3 WHERE detail.NPRO = produit.NPRO
4 AND NCOM = ’ 30179 ’

Q.2.3. En supposant maintenant que le contenu des tables n’est pas connu, exprimez le
résultat de ces requêtes “en francais” (voir les exemples 20 et 21, page 28).
4. voir le paragraphe 3.3, page 42
5. Copiez la requête á partir du fichier (CTRL+C dans Notepad++), la coller (CTRL+V) en AgroPythia
et l’exécuter.

50
Exercice 2b : fonctions agrégatives sur la BD client commande
Ecrivez les requêtes SQL qui répondent aux questions suivantes. Enregistrez ces requêtes
dans le fichier exo 2 req fonctions.sql.
Q.2.4. Calculez le montant commandé des produits de type sapin.
Q.2.5. Calculez le nombre de produits (références) commandés de type sapin.
Q.2.6. Calculez le nombre d’unités de produits commandés de type sapin.
Q.2.7. Quel est le produit dont la quantité en stock est la plus faible ?
Q.2.8. Afficher la valeur total des stocks (sans tenir compte des commandes actuelles)

Exercice 2c : fonctions agrégatives sur la BD gie agricole


On suppose que vous êtes connecté à la BD gie agricole.
Ecrivez les requêtes SQL qui répondent aux questions suivantes. Enregistrez ces requêtes
dans le fichier exo 2 req fonctions.sql.
Q.2.9. Calculez le nombre de proprietaires de parcelles.
Q.2.10. Calculez la superficie totale des parcelles.
Q.2.11. Affichez le nom de la plus grande parcelle.

Pour terminer ces exercices


— Vérifiez que vous avez bien enregistré vos requêtes dans le fichier exo 2 req
simples.sql.
— Mettez à jour la date (ligne 4) et l’auteur (ligne 5) du fichier.
— Enregistrez ce fichier dans votre répertoire.

Questions de révision
Q.R.1
On suppose que la base de données gie agricole (cf. figure 1.4) st sélectionnée.
Expliquez ce que fait la requête suivante et trouvez la réponse donnée par AgroPythia sur
la version courante de la BD (cf. figure 1.5) :
1 SELECT Par_Nom FROM parcelle WHERE Par_Superficie IN
2 (SELECT min(Par_Superficie) FROM parcelle)

Réponse

Q.R.2
On suppose que la base de données client commande (cf. figure 1.2) est séle-
ctionnée. Quelle requête parmi celles données ci-dessous calcule le montant total TTC
des produits en stock ?

51
1 SELECT sum(QSTOCK*PRIX) FROM produit
2 SELECT count(QSTOCK) FROM produit
3 SELECT count(PRIX) FROM produit
4 SELECT sum(PRIX*1.196) FROM produit
5 SELECT max(QSTOCK*PRIX*1.196) FROM produit

Réponse

52
4.3 Sous-requêtes
Pour effectuer ces exercices, vous devez avoir lu, avant de venir en TD, le paragraphe
2.3.6 (pages 32 et suivantes).

Exercice 3 : Sous-reqêtes sur la BD client commande


Ecrivez les requêtes SQL qui répondent aux questions suivantes. Enregistrez ces requêtes
dans le fichier exo 3 req sousreq.sql.
Q.3.1. Affichez les localités des clients qui ont commandé le produit de numéro ’CS464’
Q.3.2. Quels sont les produits de type sapin qui ont été commandés ?
Q.3.3. Combien y a-t-il de commandes portant sur un (ou plusieurs) produit(s) en acier ?

53
4.4 Requêtes avec jointures entre tables
Pour effectuer ces exercices, vous devez avoir lu, avant de venir en TD, les para-
graphes 2.3.7 (pages 33 et suivantes).

Exercice 4a : requêtes sur la BD client commande


En utilisant l’éditeur de texte Notepad++ 6 , ouvrez le fichier exo 4 req jointure.sql.
On suppose que vous êtes connecté à la BD client commande, que son schéma est
celui de la figure 1.1, page 8, et que la version courante de la BD est celle de la figure 1.3.
Pour chaque requête donnée ci-dessous
Q.4.1. expliquez ce qu’elle fait et trouvez la réponse donnée par SQL, sans l’exécuter ;
Q.4.2. exécutez la requête 7 et comparez les résultats obtenus avec vos réponses.

Attention : Les requêtes peuvent être incomplètes ou fausses !

Requête 4.1
1 SELECT NOM, NCOM
2 FROM client, commande
3 WHERE client.NCLI = commande.NCLI
4 AND LOCALITE = ’ T o u l o u s e ’

Requête 4.2
1 SELECT LIBELLE, PRIX, QCOM
2 FROM detail, produit
3 WHERE detail.NPRO = produit.NPRO
4 AND NCOM = ’ 30188 ’

Requête 4.3
1 SELECT NOM, commande.NCOM, detail.NCOM, LIBELLE, PRIX, QCOM
2 FROM client, commande, detail, produit
3 WHERE client.NCLI = commande.NCLI
4 AND detail.NPRO = produit.NPRO
5 AND commande.NCOM = ’ 30188 ’

Q.4.3. En supposant maintenant que le contenu des tables n’est pas connu, exprimez le
résultat de ces requêtes “en français” (voir les exemples 20 et 21, page 28).
6. voir le paragraphe 3.3, page 42
7. Copiez la requête á partir du fichier (CTRL+C dans Notepad++), la coller (CTRL+V) en AgroPythia
et l’exécuter.

54
Exercice 4b : requêtes sur la BD client commande
Après avoir identifié les tables à consulter et les conditions de jointure nécessaires, écrivez
les requêtes SQL qui répondent aux questions suivantes. Enregistrez ces requêtes dans le
fichier exo 4 req jointure.sql.
Q.4.4. Affichez tous les produits commandés (nom, prix, quantité) par le client no ’B512’.
Q.4.5. Affichez tous les produits (nom, prix, quantité) commandés par le client ’FE-
RARD’, par ordre croissant de numéro de commande puis par ordre alphabétique
sur le nom de produit.
Q.4.6. Quels clients ont passé des commande en 2009 ?
Q.4.7. Quels sont les noms des produits qui ont été commandés les dix derniers jours de
l’année 2008 ?
Q.4.8. Affichez tous les produits commandés (nom, prix, quantité) par le client ’MER-
CIER’.
Q.4.9. Quels sont les numéros des produits qui ont été commandés à la fois le 23/12/2008
et le 02/01/2009 ?
Q.4.10. Quels sont les numéros et les noms des produits qui ont été commandés le 2/01/2009,
mais pas le 23/12/2008 ? Et quels sont les noms de ces produits ?

Exercice 4c : requêtes sur la BD gie agricole


On suppose que vous êtes connecté sur la BD gie agricole.
Après avoir identifié les tables à utiliser et les conditions de jointure nécessaires, écrivez
les requêtes SQL qui répondent aux questions suivantes. Enregistrez ces requêtes dans le
fichier exo 4 req jointure.sql.
Q.4.11. Affichez la liste de toutes les parcelles avec le nom de leurs propriétaires.
Q.4.12. Affichez pour chaque intervention le nom de la parcelle concernée.
Q.4.13. Affichez pour chaque intervention le nom de la parcelle concernée et le nom de
l’employé.

Pour terminer ces exercices


— Vérifiez que vous avez bien enregistré vos requêtes dans le fichier exo 1 req
simples.sql.
— Mettez à jour la date (ligne 4) et l’auteur (ligne 5) du fichier.
— Enregistrez ce fichier dans votre répertoire.

Questions de révision
Q.R.1
Quelle est la syntaxe générale d’une requête de jointure sur 2 tables ?
Réponse

55
Q.R.2
Quelle est la syntaxe générale d’une requête de jointure sur 3 tables ?
Réponse

56
4.5 La clause Group By
Pour effectuer ces exercices, vous devez avoir lu, avant de venir en TD, le paragraphe
2.3.9 (pages 37 et suivantes).

Exercice 5 : Reqêtes sur la BD client commande


Ecrivez les requêtes SQL qui répondent aux questions suivantes. Enregistrez ces requêtes
dans le fichier exo 5 req groupby.sql.
Q.5.1. Affichez le total et la moyenne des comptes des clients, ainsi que le nombre de
clients, selon chacune des classifications suivantes : (1) par catégorie, (2) par lo-
calité, (3) par catégorie dans chaque localité.
Q.5.2. Donner pour chaque produit la liste des localités dans lesquelles ce produit est
commandé en plus de 500 unités (= au total pour la localité).
Q.5.3. Affichez les informations du dernier client de chaque catégorie.

57
4.6 Requêtes de mise à jour
Pour effectuer ces exercices, vous devez avoir lu, avant de venir en TD, le §1.5.1, le
§1.6, ainsi que les paragraphes de 2.2.4 à 2.3.10 (pages de 26 à 39).

Exercice 6a : exemples de requêtes sur la BD client commande


En utilisant l’éditeur de texte Notepad++ 8 , ouvrez le fichier exo 6 req miseajour.sql
qui se trouve dans votre répertoire BD\TD.
On suppose que vous êtes connecté à la BD client commande, que son schéma est
celui de la figure 1.1, page 8, et que la version courante de la BD est celle de la figure 1.3.
Pour chaque requête donnée ci-dessous
Q.6.1. expliquez ce qu’elle fait et trouvez la réponse donnée par SQL, sans l’exécuter ;
Q.6.2. exécutez la requête 9 et comparez les résultats obtenus avec vos réponses.
ATTENTION! Le contenu de la base de données sera modifié !

Requête 6.1
1 UPDATE produit
2 SET QSTOCK = QSTOCK - 10
3 WHERE NPRO = ’ PH222 ’

Requête 6.2
1 UPDATE client
2 SET CAT = ’A1 ’
3 WHERE CAT IS NULL

Requête 6.3
1 INSERT INTO produit ( NPRO, LIBELLE, PRIX, QSTOCK)
2 VALUES ( ’ PH122 ’, ’ PL HETRE 100 x20x2 ’, ’ 120 ’, ’ 500 ’)

Requête 6.4
1 DELETE FROM detail
2 WHERE NCOM = ’ 30188 ’

Requête 6.5
1 DELETE FROM commande
2 WHERE NCOM = ’ 30188 ’

Q.6.3. En supposant maintenant que le contenu des tables n’est pas connu, exprimez le
résultat de ces requêtes “en français” (voir les exemples 20 et 21, page 28).
8. voir le paragraphe 3.3, page 42
9. Copiez la requête á partir du fichier (CTRL+C dans Notepad++), la coller (CTRL+V) en AgroPythia

58
Exercice 6b : requêtes sur la base de données client commande
Écrivez les requêtes SQL qui répondent aux questions suivantes. Sauvegardez ces requêtes
dans le fichier exo 6 req miseajour.sql
Q.6.4. Mettez à jour le compte du client ’FRANCK’ : sa commande est de 2300 euro et
il a payé 2500 euro.
Q.6.5. Ajoutez un nouveau produit, ’PL CHENE 200x20x2’, dont le stock initial est de
500 unités et le prix à l’unité est 120 euro.
Q.6.6. Corrigez la quantité commandée du produit ’PA60’ dans la commande ’30185’ :
elle est de 10 unités.
Q.6.7. Le client ’FERARD’ ajoute à sa commande du 02/01/2009 cinq unités du produit
’PL. HETRE 200x20x2’.

Pour terminer ces exercices


— Vérifiez que vous avez bien enregistré vos requêtes dans le fichier exo 6 miseajour
.sql.
— Mettez à jour la date (ligne 4) et l’auteur (ligne 5) du fichier.
— Enregistrez ce fichier dans votre répertoire.

Question de révision
Q.R.1
Est-ce que la Requête 6.5 peut être exécutée avant la Requête 6.4 ?
1 DELETE FROM commande -- Requête 4.5
2 WHERE NCOM = ’ 30188 ’;
3 DELETE FROM detail -- Requête 4.4
4 WHERE NCOM = ’ 30188 ’

Justifiez votre réponse :

Attention !
Si vous avez exécuté les requêtes 6.4 et 6.5, avant de faire ce test il faut compléter la BD
avec les requêtes d’insertion suivantes :
1 INSERT INTO ‘commande‘ (‘NCOM‘, ‘NCLI‘, ‘DATECOM‘) VALUES
2 ( ’ 30188 ’, ’ B512 ’, ’ 2009−01−03 ’);
3 INSERT INTO ‘detail‘ (‘NCOM‘, ‘NPRO‘, ‘QCOM‘) VALUES
4 ( ’ 30188 ’, ’ CS464 ’, 180),
5 ( ’ 30188 ’, ’ PA45 ’, 22),
6 ( ’ 30188 ’, ’ PA60 ’, 70),
7 ( ’ 30188 ’, ’ PH222 ’, 92);

59
4.7 Modification et contraintes d’intégrité
Pour effectuer ces exercices, vous devez avoir lu, avant de venir en TD, le §1.5.1, le
§1.6, ainsi que les paragraphes de 2.2.4 à 2.3.10 (pages de 26 à 39).

Exercice 7a
En utilisant l’éditeur de texte Notepad++ 10 , ouvrez le fichier exo 7 contraintes
d’intégrité.sql qui se trouve dans votre répertoire BD\TD.
On suppose que la BD client commande (cf. figure 1.2) est sélectionnée et que sa
version courante est celle de la figure 1.3.
Pour chaque table, retrouvez sa clé primaire :
clé primaire
table nom de la colonne type de la colonne
client

commande

detail

produit

Exercice 7b
Pour chaque question donnée ci-dessous trouvez la réponse en la justifiant :
Q.7.1. Est-il possible d’ajouter un client ayant le même nom qu’un client déjà présent
dans la base de données ?
Q.7.2. Est-il possible d’ajouter dans la base de données une commande ayant pour numéro
de commande ’30179’ (une commande existante), pour numéro de client ’C400’
(un client existant) et dont la date de commande le 04/01/2012 (une nouvelle
date) ?
Q.7.3. Est-il possible d’ajouter à la commande numéro ’30188’ le produit ’PS222’ ? Et
le produit ’PH222’ ?
Q.7.4. Est-il possible d’ajouter dans la base de données un produit dont le numéro est
’PH222’ et le libellé ’Planche’ ?
Q.7.5. Quelle est la liste des mises à jour à faire pour supprimer la commande ’30179’ ?
Q.7.6. Est-il possible de supprimer n’importe quel enregistrement de la table detail ?
Q.7.7. Est-il possible de supprimer n’importe quel enregistrement de la table commande ?
Q.7.8. Est-il possible de supprimer n’importe quel enregistrement de la table produit ?
Q.7.9. Est-il possible de supprimer n’importe quel enregistrement de la table client ?
10. voir le paragraphe 3.3, page 42

60
Q.7.10. Quelles opérations sont à faire si on veut ajouter le numéro de téléphone de chaque
client ?
Q.7.11. Quelles opérations sont à faire si on veut ajouter une date de livraison à chaque
commande ?

Exercice 7c
Pour chaque table, retrouvez sa/ses clé(s) étrangère(s) ; ensuite précisez à quelle colonne
elle fait référence :
clé(s) étrangère(s)
table nom de la colonne table parent colonne référencée
client

commande

detail

produit

Exercice 7d
Quelles sont les clés primaires/étrangères des tables de la BD gie agricole ?

Pour terminer ces exercices


— Vérifiez que vous avez bien enregistré vos requêtes dans le fichier exo 7 modi-
fication.sql.
— Mettez à jour la date (ligne 4) et l’auteur (ligne 5) du fichier.
— Enregistrez ce fichier dans votre répertoire.

Questions de révision
Q.R.1
On suppose que la base de données gie agricole (cf. figure 1.4) est sélectionnée.
Expliquez ce que fait la requête suivante et trouvez la réponse donnée par AgroPythia sur
la version courante de la BD (cf. figure 1.5) :
1 DELETE FROM employe
2 WHERE Emp_Prn like ’%H e n r i%’

Réponse

61
Q.R.2
On suppose que la base de données client commande (cf. figure 1.2) est sélection-
née et que sa version courante n’est pas connue. L’instruction suivante
1 INSERT INTO commande (NCOM, NCLI, DATECOM)
2 VALUES( ’ 600 ’, ’ 600 ’, ’ 2012−01−12 ’)

ajoute-elle une ligne dans la table commande ?


1. oui, s’il n’y a pas encore de commande dont le no est 600 et s’il existe un client
no 600 ;
2. oui, s’il n’y a pas encore de commande pour le client no 600 ;
3. oui, s’il n’y a pas encore de commande dont le no est 600 ;
4. oui, s’il n’y a pas encore de commande passée le 12 janvier 2012 ;
5. non.

Q.R.3
Quelle est la syntaxe générale d’une requête d’ajout d’une ligne dans une table ?
Réponse

Q.R.4
Quelle est la syntaxe générale d’une requête de suppression d’une ligne dans une
table ?
Réponse

Q.R.5
Quelle est la syntaxe générale d’une requête de modification d’une ligne dans une
table ?
Réponse

62
Index

AS, 33 not in, 39


opérateur de comparaison, 12, 36, 46
base de données, 6, 8, 9, 12, 27 opérateur logique, 13, 46
clé priorité des opérateurs, 13, 32, 46
clé étrangère, 15, 28, 60 ORDER BY, 32, 33, 46
clé primaire, 14, 28, 30, 59 requête, 21
colonne, 12, 28 CREATE TABLE, 28
colonne obligatoire, 28 DELETE FROM, 43, 57
condition DROP, 29
condition de jointure, 36 INSERT INTO, 42, 57
condition de sélection, 31, 32 SELECT-FROM, 30, 31, 35, 36, 46, 48,
contrainte 53
contrainte d’intégrité, 16, 30 UPDATE, 43, 57
contrainte d’unicité, 14, 16, 30
contrainte référentielle, 15, 16, 30 schéma, 8, 10, 18, 27, 29
CREATE TABLE, 28 SELECT-FROM, 30, 31, 35, 36, 46, 48, 53
SGBD, 7, 22
DELETE FROM, 43, 57 sous-requête, 35, 36, 38, 39
DISTINCT, 32 SQL, 21, 27
DROP, 29
table, 12, 28
fonctions agrégatives, 34, 49, 50 colonne, 12
COUNT, 34, 49 ligne, 8, 10, 12
MAX, 34, 49 table enfant, 15, 17, 60
SUM, 34, 35, 49 table parent, 15–18, 60
type de données, 12, 28, 45, 59
GROUP BY, 40
booléen, 12
GROUP BY, 40
boolean, 28
HAVING, 40 chaı̂ne de caractères, 12
character, 28
INSERT INTO, 42, 57 varchar, 28
numérique, 12
jointure, 36, 38, 39, 53 decimal, 28
condition de jointure, 36, 53 float, 28
NULL, 13, 14, 16, 17, 28, 29, 32, 34, 42 integer, 28
numeric, 28
opérateur, 12 temporel, 12
in, 35, 38, 39 date, 28

63
time, 28

UPDATE, 43, 57

64

Вам также может понравиться