Vous êtes sur la page 1sur 57

Système d’information

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

Partie I

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

Liliana Ibănescu
liliana.ibanescu@agroparistech.fr
UFR d’informatique
Département MMIP

Année 2013 - 2014


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) 7


1.1 La base de données client commande . . . . . . . . . . . . . . . . . 8
1.2 La base de données gie agricole . . . . . . . . . . . . . . . . . . . 10
1.3 BD, tables, lignes et colonnes . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4 Type de donnée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4.1 Types de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4.2 Opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4.3 La valeur NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5 Identifiant primaire ou clé primaire . . . . . . . . . . . . . . . . . . . . . 14
1.5.1 Clés étrangères . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.6 Modification et contraintes d’intégrité . . . . . . . . . . . . . . . . . . . 15
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) . . . . . . . . . . . . . . . 20
1.9 Les systèmes de gestion de bases de données (SGBD) . . . . . . . . . . . 21

2 Les instructions du langage SQL 22


2.1 Sites Web de référence pour SQL et MySQL . . . . . . . . . . . . . . . . 22
2.2 Le langage SQL DDL (Data Definition Language) . . . . . . . . . . . . . 22
2.2.1 Création d’un schéma . . . . . . . . . . . . . . . . . . . . . . . 22
2.2.2 Création d’une table (CREATE TABLE) . . . . . . . . . . . . . 23
2.2.3 Suppression d’une table (DROP) . . . . . . . . . . . . . . . . . . 24
2.3 Le langage SQL DML (Data Manipulation Language) . . . . . . . . . . . 24
2.3.1 Extraction de données . . . . . . . . . . . . . . . . . . . . . . . 25
2.3.2 Extraction simple (SELECT-FROM) . . . . . . . . . . . . . . . . 25
2.3.3 Extraction de lignes sélectionnées (SELECT-FROM-WHERE) . . 25
2.3.4 Ordre des lignes d’un résultat (clause ORDER BY) . . . . . . . . 27
2.3.5 Les fonctions agrégatives (ou statistiques) . . . . . . . . . . . . . 28
2.3.6 Extraction de données de plusieurs tables (jointure) . . . . . . . . 28
2.3.7 Les sous-requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.3.8 Sous-requête ou jointure ? . . . . . . . . . . . . . . . . . . . . . 31
2.3.9 Ajout de lignes dans une table (INSERT) . . . . . . . . . . . . . 32
2.3.10 Suppression de lignes (DELETE) . . . . . . . . . . . . . . . . . . 32

3
2.3.11 Modification de lignes (UPDATE) . . . . . . . . . . . . . . . . . 33
2.3.12 Modification des structures de données . . . . . . . . . . . . . . 33

3 Prise en main de l’environnement de développement 34


3.1 Pré-requis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2 Organisation du répertoire de travail . . . . . . . . . . . . . . . . . . . . 34
3.3 L’éditeur de texte Notepad++ . . . . . . . . . . . . . . . . . . . . . . . 35
3.3.1 Démarrage de Notepad++ . . . . . . . . . . . . . . . . . . . . . 35
3.3.2 Créer un nouveau fichier . . . . . . . . . . . . . . . . . . . . . . 35
3.3.3 Ouvrir un fichier existant . . . . . . . . . . . . . . . . . . . . . . 35
3.4 MySQL et phpMyAdmin . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.4.1 Utiliser MySQL avec phpMyAdmin . . . . . . . . . . . . . . . . 36
3.4.2 Opérations sur une base de données avec MySQL . . . . . . . . . 36
3.4.3 Opérations sur les tables d’une base de données . . . . . . . . . . 37
3.5 Ressources en ligne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

4 TD 1 : Travaux dirigés en BD, séance 1 – Requêtes simples sur une table 38


4.1 Premiers pas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.2 Exercice 1a : requêtes simples sur la base de données client commande 39
4.2.1 Exemples de requêtes . . . . . . . . . . . . . . . . . . . . . . . . 39
4.2.2 Requêtes générées par l’interface de phpMyAdmin/MySQL . . . 40
4.2.3 Requêtes en SQL . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.3 Exercice 1b : requêtes sur la BD gie agricole . . . . . . . . . . . . . 41
4.4 Pour terminer cet exercice . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.5 Questions de révision . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.5.1 Q.R.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.5.2 Q.R.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.5.3 Q.R.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

5 TD 2 : Travaux dirigés en BD, séance 2 – Requêtes avec jointures entre tables 43


5.1 Exercice 2a : requêtes sur la BD client commande . . . . . . . . . . 43
5.1.1 Exemples de requêtes . . . . . . . . . . . . . . . . . . . . . . . . 43
5.1.2 Requêtes en SQL . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2 Exercice 2b : requêtes sur la BD gie agricole . . . . . . . . . . . . . 44
5.3 Exercice 3 : fonctions agrégatives . . . . . . . . . . . . . . . . . . . . . 45
5.3.1 Exemples de requêtes sur la BD client commande . . . . . . 45
5.3.2 Exercice 3a : fonctions agrégatives sur la BD client commande 46
5.3.3 Exercice 3b : fonctions agrégatives sur la BD gie agricole . 46
5.4 Questions de révision . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.4.1 Q.R.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.4.2 Q.R.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.4.3 Q.R.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

4
6 TD 3 : Travaux dirigés en BD, séance 3 – Requêtes de mise à jour 48
6.1 Exercice 4 : requêtes sur la BD client commande . . . . . . . . . . . 48
6.1.1 Exemples de requêtes . . . . . . . . . . . . . . . . . . . . . . . . 48
6.1.2 Requêtes générées par l’interface de phpMyAdmin/MySQL . . . 49
6.1.3 Requêtes en SQL . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.2 Exercice 5 : Modification et contraintes d’intégrité . . . . . . . . . . . . 51
6.2.1 Question 5a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.2.2 Questions 5b . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.2.3 Question 5c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.2.4 Question 5d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.3 Questions de révision . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.3.1 Q.R.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.3.2 Q.R.9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.3.3 Q.R.10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

7 TD 4 : Travaux dirigés en BD, séances 4 – Le système d’information Starboat 54


7.1 Cahier des charges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
7.1.1 Description du contexte . . . . . . . . . . . . . . . . . . . . . . 54
7.1.2 Fonctionnalités attendues du SI . . . . . . . . . . . . . . . . . . 55
7.2 Exercice 7a : le schéma . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
7.3 Exercice 7c : requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
7.4 Exercice 7d : questions . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

5
6
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. Pour plus de détails vous pourrez vous re-
porter à l’ouvrage Bases de données. Concepts, utilisation et développement de Jean-Luc
Hainaut, paru en 2009 aux éditions Dunod.
Nous baignons dans un tourbillon d’informations : nous recevons des informations de
notre environnement et nous lui en transmettons.
Les informations prennent la forme de données (symboles mémorisés et véhiculés
sur un support matériel ou immatériel). Pour stocker (conserver ou enregistrer) et traiter
(interroger et transformer) ces données, on utilise des bases de données (BD), database
(DB) en anglais (voir les §1.3 à §1.8).
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 uti-
lisé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 comp-
tabilité.
2. La base de données appelée gie agricole, décrite dans le §1.2, est utilisée par
un GIE 1 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 per-
mettra, entre autres, d’éditer les fiches de paye des employés et les interventions
effectuées pour un agriculteur.

1. 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.1 :
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 maté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 com-
mande : 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.1 – 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.2.

8
table client table commande

table produit table detail


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

9
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
un agriculteur.
Le schéma de la base de données gie agricole est présenté dans la figure 1.3 :
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.3 – 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.4.

10
table agriculteur table tarif

table parcelle

table employe

table intervention
F IGURE 1.4 – Les enregistrements 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 constitué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.5 représente les informations enregistrées à un instant donné dans
la table produit de la BD client commande : la table a 7 ligne 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.1).

F IGURE 1.5 – La lignes de la table produit de la BD client commande à un instant


donné.

1.4 Type de donnée


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.

1.4.1 Types de base


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 seconde).

12
1.4.2 Opérateurs
Les opérateurs utilisés pour comparer des valeurs sont :
= é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’ex-
pression (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 =0 Paris0 est
calculée comme l’expression ((age = (16 + 5)) or ((age = 20) and (ville =0 Paris0 ))) car
l’opérateur arithmétique d’addition est prioritaire sur tous les autres opérateurs, l’opérateur
de comparaison = est prioritaire aux opérateurs logiques et l’opérateur and est prioritaire
sur l’opérateur or.

1.4.3 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. Toute tentative d’insérer une ligne qui ne posséderait pas de valeur pour une
colonne obligatoire serait automatiquement signalée comme 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é.

Attention : 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 Identifiant primaire ou clé primaire


Une ligne dans une table regroupe des informations sur une entité. Une des propriété
importante dans une table c’est de pouvoir identifier de manière unique une ligne à l’aide
d’un identifiant ou une clé (key en anglais).
Une clé peut être composée de plusieurs colonnes de la table.

Exemple 4. Une ligne de la table client donne les informations relative à un client :
son nom, son adresse, la ville où il habite.
Déclarer que la colonne NOM est une clé de la table client, impliquerais alors, qu’à tout
instant, il n’existera pas deux (ou plusieurs) lignes ayant la même valeur dans la colonne
NOM.
Déclarer que le couple de colonnes (NOM, VILLE) est une clé de la table client, im-
plique alors, qu’à tout instant, il n’existera pas deux (ou plusieurs) lignes ayant la même
valeur pour le couple (nom du client, ville).

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éja 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 5. La clé primaire de la table employe de la base de données gie agricole 2


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 3 est
représentée par le couple de deux colonnes NCOM et NPRO, ce qui impose qu’on ne pourra
2. voir la figure 1.3, page 10
3. voir la figure 1.1, page 8

14
pas enregistrer deux lignes ayant le même numéro de commande et le même numéro de
produit.
La clé primaire de la table intervention de la base de données gie agricole 4
est représentée par ses trois premières colonnes.

1.5.1 Clés étrangères


Dans une table, appelée table fille, une de ses colonnes, appelée clé étrangère (foreign
key en anglais), peut faire référence à la colonne qui est clé primaire dans une autre table,
appelée table mère. Le couple constitué par une clé étrangère de la table fille et la clé
primaire de la table mère permet de relier des lignes dans des tables distinctes.
Exemple 6. La table parcelle (table fille) de la base de données gie agricole 5
a 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 mère). Pour une ligne de la table
parcelle, la valeur de la colonne Par Prop permet de la relier à une ligne de la table
agriculteur.
Exemple 7. La table detail (table fille) de la base de données client commande 6
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 ;
2. la colonne NPRO, appelée dans la suite FK2, qui fait référence à la clé primaire
NPRO, de la la table produit.
On notera que le nom d’une colonne formant une clé étrangère peut être le même ou
peut-être différent 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 fille soit un sous-ensemble des valeurs de
la clé primaire de la table mère. Cette propriété est appelée contrainte référentielle. Elle
est garantie par le SGBD pour autant qu’on ait explicitement déclaré les clés étrangères
(c.à.d. créer les relations avec les clés primaires auxquelles elles font référence) : toute
opération qui conduirait à violer cette contrainte serait automatiquement rejetée.

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 être satisfaites à tout instant. 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é.
4. voir la figure 1.3, page 10
5. voir la figure 1.3, page 10
6. voir la figure 1.1, page 8

15
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) impose une contrainte d’unicité signifiant qu’à tout instant
les lignes d’une table possèdent des valeurs distinctes pour la ou les colonnes constituant
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.

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 fille chaque colonne identifié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 mère.
Exemple 8. La table detail (table fille) de la base de données client commande
doit respecter deux contraintes référentielles :
1. la première, FK1 (voir l’exemple 7), 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 (table mère) ;
2. la seconde, 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 (table mère).
La table commande (table fille) doit respecter à la contrainte référentielle donnée par
la colonne NCLI identifié comme étant une clé étrangère, appelée FK3, qui fait référence
à la colonne NCLI de la table client (table mère).
La suppression dans la table mère d’une ligne référencée par d’autres lignes dans
une table fille sera exécutée selon une des stratégies possibles suivantes, appelées delete
mode :
– blocage : la suppression de la ligne dans la table mère est refusée ;
– cascade : la suppression de la ligne dans la table mère est accompagnée de la sup-
pression des lignes correspondantes dans la table fille ;
– indépendance : la suppression de la ligne dans la table mère est accompagnée par la
mise à NULL des colonnes correspondant aux clés étrangères des lignes concernées
dans la table fille.
Exemple 9. Dans la base de données client commande la table detail a pour clé
primaire le couple de colonnes (NCOM, NPRO) (cf. exemple 5) et doit respecter les deux

16
contraintes référentielles données dans l’exemple 8. 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.
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 si ces valeurs respectent les
contraintes 1(a), 1(b) et 1(c) vues ci-dessus.
Exemple 10. Dans la base de données client commande, la table commande i) a
pour clé primaire la colonne NCOM, ii) est la table mère dans la clé étrangère FK1,
et iii) doit respecter la contrainte référentielle liée à la clé étrangère FK3 donnée dans
l’exemple 8.
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 NCLI de cette nouvelle ligne existe dans la colonne
NCLI de la table client (cf. FK3) ;
(b) la valeur de la colonne NCOM de cette nouvelle ligne n’existe pas déjà dans
une ligne de la table commande.
2. Si la stratégie de suppression est en mode blocage, alors la suppression d’une ligne
l dans la table (mère) commande est autorisée seulement s’il n’existe pas de lignes
dans la table (fille) detail qui font référence à cette ligne l (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 si cette valeur respecte les contraintes
1(a) et 1(b) vues ci-dessus.
Exemple 11. Dans la base de données client commande la table client a pour
clé primaire la colonne NCLI et elle est la table mère 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
l dans la table (mère) client est autorisée seulement s’il n’existe pas de lignes
dans la table (fille) commande qui font référence à cette ligne l (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 si cette valeur n’existe pas déjà dans une
ligne de la table client.

17
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.
Le contenu d’une base de données à un instant t est l’ensemble des lignes de toutes
les 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.

18
Exemple 12. La figure 1.6 donne trois représentations graphiques du schéma de la base
de données client commande, décrite dans le §1.1. Nous utiliserons dans ce cours la
représentation graphique produite par MySQL, donnée dans la figure 1.1 et reprise dans
la figure 1.7.

F IGURE 1.6 – 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.7 – Le schéma de la base de données client commande.

19
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
utilisons la syntaxe SQL2 dans sa version MySQL.
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. Pour la première partie, du cours nous utilisons cette formulation
interactive des requêtes SQL.
Une requête peut également être envoyée par un programme (écrit en C, PHP ou Java,
par exemple) au SGBD. Dans ce cas, le résultat de la requête est rangé par le SGBD,
ligne par ligne, dans les variables du programme. Dans la deuxième partie du cours, nous
utiliserons le langage PHP pour envoyer des requêtes au SGBD et exploiter ensuite leurs
résultats dans des programmes.

20
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 7 se répartit entre
1. des SGBD commerciaux (payants) :
– Oracle Database 8 ,
– DB2 Database Software 9 d’IBM,
– SQL Server 10 de Microsoft,
– Access 11 , édité par Microsoft, qui fait partie de la suite bureautique MS Office
Pro, etc.
2. des SGBD Open Source (ou libre) :
– MySQL 12 ,
– PostgreSQL 13 , etc.
Nous utiliserons dans ce cours le SGBD MySQL 14 , un logiciel SGBD libre.

7. Pour en savoir plus sur les parts de marché consultez, par exemple, http://www.mysql.com/
why-mysql/marketshare/
8. http://www.oracle.com/fr/products/database/index.html
9. http://www-01.ibm.com/software/data/db2/
10. http://www.microsoft.com/france/serveur-cloud/sql/
11. http://office.microsoft.com/fr-fr/access/
12. http://www.mysql.fr/
13. http://www.postgresql.org/
14. http://www.mysql.fr/

21
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 MySQL


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/
Le logiciel MySQL implémente le langage SQL, mais ne respecte pas toujours la
norme SQL. Sur le site de référence de MySQL se trouvent les instructions/commandes
pour la définition des données (l’implémentation du langage SQL DDL) :
http://dev.mysql.com/doc/refman/5.0/fr/data-definition.html
et pour la manipulation des données :
http://dev.mysql.com/doc/refman/5.0/fr/data-manipulation.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), le langage SQL propose l’instruction suivante :

22
CREATE SCHEMA nom_schema
où nom schema est remplacé par le nom de la nouvelle base de données.
Sous MySQL la syntaxe pour créer le schéma d’une base de données est la suivante :
CREATE DATABASE nom_schema
où nom schema est remplacé par le nom de la nouvelle base de données.
Exemple 13. Pour créer en MySQL la base de données client commande il faut
écrire :
1 CREATE DATABASE client_commande

Cette opération produit une nouvelle BD, sans tables.

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 de colonne :
– 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, dites de base, possible 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 d’au plus
p caractères ;

23
– 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 accueillir
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 simi-
laires, mais considérés comme étant formés de caractères ; ce type est utilisé pour
stocker des textes de taille importante.

Exemple 14. Pour créer dans la base de données client commande la table client,
la commande MySQL est la suivante :
1 CREATE TABLE client
2 ( NCLI char(8) NOT NULL,
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 PRIMARY KEY (NCLI) )

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


1 CREATE TABLE detail
2 ( NCOM char(8) 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) )

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.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.

24
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 table 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.
L’exécution d’une requête select produit un résultat qui est une table volatile car
ses lignes sont envoyées à l’écran, mais cette table n’est pas créée dans la base de données.

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 15. 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 16. Pour la base de données client commande, la requête


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.

25
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.2 ;
– 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é’) ;
• dates : ’2009-02-14’ (standard SQL 2) ; autres variantes selon les SGBD :
’14-02-2009’, ’14/02/2009’.
Pour les expressions composées 2 l’usage des paranthè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. voir sur http://dev.mysql.com/doc/refman/5.0/fr/operator-precedence.
html, la priorité des opérateurs en MySQL

26
Lignes dupliquées dans le résultat
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

Données extraites et données dérivées


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

le résultat de la requête sera un tableau des montants TVA des articles en stock.
MySQL offre plusieurs fonctions permettant de dériver des valeurs à partir des valeurs des
colonnes des lignes extraites. Pour les chaı̂nes de caractères on peut utiliser, par exemple,
les fonctions : lower, upper, substring, trim 3 .

2.3.4 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 ASC|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).

Exemple 17. 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 le noms des localités.
On peut indiquer plusieurs critères de tri :
1 SELECT *
2 FROM client
3 ORDER BY LOCALITE, CAT

3. voir http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

27
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 Les fonctions agrégatives (ou statistiques)


Il existe des fonctions prédéfinies 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 ligne trouvées,
• count(nom colonne) compte le nombre de valeurs de la 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 18. 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.

2.3.6 Extraction de données de plusieurs tables (jointure)


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 :

28
SELECT liste_colonnes
FROM nom_table_1, nom_table_2
WHERE condition_jointure
AND condition

La condition de jointure se présente sous la forme d’une égalité entre les valeurs de deux
colonnes : col 1 = col 2, où
i) la colonne col 1 est la clé étrangère de la table nom table 1 (table fille),
ii) la colonne col 2 est la clé primaire de la table nom table 2 (table mère), et
iii) la table nom table 2 est la table mère référencée par la clé étrangère col 1.
Si les deux tables ont des colonnes qui ont le même nom, il faut lever l’ambiguı̈té et
préciser à quelle table appartient la colonne, en utilisant la syntaxe suivante :

nom_table.nom_colonne

Exemple 19. 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. Les valeurs des colonnes NCOM et DATECOM sont extraites de
la table commande (table fille) tandis que les valeurs des colonnes NOM et LOCALITE
sont extraites de la table client (table mère). 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.

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 19 sur la base de données client commande contenant les
lignes données dans la figure 1.2, 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 19 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 19.
Par extension, la jointure de trois tables réclamera deux conditions de jointure.

Remarque : Une jointure 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 seconde table.
4. notée FK3 dans l’exemple 8, page 16

29
2.3.7 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 20. 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 21. 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 la plus grande valeur dans son compte.

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

Exemple 22. 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 ’))

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 ’)

30
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 23. La requête de l’exemple 20


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 :


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

Exemple 24. La requête de l’exemple 22


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 ’

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 25. 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

31
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).

2.3.9 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 26. 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) attachées à la table dans laquelle
les nouvelles lignes sont insérées, cf. §1.6.

2.3.10 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.

32
2.3.11 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 27. 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.

2.3.12 Modification des structures de données


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 doivent
respecter les contraintes d’intégrité. 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.

33
Chapitre 3

Prise en main de l’environnement de


développement

Pour réaliser les exercices proposés dans les séances de travaux dirigés, il faut :
1. organiser son répertoire de travail selon la structure donnée dans le paragraphe 3.2 ;
2. disposer d’un éditeur de texte pour enregistrer les solutions : Notepad++ 1 (voir le
paragraphe 3.3) ;
3. disposer d’un Système de Gestion de Bases de Données (SGBD), comme MySQL 2
(voir le paragraphe 3.4).

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 Organisation du répertoire de travail


Votre répertoire de travail doit être structuré selon l’arborescence suivante :

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


notepad-plus/
2. http://www.mysql.fr/

34
N: \www
BD
TD
Exemples

de telle sorte que : tous les fichiers concernant le cours de Système d’information seront
dans un sous répertoire www ; tous les fichiers concernant la première partie sur les bases
de données seront dans un sous répertoire www\BD ; tous les fichiers concernant les exer-
cices des TDs seront dans un sous répertoire www\BD\TD, etc.
Pour créer cette structure de répertoires, il faut :
1. télécharger l’archive archive BD.zip qui se trouve sur le site Web du cours
http://www.agroparistech.fr/Systeme-d-Information.html
2. extraire tous les répertoires et fichiers de cette archive dans votre répertoire N: \

3.3 L’éditeur de texte Notepad++


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 .

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 (cf. au paragraphe 3.2),
avec une extension .sql en utilisant l’option Fichier / Enregister sous ...
La présence de l’extension dans le nom du fichier permet de spécifier le langage
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.

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

35
3.4 MySQL et phpMyAdmin
MySQL 6 est un Système de Gestion de Bases de Données (SGBD) qui utilise le
langage SQL. MySQL est un système libre (open source) qui fonctionne sur plus de 20
plateformes incluant Linux, Windows, Mac OS, etc.
phpMyAdmin est un logiciel gratuit, écrit en PHP et intégré à EasyPHP, utilisé pour
administrer une base de données MySQL à distance via un navigateur Web. Les opérations
MySQL les plus utilisées (gestion de bases de données, tables, champs, relations, etc.)
sont disponibles à travers une interface utilisateur ; des commandes SQL peuvent aussi
être exécutées.

3.4.1 Utiliser MySQL avec phpMyAdmin


1. Lancez EasyPHP sur votre poste de travail (dans le menu Démarrer de Windows
l’option Tous les programmes /EasyPHP).
2. Dans la barre située sur la dernière ligne de votre écran, à droite, retrouvez l’icône
d’EasyPHP et cliquez dessus avec le bouton droit de la souris. Un menu apparaı̂t,
choisissez “Administration” ; une fenêtre doit s’ouvrir dans un navigateur Web (In-
ternet Explorer, Firefox, etc). Choisissez “Administrer MySQL” (ou le lien Admi-
nistrer vos bases des données classé sous la catégorie “PHP MyAdmin”).

3.4.2 Opérations sur une base de données avec MySQL


Les opérations possibles sur une base de données se trouvent dans le menu horizontal
de phpMyAdmin, dans l’onglet “Base de données”.

Importer une base de données existante

1. Dans le menu horizontal de phpMyAdmin il faut choisir l’onglet “Importer” ;


2. Dans le groupe ’Fichier à importer’, précisez l’emplacement du fichier qui contient
la base de données ; on peut utiliser le bouton ’Parcourir ...’.
3. Dans le groupe ’Format du fichier d’importation’, sélectionnez le format ’SQL’.
4. Exécutez.

Exporter une base de données

1. Pour exporter toute une base de données (toutes les tables) il faut se positionner
dans l’onglet “Base de données”.
2. Dans le menu horizontal de phpMyAdmin il faut choisir l’onglet “Exporter” ;
3. Dans le groupe ’Exporter’ il faut sélectionner la base de données et le format ’SQL’.
4. Dans le groupe ’Transmettre’ il faut que la case soit cochée !
5. Exécutez.
6. http ://www.mysql.fr/

36
3.4.3 Opérations sur les tables d’une base de données
Une fois qu’une base de données est sélectionnée, les instructions du langage SQL
(cf. chapitre 2) qui peuvent lui être appliquées se retrouvent dans les différents onglets du
menu horizontal : l’onglet “Structure” pour créer une nouvelle table, l’onglet “SQL” pour
exécuter une requête, etc.

3.5 Ressources en ligne


Sites sur l’utilisation de phpMyAdmin :
http://www.siteduzero.com/tutoriel-3-14496-phpmyadmin.html
http://www.6ma.fr/tuto/phpmyadmin+pour+gerer+vos+bases+mysql-96

Sites sur le langage SQL :


http://dev.mysql.com/doc/refman/5.0/fr/data-definition.html
http://dev.mysql.com/doc/refman/5.0/fr/data-manipulation.html

37
Chapitre 4

TD 1 : Travaux dirigés en BD, séance 1


– Requêtes simples sur une table

Pour effectuer ces exercices, vous devez avoir lu, avant de venir en TD, le chapitre 1
(pages 7 à 22), ainsi que les paragraphes de 2.3.1 à 2.3.4 (pages 25 à 28).

4.1 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 suivre la de-
marche décrite dans le §3.2.
Lancez MySQL avec phpMyAdmin 1 et importez 2 la base de données client commande 3 ,
qui se trouve dans le fichier N: \www\BD\Exemples\client commande.sql.

Questions

En utilisant pour chaque table l’onglet ’Afficher’ (ou ’Browse’) de l’interface de MySQL
sous phpMyAdmin, et sans faire de requêtes en SQL, répondez aux questions suivantes :

1. Combien d’enregistrements existent 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. Pour le client ’FERARD’, combien a-t-il passé de commandes ?
5. Pour le client ’VANBIST’, combien a-t-il passé de commandes ?
6. Quel(s) produits(s) a commandé le client ’VANBIST’ et en quelle quantité ?

1. voir le paragraphe 3.4.1, page 36


2. voir le paragraphe 3.4.2, page 36
3. voir le paragraphe 1.1, page 8

38
Question
En utilisant pour chaque table l’onglet ’Structure’ de l’interface de MySQL sous php-
MyAdmin, retrouvez pour chacune des colonnes ADRESSE, DATECOM, QSTOCK,
COMPTE, NCOM et NPRO quel est son type et précisez dans quelle table elle se trouve.

champs table type


ADRESSE

DATECOM

QSTOCK

COMPTE

NCOM

NPRO

4.2 Exercice 1a : requêtes simples sur la base de données


client commande
On suppose que phpMyAdmin/MySQL est lancé et que la BD client commande est
sélectionnée.
En utilisant l’éditeur de texte Notepad++ 4 , ouvrez le fichier exo 1 req simples.sql
qui se trouve dans votre répertoire www\BD\TD.

4.2.1 Exemples de requêtes


Pour chaque requête donnée ci-dessous
i) trouvez la réponse donnée par MySQL, sans l’exécuter ;
ii) exécutez la requête 5 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

4. voir le paragraphe 3.3, page 35


5. Copiez la requête à partir du fichier (CTRL+C dans Notepad++), et utilisez l’onglet ’SQL’ dans
MySQL pour la coller (CTRL+V) et l’exécuter.

39
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 ’

Question 1.1

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.

4.2.2 Requêtes générées par l’interface de phpMyAdmin/MySQL


Répondez aux questions suivantes en vous aidant de l’interface de MySQL sous php-
MyAdmin : après avoir identifié et sélectionné la table appropriée, utilisez l’onglet ’Re-
cherche’ (’Search’) avec ’Options’. Enregistrez les requêtes générées sous phpMyAdmin
dans le fichier exo 1 req simples.sql.

Questions

Q.1.2. Affichez la liste des clients dont le compte est négatif et qui n’habitent pas à Namur.
Q.1.3. Affichez la liste des produits disponibles (nom, prix, quantité) par ordre alphabétique.

40
4.2.3 Requêtes en SQL
Utilisez l’onglet ’SQL’ pour écrire les requêtes SQL qui répondent aux questions sui-
vantes. Enregistrez ces requêtes dans le fichier exo 1 req simples.sql.

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

Syntaxe MySQL : Attention à faire la différence entre ’ (le delimitateur pour chaines
de caractères) et ‘ (le delimitateur pour les noms des tables, champs, etc.).
Exemples de chaines de caractères : ’2009-01-01’, ’C400’, ’Paris’
Exemples de noms de champs : ‘LIBELLE‘, ‘QSTOCK‘

4.3 Exercice 1b : requêtes sur la BD gie agricole


Importez 6 la base de données gie agricole qui se trouve dans le fichier
N: \www\BD\Exemples\gie agricole.sql.
Utilisez l’onglet ’SQL’ pour écrire les requêtes SQL qui répondent aux questions sui-
vantes. Enregistrez ces requêtes dans le fichier exo 1 req simples.sql.

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

4.4 Pour terminer cet exercice


– 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 www\BD\TD.

6. voir le paragraphe 3.4.2, page 36

41
4.5 Questions de révision
4.5.1 Q.R.1
On suppose que la base de données gie agricole est sélectionnée. Quel est le
résultat de l’instruction suivante :
1 SELECT * FROM parcelle
2 WHERE Par_Lieu LIKE ’%Mont%’ AND Par_Superficie >300

Réponse

4.5.2 Q.R.2
On suppose que la base de données client commande est sélectionnée. Quels sont
les résultats des instructions suivantes :
1 SELECT LIBELLE, PRIX, QSTOCK FROM produit
2 WHERE PRIX < 100 AND QSTOCK > 0

1 SELECT LIBELLE, PRIX, QSTOCK FROM produit


2 WHERE PRIX < 100 OR QSTOCK > 0

Réponse

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

42
Chapitre 5

TD 2 : Travaux dirigés en BD, séance 2


– Requêtes avec jointures entre tables

Pour effectuer ces exercices, vous devez avoir lu, avant de venir en TD, les para-
graphes de 2.3.5 à 2.3.8 (pages de 28 à 31).

5.1 Exercice 2a : requêtes sur la BD client commande


On suppose que phpMyAdmin/MySQL est lancé et que la BD client commande est
sélectionnée.
En utilisant l’éditeur de texte Notepad++ 1 , ouvrez le fichier exo 2 req jointure.sql
qui se trouve dans votre répertoire www\BD\TD.

5.1.1 Exemples de requêtes


Pour chaque requête donnée ci-dessous
i) trouvez la réponse donnée par MySQL, sans l’exécuter ;
ii) exécutez la requête 2 et comparez les résultats obtenus avec vos réponses.

Requête 2.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 ’

1. voir le paragraphe 3.3, page 35


2. Copiez la requête à partir du fichier (CTRL+C dans Notepad++), et utilisez l’onglet ’SQL’ dans
MySQL pour la coller (CTRL+V) et l’exécuter.

43
Requête 2.2

1 SELECT LIBELLE, PRIX, QCOM


2 FROM detail, produit
3 WHERE detail.NPRO = produit.NPRO
4 AND NCOM = ’ 30188 ’

Requête 2.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 ’

5.1.2 Requêtes en SQL


Après avoir identifié les tables à utiliser et les conditions de jointure nécessaires, utili-
sez l’onglet ’SQL’ pour écrire les requêtes SQL qui répondent aux questions suivantes.
Enregistrez ces requêtes dans le fichier exo 2 req jointure.sql.

Questions
Q.2.1. Affichez tous les produits commandés (nom, prix, quantité) par le client ’GILLET’.
Q.2.2. Affichez tous les produits (nom, prix, quantité) commandés par le client ’FERARD’,
par ordre croissant de no de commande puis par ordre alphabétique sur le nom de
produit.
Q.2.3. Quels clients ont commandé en 2009 ?
Q.2.4. Quels sont les noms des produits qui ont été commandés les dix derniers jours de
l’année 2008 ?
Q.2.5. Affichez tous les produits commandés (nom, prix, quantité) par le client ’MER-
CIER’.
Q.2.6. Quels sont les noms des produits qui ont été commandés le 23/12/2008 et le 2/01/2009 ?
Q.2.7. Quels sont les noms des produits qui ont été commandés le 2/01/2009, mais pas le
23/12/2008 ?

5.2 Exercice 2b : requêtes sur la BD gie agricole


On suppose que phpMyAdmin/MySQL est lancé et que la BD gie agricole est
sélectionnée.
Après avoir identifié les tables à utiliser et les conditions de jointure nécessaires, utili-
sez l’onglet ’SQL’ pour écrire les requêtes SQL qui répondent aux questions suivantes.
Enregistrez ces requêtes dans le fichier exo 2 req jointure.sql.

44
Questions

Q.2.8. Affichez la liste de toutes les parcelles avec le nom de leurs propriétaires.
Q.2.9. Affichez la liste de toutes les interventions sur toutes les parcelles.
Q.2.10. Affichez la liste de toutes les interventions de tous les employés.

Pour terminer cet exercice


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

5.3 Exercice 3 : fonctions agrégatives


On suppose que phpMyAdmin/MySQL est lancé et que la BD client commande,
présentée dans le paragraphe 1.1 (page 8) est sélectionnée.
En utilisant l’éditeur de texte Notepad++ 3 , ouvrez le fichier
exo 3 req fonctions.sql qui se trouve dans votre répertoire www\BD\TD.

5.3.1 Exemples de requêtes sur la BD client commande


Pour chaque requête donnée ci-dessous
i) trouvez la réponse donnée par MySQL, sans l’exécuter ;
ii) exécutez la requête 4 et comparez les résultats.

Requête 3.1

1 SELECT nom, max(COMPTE)


2 FROM client

Requête 3.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%’

3. voir le paragraphe 3.3, page 35


4. Copiez la requête à partir du fichier (CTRL+C dans Notepad++), et utilisez l’onglet ’SQL’ dans
MySQL pour la coller (CTRL+V) et l’exécuter.

45
Requête 3.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 3.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 ’

5.3.2 Exercice 3a : fonctions agrégatives sur la BD client commande


Utilisez l’onglet ’SQL’ pour écrire les requêtes SQL qui répondent aux questions sui-
vantes. Enregistrez ces requêtes dans le fichier exo 3 req fonctions.sql.

Questions
Q.3.1 Calculez le montant commandé des produits de type sapin.
Q.3.2 Calculez le nombre de produits commandés de type sapin.
Q.3.4 Quelle est la date de la dernière commande enregistrée ?

5.3.3 Exercice 3b : fonctions agrégatives sur la BD gie agricole


On suppose que phpMyAdmin/MySQL est lancé et que la BD gie agricole est
sélectionnée.
Utilisez l’onglet ’SQL’ pour écrire les requêtes SQL qui répondent aux questions sui-
vantes. Enregistrez ces requêtes dans le fichier exo 3 req fonctions.sql.

Questions
Q.3.5 Calculez le nombre de proprietaires de parcelles.
Q.3.6 Calculez la superficies totales des parcelles.
Q.3.7 Affichez le nom de la plus grande parcelle.

5.4 Questions de révision


5.4.1 Q.R.4
On suppose que la base de données gie agricole est sélectionnée. Quel est le
résultat de l’instruction suivante :

46
1 SELECT Par_Nom FROM parcelle WHERE Par_Superficie IN
2 (SELECT max( Par_Superficie ) FROM parcelle)

Réponse

5.4.2 Q.R.5
On suppose que la base de données client commande est sélectionnée. Quelle
requête parmi celles données ci-dessous calcule le montant total TTC des produits en
stock ?
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

Q.R.6 : Quels sont les résultats des autres requêtes ?


Réponse

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

Quelle est la syntaxe générale d’une requête de jointure sur 3 tables ?


Réponse

47
Chapitre 6

TD 3 : Travaux dirigés en BD, séance 3


– Requêtes de mise à jour

Pour effectuer ces exercices, vous devez avoir lu, avant de venir en TD, le §1.5, le
§1.6, ainsi que les paragraphes de 2.3.9 à 2.3.12 (pages de 32 à 33).

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


On suppose que phpMyAdmin/MySQL est lancé et que la BD client commande est
sélectionnée.
En utilisant l’éditeur de texte Notepad++ 1 , ouvrez le fichier exo 4 req maj.sql qui
se trouve dans votre répertoire www\BD\TD.

6.1.1 Exemples de requêtes


Pour chaque requête donnée ci-dessous
i) trouvez la réponse donnée par MySQL, sans l’exécuter ;
ii) exécutez la requête 2 et comparez les résultats obtenus avec vos réponses.

Requête 4.1

1 UPDATE produit
2 SET QSTOCK = QSTOCK - 10
3 WHERE NPRO = ’ PH222 ’

1. voir le paragraphe 3.3, page 35


2. Copiez la requête à partir du fichier (CTRL+C dans Notepad++), et utilisez l’onglet ’SQL’ dans
MySQL pour la coller (CTRL+V) et l’exécuter.

48
Requête 4.2

1 UPDATE client
2 SET CAT = ’A1 ’
3 WHERE CAT IS NULL

Requête 4.3

1 INSERT INTO produit ( NPRO, LIBELLE, PRIX, QSTOCK)


2 VALUES ( ’ PH122 ’, ’ PL HETRE 100 x20x2 ’, ’ 120 ’, ’ 500 ’)

Requête 4.4

1 DELETE FROM detail


2 WHERE NCOM = ’ 30188 ’

Requête 4.5

1 DELETE FROM commande


2 WHERE NCOM = ’ 30188 ’

6.1.2 Requêtes générées par l’interface de phpMyAdmin/MySQL


Utilisez l’interface de phpMyAdmin/MySQL (l’onglet ’Insérer’) pour répondre aux ques-
tions données ci-dessous et enregistrez les requêtes générées dans le fichier exo 4 req
maj.sql.

Questions

Q.4.1. Ajoutez un nouveau client, nommé ’FRANCK’, qui habite à Lille, au 14 avenue du
Reclus (son numéro de client est ’W100’ et son compte est 0.0).
Q.4.2. Enregistrez une première commande du client ’FRANCK’ : 10 unités du produit
’PL. HETRE 200x20x2’ (le numéro de sa commande est 30189).
Q.4.3. Mettez à jour le stock du produit ’PL. HETRE 200x20x2’.
Q.4.4. Mettez à jour toutes les tables concernées pour enregistrer l’opération suivante : Le
client ’FRANCK’ achète aussi 25 unités du produit ’POINTE ACIER 60 (1K)’ sur
la même commande 30189.
Q.4.5. Quelle est la liste des mises à jour à faire pour enregistrer une nouvelle commande
pour un client ? Complétez le tableau ci-dessous.

49
type de maj table colonne(s)
INSERT/UPDATE/DELETE

6.1.3 Requêtes en SQL


Utilisez l’onglet ’SQL’ pour écrire les requêtes SQL qui répondent aux questions sui-
vantes. Sauvegardez ces requêtes dans le fichier exo 4 req maj.sql

Questions

Q.4.6. Mettez à jour le compte du client ’FRANCK’ : sa commande est de 2300 et il a


payé 2500.
Q.4.7. Ajoutez un nouveau produit, ’PL CHENE 200x20x2’, dont le stock initial est de
500 unités et le prix à l’unité est 120.
Q.4.8. Corrigez la quantité commandée du produit ’PA60’ dans la commande ’30185’ :
elle est de 10 unités.
Q.4.9. Le client ’FERARD’ ajoute à sa commande du 2/01/2009 cinq unités du produit
’PL. HETRE 200x20x2’.

Question

Est-ce que la Requête 4.5 peut être exécutée avant la Requête 4.4 (cf §6.1.1) ? Justifiez
votre réponse :

Si vous avez exécuté les requêtes 4.4 et 4.5 du §6.1.1, 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);

ATTENTION! Votre base de données a été modifiée ; il faut l’exporter 3 .

3. voir le paragraphe 3.4.2, page 36

50
6.2 Exercice 5 : Modification et contraintes d’intégrité
On suppose que phpMyAdmin/MySQL est lancé et que la BD client commande est
sélectionnée.

6.2.1 Question 5a
En utilisant pour chaque table l’onglet ’Structure’ de l’interface de MySQL sous php-
MyAdmin, retrouvez sa clé primaire :
clé primaire
table nom de la colonne type de la colonne
client

commande

detail

produit

6.2.2 Questions 5b
Pour chaque question donnée ci-dessous trouvez la réponse en la justifiant :

Q.5.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.5.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.5.3 Est-il possible d’ajouter à la commande numéro ’30188’ le produit ’PS222’ ? Et


le produit ’PH222’ ?

Q.5.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.5.5 Quelle est la liste des mises à jour à faire pour supprimer la commande ’30179’ ?

Q.5.6 Est-il possible de supprimer n’importe quel enregistrement de la table detail ?

Q.5.7 Est-il possible de supprimer n’importe quel enregistrement de la table commande ?

51
Q.5.8 Est-il possible de supprimer n’importe quel enregistrement de la table produit ?

Q.5.9 Est-il possible de supprimer n’importe quel enregistrement de la table client ?

Q.5.10 Quelles opérations sont à faire si on veut ajouter le numéro de téléphone de


chaque client ?

Q.5.11 Quelles opérations sont à faire si on veut ajouter une date de livraison à chaque
commande ?

6.2.3 Question 5c
En utilisant pour chaque table l’onglet ’Structure’ et l’onglet ’Concepteur’ de l’interface
de MySQL sous phpMyAdmin, retrouvez sa/ses clé(s) étrangère(s) ; ensuite retrouvez à
quelle colonne elle fait référence (en utilisant ’Gestion des relations’/’Relation view’) :
clé(s) étrangère(s)
table nom de la colonne table mère colonne référencée
client

commande

detail

produit

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

52
6.3 Questions de révision
6.3.1 Q.R.8
On suppose que la base de données gie agricole est sélectionnée. Quel est le
résultat de l’instruction suivante :
1 DELETE FROM employe
2 WHERE Emp_Prn like ’%H e n r i%’

Réponse

6.3.2 Q.R.9
On suppose que la base de données client commande est sélectionnée.
1 INSERT INTO commande (NCOM, NCLI, DATECOM)
2 VALUES( ’ 600 ’, ’ 600 ’, ’ 2012−01−12 ’)

L’instruction 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’ ;
Réponse

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

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

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

53
Chapitre 7

TD 4 : Travaux dirigés en BD, séances 4


– Le système d’information Starboat

7.1 Cahier des charges


Sur de nombreux canaux français, la navigation commerciale a laissé la place à la navi-
gation de plaisance. Ainsi la société Starboat s’est fait une réputation dans la location de
pénichettes aux touristes. Pour améliorer sa productivité, elle a besoin d’un système d’in-
formation (SI) afin d’équiper chacun de ses centres de location d’un logiciel de gestion
adapté à leurs activités. Nous présentons ci-dessous le cahier des charges du système d’in-
formation : il décrit le contexte d’utilisation de ce SI et explicite les besoins des clients
par une liste de fonctionnalités attendues.
Vous devez concevoir le modèle de données et le mettre en œuvre en MySQL.

7.1.1 Description du contexte


Les bateaux
Chaque bateau (pénichette) de la société Starboat
– est baptisé ;
– correspond à un type de modèle (classique, terrasse, ou flying bridge) ;
– a été terminé à une date donnée ;
– a navigué un certain nombre d’heures.
Pour chaque modèle de bateau (classique, terrasse, ou flying bridge) des informations
complémentaires sont disponibles :
– la puissance du moteur en CV ;
– la présence ou non d’une prise électrique ;
– le nombre de couchages.

Les révisions de bateaux


Chaque bateau est révisé régulièrement par un technicien. A chaque révision, le technicien
devra remplir l’application en indiquant :

54
– la date ;
– le nombre d’heures de navigation du bateau au moment de la révision ;
– les interventions réalisées, sous forme de texte libre.

Les locations de bateaux


Toutes les locations sont enregistrées dans la base. En plus des informations évidentes à
saisir pour une location, on souhaite avoir la possibilité de saisir au retour du bateau :
– le nombre d’heures de navigation effectuées ;
– le montant versé au titre des dommages infligés au bateau ;
– un commentaire libre.

7.1.2 Fonctionnalités attendues du SI


Le système d’information conçu pour la société Starboat doit pouvoir fournir
– la liste de tous les bateaux en cours de location ;
– la liste des bateaux accompagnés des informations correspondant à leur modèle et
classés par modèle ;
– la liste de tous les bateaux de type Flying Bridge ;
– le nom du dernier bateau révisé ;
– la liste des bateaux qui ont subi un dommage en cours de location ;
– la liste des bateaux disponibles à la location.

7.2 Exercice 7a : le schéma


Définissez le schéma de la base de données Starboat en précisant :
– quelles sont les tables ;
– quelles sont leurs colonnes avec leur type ;
– quelles sont leur clé primaire et éventuellement leurs clés étrangères.

7.3 Exercice 7c : requêtes


Écrivez les requêtes SQL pour répondre aux besoins énumérés dans le paragraphe 7.1.2.

7.4 Exercice 7d : questions


Quelles opérations sont à faire, si on veut intégrer dans la base que :
1. La société achète 3 bateaux de modèle ’luxe’.
2. On veut pouvoir connaı̂tre quel est le drapeau d’un bateau, le no de permis d’un
client, le no de portable d’un technicien.
3. Pour les interventions on dispose d’un catalogue qui donne pour chaque interven-
tion sa description, sa durée et son prix.

55
4. La société travaille avec 3 autres techniciens et veut savoir, pour chaque interven-
tion, quel est le nom du technicien qui a effectué la réparation.
Est-ce qu’on peut ajouter dans la base de données
1. un bateau ayant le même nom qu’un bateau déjà présent dans la base ?
2. un modèle ayant le même nom qu’un modèle déjà présent dans la base ?
3. une location sur un bateau déjà loué ?
4. une révision sur un bateau loué ?
5. une révision sur un bateau déjà réparé ?
6. deux révisions à la même date, sur deux bateaux différents ?

ATTENTION! A la fin du TD exportez 1 votre base de données Starboat.

1. voir le paragraphe 3.4.2, page 36

56
Index

base de données, 12, 22 table, 12, 23


colonne, 12
clé étrangère, 15, 23 ligne, 12
clé primaire, 14, 23, 33 type de données, 12, 23
colonne, 12, 23 booléen, 12
contrainte, 14–16, 33 boolean, 24
contrainte référentielle, 15, 16, 33 chaı̂ne de caractère, 12
CREATE DATABASE, 23 character, 23
CREATE TABLE, 23 varchar, 23
numérique, 12
DELETE FROM, 32
decimal, 23
DISTINCT, 27
float, 23
DROP, 24
integer, 23
fonctions agrégatives, 28 numeric, 23
temporel, 12
INSERT INTO, 32 date, 24
time, 24
jointure, 28
condition de jointure, 29 UPDATE, 33

operateur, 13

requête, 20, 25
condition de jointure, 28
condition de selection, 26
CREATE DATABASE, 23
CREATE TABLE, 23
DELETE FROM, 32
DROP, 24
INSERT INTO, 32
SELECT, 25
jointure, 28
ORDER BY, 27
sous-requête, 30
UPDATE, 33

schéma, 18, 33
SGBD, 7, 21
SQL, 20

57

Vous aimerez peut-être aussi