Data">
Cours SQL
Cours SQL
Cours SQL
Qbadou
LE LANGAGE SQL
I. Introduction
1. Qu'est-ce que SQL ?
SQL est un langage de manipulation de bases de données mis au point dans les années 70 par IBM. Il permet trois
types de manipulations sur les bases de données :
▪ La maintenance des tables : création, suppression, modification de la structure des tables grâce aux
instructions DDL (Data Definition Language).
▪ Les manipulations des bases de données : Sélection, modification, ajout et suppression d'enregistrements
grâce aux instructions DML (Data Manipulation Language).
▪ La gestion des droits d'accès aux tables : Contrôle des données : droits d'accès, validation des modifications
grâce aux instructions DCL (Data Control Language).
La commande CREATE TABLE permet de créer une table dans la base de données courante. Sa syntaxe est la
suivante :
[...]
Page 1
SQL/Microsoft Jet Par M. Qbadou
Les types
Les types de données sont définis dans le DDL (Data Definition Language) de chaque SGBD, et ils varient
beaucoup d'un logiciel à l'autre. Dans Access, les mêmes termes ne sont pas toujours utilisés dans l'interface
graphique, en VBA et en SQL. Voici un échantillon représentatif des différentes façons d'exprimer un type de
données lors de la création d'une table en SQL dans Access :
▪ Booléen : BIT ;
▪ Nombre entier : SHORT (entier), SMALLINT (entier), LONG (entier long), INTEGER (entier long),
BYTE (octet) ;
▪ Nombre réel : SINGLE(REAL) (réel simple), DOUBLE(FLOAT) (réel double), NUMERIC (réel
double) ;
▪ Monétaire : CURRENCY, MONEY ;
▪ Date/Heure : DATE, TIME, DATETIME ;
▪ Texte : VARCHAR (255 caractères), CHAR(n) ou TEXT(n) (n caractères), LONGTEXT (mémo, 32K
max.) ;
▪ Fichier binaire : LONGBINARY (Objet OLE) ;
▪ Compteur : COUNTER (NuméroAuto).
Clauses CONSTRAINT
Une contrainte permet de définir un index ou d’établir une relation avec une autre table. Il existe deux types de
clauses CONSTRAINT :
CONSTRAINT NomIndex
{PRIMARY KEY (ChampPrimaire1[, ChampPrimaire2[, ...]]) |
UNIQUE (ChampUnique1[, ChampUnique2[, ...]]) |
NOT NULL (ChampNotnull1[, ChampNotnull2[, ...]]) |
FOREIGN KEY (ChampRef1[, ChampRef2[, ...]]) REFERENCES
tableExterne[(ChampExterne1[,ChampExterne2[, ...]])]}
Paramètre Signification
Champ Nom du champ
Type Type de données, (voir tableau des types)
Page 2
SQL/Microsoft Jet Par M. Qbadou
Propriétés ▪ NOT NULL: autorise ou non que le champ puisse être vide (champ obligatoire).
▪ UNIQUE: deux enregistrements ne pourront avoir la même valeur dans ce champ.
▪ PRIMARY KEY: indique que ce champ est la clef primaire
▪ REFERENCES : indique le nom de la table étrangère ainsi que le ou les champs externes
▪ FOREIGN KEY : indique le ou les champs de référence de la table à définir
Exemple : Créer la nouvelle table "table_Etudiants" contenant deux champs : lechamp Matricule entier qui doit
toujours la clé primaire et le champ Nom contenant une chaîne obligatoire de 15 caractères :
La commande ALTER TABLEpermet de modifier la structure d'une table, sa syntaxe est la suivante :
Exemple :
L'exemple suivant ajoute à la table Employés une donnée Salaire avec un champ de type Monétaire :
Page 3
SQL/Microsoft Jet Par M. Qbadou
La commande CREATE INDEX permet de créer un index sur une table, sa syntaxe est :
CREATE[UNIQUE] INDEXNomIndex
ON NomTable (Champ1 [ASC|DESC][, Champ2 [ASC|DESC], ...])
Remarques
▪ Pour éviter les doublons dans le ou les champs indexés des enregistrements, on utilise UNIQUE.
▪ Dans la clause WITH facultative, on peut forcer les règles de validation des données. Ainsi on peut :
Interdire les entrées Null dans le ou les champs indexés des nouveaux enregistrements en utilisant l'option
DISALLOW NULL.
Empêcher que les enregistrements contenant des valeurs Null dans le ou les champs indexés soient inclus
dans l'index en utilisant l'option IGNORE NULL.
Définir le ou les champs indexés comme clé primaire en utilisant le mot réservé PRIMARY. Cela implique
alors que la clé doit être unique, ainsi on peut omettre le mot réservé UNIQUE.
Création d'un index comportant les champs Tél domicile et Extension dans la table Employés :
4. Instruction DROP
Permet de supprimer une table d’une base de données ou de supprimer un index d’une table :
5. Application
Enoncé :
On donne le MCd Suivant :
Page 4
SQL/Microsoft Jet Par M. Qbadou
Page 5
SQL/Microsoft Jet Par M. Qbadou
# Table : CARGOS
#==============================================================
create table CARGOS(
N_CARGO LONG not null,
NOMCARGO CHAR(30) not null,
PROPRIETAIRE CHAR(20) not null,
constraint PK_CARGOS primary key (N_CARGO));
# Table : CLIENTS
#==============================================================
create table CLIENTS(
N_CLIENT LONG not null,
NOMCLIENT CHAR(15) not null,
N_TELCLT CHAR(12),
constraint PK_CLIENTS primary key (N_CLIENT));
# Table : FOURNISSEURS
#==============================================================
create table FOURNISSEURS(
N_FOUR LONG not null,
NOMFOUR CHAR(15) not null,
N_TELF CHAR(12),
constraint PK_FOURNISSEURS primary key (N_FOUR));
# Table : MARCHANDISES
#==============================================================
create table MARCHANDISES(
N_MARCHANDISE LONG not null,
N_TRANSPORT LONG not null,
N_FOUR LONG not null,
N_CLIENT LONG not null,
DESCRIPTION CHAR(40) not null,
VOLUME SINGLE not null,
POIDS SINGLE not null,
constraint PK_MARCHANDISES primary key (N_MARCHANDISE));
# Table : SITUER
#==============================================================
create table SITUER(
CODEVILLE CHAR(5) not null,
VIL_CODEVILLE CHAR(5) not null,
DISTANCE LONG,
Page 6
SQL/Microsoft Jet Par M. Qbadou
# Table : TRANSPORTS
#==============================================================
create table TRANSPORTS(
N_TRANSPORT LONG not null,
N_CARGO LONG not null,
CODEVILLE CHAR(5) not null,
VIL_CODEVILLE CHAR(5) not null,
DATETRANSPORT DATE,
HEUREDEPART TIME,
PRIXU CURRENCY,
constraint PK_TRANSPORTS primary key (N_TRANSPORT));
# Table : VILLES
#==============================================================
create table VILLES(
CODEVILLE CHAR(5) not null,
NOMVILLE CHAR(20) not null,
PAYS CHAR(20) not null,
constraint PK_VILLES primary key (CODEVILLE));
Page 7
SQL/Microsoft Jet Par M. Qbadou
▪ SELECT
▪ UPDATE
▪ INSERT
▪ DELETE
1. La commande SELECT
La commande SELECT est la commande la plus complexe de SQL. Cette commande va servir à fairedes requêtes
pour récupérer des données dans les tables. Sa syntaxe générale est :
[WHERE Critère]
[HAVING Critère]]
Page 8
SQL/Microsoft Jet Par M. Qbadou
Exemples
Pour sélectionner les champs "prénom" et "nom" de tous les enregistrements de la table Clients :
Si on veut récupérer tous les champs des enregistrements sélectionnés, la syntaxe est la suivante :
On peut indiquer des critères de sélection avec la clause WHERE. Par exemple, pour sélectionner tous les Clients
de la table "Clients" dont le code postal est 75000 :
Pour sélectionner tous les articles dont le prix est supérieur à 100 F :
Il est possible de combiner plusieurs conditions avec des opérateurs logiques (AND, OR, NOT) :
L'opérateur AND réunit deux ou plusieurs conditions et sélectionne un enregistrement seulement si cet
enregistrement satisfait toutes les conditions listées. Par exemple, pour sélectionner tous les clients nommés
'Dolmi' et qui habitent Casa :
L'opérateur OR réunit deux conditions mais sélectionne un enregistrement si l’une des conditions listées est
satisfaite. Par exemple, pour sélectionner tous les clients nommés 'Dolmi' ou 'Dohri' :
AND et OR peuvent être combinés : Par exemple pour sélectionner les clients nommés "Dolmi" qui habitent soit
à Rabat, soit à Casa :
SELECT * FROM Clients WHERE nom = 'Dolmi' AND (ville = 'Rabat' OR ville
='Casa');
Page 9
SQL/Microsoft Jet Par M. Qbadou
L'opérateur AND a une plus grande priorité que l'opérateur OR. Pour cette raison les conditions liées par OR sont
placées entre parenthèses.
Pour sélectionner des enregistrements dont la valeur d'un champ peut être comprise dans une liste ou entre deux
valeurs, on utilise les clauses IN et BETWEEN.
Ou pour sélectionner les produits dont le prix est compris entre 100 et 1000 F :
Pour sélectionner les produits dont le prix n'est pas dans cet intervalle :
SELECT *FROM Produits WHERE prix_unitaire NOT BETWEEN 100 AND 1000;
De la même façon, NOT IN sélectionne les enregistrements exclus de la liste spécifiée après IN.
La clause LIKE permet de faire des recherches approximatives sur le contenu d'un champ. Par exemple pour
sélectionner les clients dont le nom commence par la lettre D :
Le symbole * remplace un ensemble de caractères, pour représenter tous les noms commençant par S, on utilisera
'S*', tous ceux se terminant par S, on utilisera'*S', et tous ceux comportant la lettre S : '*S*'. Le symbole ? ne
remplace qu'un seul caractère. Si on a deux clients nommés Tohri et Dohri, on utilisera ' ?ohri'.
La jointure permet de sélectionner des informations dans deux tables ou plus grâce aux relations existant entre ces
tables. On distingue plusieurs types de jointures :
Produit cartésien Jointure externe droite
Equijointure Thêta jointure
Jointure externe gauche Auto jointure
Il permet de créer une table résultat à partir deux tables ou plus comme suite : chaque enregistrement de la 1ère
table est concaténé à tous les enregistrements de l’autre table.
Page 10
SQL/Microsoft Jet Par M. Qbadou
1.6.2 Equijointure
Appelée aussi jointure naturelle, elle permet de réaliser une liaison logique entre deux tables ou plus avec un pivot
de jointure (condition de jointure) qui exprime l’égalité de valeur des clés des tables à joindre (clé primaire et clé
étrangère)
Ou bien :
Par exemple pour récupérer le nom et le prénom du client ayant passé la commande n°1 :
WHERE num_commande = 1;
Ou bien
La clause WHERE indique que le numéro de commande doit être égal à 1 et que la jointure doit se fairesur le
numéro de client.
Dans une équijointure, les enregistrements qui ne vérifient pas la condition de jointure, ne sont pas affichés. Une
jointure externe, appelée aussi demi-jointure, favorise une table appelée table dominante, par rapport à l’autre,
appelée table subordonnée. Les enregistrements de la table dominante sont affichés même si la condition de
jointure n’est pas vérifiée.
Lorsque la table dominante est celle dont la clé primaire entre dans la jointure, la jointure est dite externe gauche
si non elle est dite externe droite.
Jointure externe gauche :
Page 11
SQL/Microsoft Jet Par M. Qbadou
Une thêta jointure est une jointure dont l’expression du pivot utilise des opérateurs autres que l’égalité, tel que <,
<=, >, >=, <>
Une auto jointure est une jointure d’une table à elle-même. SQL construit la requête selon les mêmes règles que
précédemment en considérant plusieurs copies de la même table. Il est alors obligatoire d’utiliser des alias pour
distinguer les différentes copies :
Exemple :
Pour afficher pour chaque employé l’employé chef à qui rend compte :
Supposons qu’on veut la liste des clients ayant passé au moins une commande sans avoir à répéter les informations
sur les clients ayant passé plusieurs commandes. Pour cela, il suffit de préciser à SQL de supprimer les doubles du
résultat de la sélection en utilisant la clause DISTINCT et en faisant une jointure entre les tables Clients et
Commande :
On peut même rendre le résultat de la sélection plus agréable à la lecture en utilisant la clause ORDER BY :
La sélection renvoyée va être classée alphabétiquement d'abord sur le nom, puis sur le prénom.
Page 12
SQL/Microsoft Jet Par M. Qbadou
SQL a cinq fonctions importantes : SUM, AVG, MAX, MIN et COUNT. On les appelle fonctions d'ensemble
parce qu'elles résument le résultat d'une requête plutôt que de renvoyer une liste d'enregistrements.
Fonction Signification
SUM () Donne le total d'un champ de tous les enregistrements
satisfaisant la condition de la requête.
AVG () donne la moyenne d'un champ de tous les enregistrements
satisfaisant la condition de la requête
MAX () donne la valeur maximale d'un champ de tous les
enregistrements satisfaisant la condition de la requête
MIN () Donne la valeur minimale d'un champ de tous les
enregistrements satisfaisant la condition de la requête.
COUNT(*) Renvoie le nombre d'enregistrements satisfaisant la
requête.
Exemples :
Pour retourner le prix le plus petit, le prix le plus élevé et le prix moyen de la table Produits.
SELECT MIN(prix_unitaire),MAX(prix_unitaire),AVG(prix_unitaire)
FROM Produits ;
Pour retourner le nombre de produits dont le libellé commence par la lettre 'P'.
Une des utilisations les plus courantes de la clause GROUP BY est son association avec une fonction d'ensemble
(COUNT, SUM, AVG, MIN, MAX, STDEV, VAR, …)
Page 13
SQL/Microsoft Jet Par M. Qbadou
Par exemple, pour afficher le nombre de commandes effectuées par les vendeurs :
On peut ajouter une condition à la requête, par exemple, la liste des vendeurs avec leur nombre de commandes
pour le mois de janvier et dont le nombre des commandes est supérieur ou égal à 10. On utilisera pour cela les
clauses WHERE et HAVING.
Ventes Acheteurs
1.10. Les sous-requêtes
Num_acheteur Num_acheteur
On peut imbriquer autant de requêtes que l'on veut. La condition après Num_produit Nom
la clause WHERE peut porter sur le résultat d'une autre requête (ou Date_Vente Prénom
Prix
sous-requête). Supposons les tables suivantes :
La table Ventes contient, pour chaque acheteur, le produit qu'il a acheté et le prix d'achat.
On cherche la liste des acheteurs ayant acheté des articles chers. On considère qu'un article cher est un article dont
le prix est supérieur à la moyenne du prix des produits achetés + 100.
On peut constater que la condition de la requête est basée sur le résultat d'une autre requête. Dans cet exemple, à
chaque fois qu'un acheteur aura acheté un article cher, son numéro apparaîtra, pour éviter cela, on utilise la clause
DISTINCT num_acheteur pour éliminer les doubles :
Pour obtenir l’union des résultats de deux requêtes dont les listes des champs se correspondent champs pmps, on
utilise la clause UNION.
UNION
Page 14
SQL/Microsoft Jet Par M. Qbadou
Par exemple, supposons qu’on a une table clients_Rabat pour les clients habitant Rabat et une table clients_Casa
pour les clients habitant Casa. Pour obtenir les numéros des clients des deux tables, on écrit :
UNION
Remarque : SQL supprime automatiquement les doubles lorsque UNION est utilisé..
TP – Requêtes SELECT
1. Ouvrir la BD Comptoir (c:\...\Msoffice\Office\Exemples\)
2. Ecrire (sous forme de code SQL) et exécuter les requêtes suivantes
a. Requêtes monotables
i. Liste des clients qui habitent les villes de Paris, Lille Ou Nantes
Select * from clients where ville in (‘paris’,’lille’,’nantes’) ;
Ou bien
Where ville =’paris’ or ville =’lille’ or ville =’nantes’;
ii. Liste des clients dont les noms de société commencent par A, F ou O
Select * from clients where société like ‘A* or société like ‘F*’ or société like ‘O*’;
Ou bien
Where société like ‘[AFO]*’;
iii. Liste des produits dont le Prix unitaire n’est pas dans l’intervalle [500 700]
Select * from produits where [prix unitaire] not between 500 and 700;
Ou bien
Where [prix unitaire]<500 OR [prix unitaire]>700;
commande])=1996 ;
Select * from commandes where [date commande] like ‘*/07/1996’;
b. Requêtes multitables
Page 15
SQL/Microsoft Jet Par M. Qbadou
fournisseur]
employésChef.[n° employé]
Where employéshef.nom=’Fuller’ ;
iii. Liste des commandes assurées par les employés qui rendent compte à "Fuller"
iv. Liste des produits commandés pour les commandes faites par le client "ALFKI" et calculer pour
chaque produit commandé le prix total en tenant compte de la remise
Having count(*)>=5
iii. Liste des commandes avec le calcul du montant global pour chaque commande en tenant compte de
la remise
Select commandes.[n° commande], sum([quantité]*[prix unitaire]*(1-[remise (%)])) as
MontantTotal
commandes].[n° commande]
Page 16
SQL/Microsoft Jet Par M. Qbadou
commandes].[réf produit]
Group by produits.[réf produit]
Having count(*)=5
La commande INSERT est utilisée pour ajouter des enregistrements ou des parties d'enregistrements dans des
tables. Elle est utilisée généralement sous deux formes : Remarque
Pour paramétrer la requête on peut utiliser des
1ère forme
paramètres placés entre crochets au des valeurs
INSERT constantes :
Insert
INTO Nomtable (champ1,champ2,...) Into nomtable(champ1,champ2,…)
Values([param1],[param2],…) ;
VALUES ('valeur1','valeur2',...);
Exemple
Exemple insert into
insert into fournisseurs(numfournisseur,société,adresse,cp,ville,
téléphone)
fournisseurs(numfournisseur,société,adresse,cp, values([quel est num du fournisseur ?],[quel est le
nom ?],[quelle est l'adresse ?],[CP?],[Ville ?],[Tél ?])
ville)
values(‘F06’,’Thomson’,'n° 100 Hassan
II’,’20000’,’Casa’)
Cette forme est utilisée lorsqu'on veut insérer un seul enregistrement. On créera un nouvel enregistrement dont le
contenu du champ1 sera valeur1, le contenu du champ2 sera valeur2,etc...
Exemples
2ème forme
INSERT
(requête_select);
Dans cette seconde forme, le résultat de la requête va être inséré dans les champs indiqués de la table. Cette
méthode est utilisée lorsque plusieurs enregistrements sont ajoutés simultanément.
Page 17
SQL/Microsoft Jet Par M. Qbadou
Dans les deux cas, les valeurs insérées doivent correspondre au type de données du champ dans lequel l'insertion
va être faite. Les chaînes de caractères constantes doivent être placées entre apostrophes ( ' ).
Si des valeurs doivent être insérées dans tous les champs de l'enregistrement de la table, la liste des noms des
champs n'a pas besoin d'être explicitement indiquée dans la commande. Les valeurs des champs à insérer doivent
cependant apparaître dans le même ordre que les noms des champs lors de la création de la table.
INSERT
INTO Nomtable
VALUES ('valeur1','valeur2','valeur3',...);
INSERT
INTO Clients
Remarque : dans les champs pour lesquels les valeurs sont inconnues on insère la valeur NULL, à condition que
la propriété du champ "NULL interdit" soit à NON.
On peut insérer simultanément plusieurs enregistrements ou parties d'enregistrements dans une table. Dans ce cas,
les données insérées vont être récupérées dans une ou plusieurs autres tables.
Par exemple, pour placer dans une table nommée "Clients_Rabat" les clients habitant Rabat :
Créer une table "Client_Rabat" composée des champs: le nom, le prénom et l'adresse.
Exécuter la commande :
INSERT
INTO Clients_Rabat(nom,prenom,adresse)
SELECT nom,prenom,adresse
FROM Clients
WHERE ville='Rabat ;
Application
Page 18
SQL/Microsoft Jet Par M. Qbadou
On considère les trois dossiers suivants Tp1, Tp2 et Tp3. Chacun de ces dossiers contient trois fichiers bases de
données suivants : GestStockD,GestStockS et DB1
1. Depuis le dossier Tp1, ouvrez la base GstStockS et copier toutes ses données dans la base GestStockD.
On précise que les champs des tables sources et destinations ont les mêmes noms.
2. Depuis le dossier Tp2, Ouvrez la base GestStokD et copier y toutes les données de la base GestStockS.
On précise que les champs des tables sources et destinations ont les mêmes noms sauf pour les tables
Catégories
3. Dans le dossier Tp3, ouvrez la base DB1, et copier toutes les données de la base GestStockS dans la base
GestStockD. On précise que les champs des tables sources et destinations ont les mêmes noms.
Solution
1.
Insert Into Catégories IN 'C:\tp\tp1\geststockD.mdb' Select * FROM Catégories;
2.
Insert Into Catégories Select * FROM Catégories 'C:\tp\tp2\geststockS.mdb';
3.
Insert Into Catégories IN 'C:\tp\tp1\geststockD.mdb' Select * FROM Catégories in 'C:\tp\tp2\geststockS.mdb';
Page 19
SQL/Microsoft Jet Par M. Qbadou
'C:\tp\tp2\geststockS.mdb';
3. La commande UPDATE
La commande UPDATE est utilisée pour changer des valeurs dans des champs d'une table. Sa syntaxe est :
UPDATE Nomtable
SET champ1 = nouvelle_valeur1, /* il s’agit d’une expression */
champ2 = nouvelle_valeur2,
champ3 = nouvelle_valeur3
WHERE condition;
La clause SET indique quels champs de la table vont être mis à jour et avec quelles valeurs ils vont l'être. Les
champs non spécifiés après la clause SET ne seront pas modifiés.
Par exemple, pour modifier, dans la table Produits, le prix d'un produit dont le nom est "prod1" :
UPDATE produits
SET prix_unitaire = 1000
WHERE libelle = 'prod1';
La commande UPDATE affecte tous les enregistrements qui répondent à la condition donnée dans la clause
WHERE. Si la clause WHERE est absente, tous les enregistrements de la table seront affectés.
Par exemple pour modifier Le prix unitaire de TOUS les produits de la table produits :
UPDATE produits
SET prix_unitaire = 1000;
Exemple 2
Update Produits
Set QtéStock=0
Page 20
SQL/Microsoft Jet Par M. Qbadou
Comme la commande INSERT, la commande UPDATE peut contenir une sous requête select. Dans ce cas la
syntaxe est la suivante :
UPDATE table
SET champ1 = nouvelle_valeur1,
champ2 = nouvelle_valeur2,
champ3 = nouvelle_valeur3, …
Exemple : Pour changer à Dolmi le nom de l’acheteur qui a passé la vente numéro 10
4. La commande DELETE
Pour supprimer des enregistrements d'une table, utilisez la commande DELETE. La syntaxe est la suivante :
DELETE*
FROM table
WHERE condition;
On ne peut pas supprimer seulement le contenu de quelques champs des enregistrements. La commande DELETE
supprime des enregistrements entiers, c'est pour cela qu'il n'est pas nécessaire d'indiquer ici des noms de champs.
La condition spécifiée après WHERE va déterminer quels sont les enregistrements à supprimer.
Par exemple, pour supprimer tous les clients dont la ville est Rabat :
DELETE
FROM Clients
WHERE ville='Rabat';
Pour supprimer tous les enregistrements d'une table, n'indiquez pas de clause WHERE :
Cette variante de la commande DELETE ne supprime pas la table, elle supprime seulement les enregistrements
contenus dans cette table et laisse une table vide. On peut aussi, utiliser une sous requête qui servira à déterminer
la condition de la suppression. La syntaxe est la suivante :
DELETE
Page 21
SQL/Microsoft Jet Par M. Qbadou
FROM table
5. Application
Une agence de voyage veut informatiser la gestion des voyages qu’elle propose à ses clients (itinéraires,
monuments visités, réservations …)
Une base de données doit être construite à partir du cahier des charges suivant :
Les circuits :
Un circuit est identifié par un numéro, un nombre d’étapes et une séquence d’étapes. Une étape se déroule pendant
un nombre donné de jours dans une ville donnée. Au cours de chaque étape, tous les monuments de la ville,
lorsqu’il y en a, sont visités.
Un même circuit ne repasse jamais plusieurs fois dans la m^me ville, mais il peut arriver que la ville de départ ou
d’arrivée figure parmi les villes étapes.
Les villes sont identifiées par leurs noms. Les monuments sont identifiés par leurs noms dans la ville où ils sont
situés.
Un circuit peut être programmé plusieurs fois à des dates différentes. A chacune de ces programmations on associe
un nombre de places. Deux programmations d’un m^me circuit peuvent avoir des nombres de places différents.
Par contre le prix d’un circuit est toujours le même quelle que soit sa date de programmation. La durée d’un circuit
est égale à la somme des durées de ses étapes.
Les réservations :
Une réservation, identifiée par un numéro, est effectuée pour le compte d’un client (identifié par un nom) et
concerne une programmation d’un circuit. Plusieurs places pour la même programmation du même circuit peuvent
être réservées en une seule fois.
Le schéma relationnel retenu pour la base de données est composé des tables suivantes :
Villes (NomVille :Char(15), Pays : Char(15))
Monuments(NomMonument : Char(30), NomVille#,Prix :Currency)
Circuits(N°Circuit : Integer,NbreEtapes : Integer,PrixCircuit : Currency)
Etapes(N°Etape : Integer,N°Circuit#,NomVille#,Durée : Integer)
Programmations(N°Circuit#,DateProg : Date,NbrePlaces : Integer)
Clients(codeClt : Long,NomClt : Char(15))
Réservations(N°Reservation : Long,CodeClt#,(N°Circuit,DateProg)#,Places : Integer)
Page 22
SQL/Microsoft Jet Par M. Qbadou
5.2. Implantation
Page 23