cours sql

22
SQL/Microsoft Jet Par M. Qbadou Page 1 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). 2. Intérêts du langage SQL L'intérêt de SQL est que c'est un langage de manipulation de bases de données standard, On peut l'utiliser sur n'importe quelle base de données. Ainsi, avec SQL, on peut gérer une base de données Access, mais aussi Paradox, dBase, SQL Server, Oracle ou Informix . II. La maintenance de la structure d’une base de données La première série de commandes permettant la maintenance de la structure d’une base de données, est composée des instructions suivantes : ALTER TABLE CREATE TABLE CREATE INDEX DROP 1. Instruction CREATE TABLE La commande CREATE TABLE permet de créer une table dans la base de données courante. Sa syntaxe est la suivante : CREATE TABLE Nomtable( champ1 type[(taille)] [NOT NULL] [CONSTRAINT IndexMonochamp ...], champ2 type[(taille)] [NOT NULL] [CONSTRAINT IndexMonochamp ...], [...] [,CONSTRAINT IndexMultichamp... ]]);

Upload: abdelhak-hasnaoui

Post on 15-Dec-2015

217 views

Category:

Documents


2 download

DESCRIPTION

PROGRAMMATION

TRANSCRIPT

Page 1: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 1

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

2. Intérêts du langage SQL

L'intérêt de SQL est que c'est un langage de manipulation de bases de données standard, On peut l'utiliser sur

n'importe quelle base de données. Ainsi, avec SQL, on peut gérer une base de données Access, mais aussi

Paradox, dBase, SQL Server, Oracle ou Informix .

II. La maintenance de la structure d’une base de données

La première série de commandes permettant la maintenance de la structure d’une base de données, est composée

des instructions suivantes :

ALTER TABLE

CREATE TABLE

CREATE INDEX

DROP

1. Instruction CREATE TABLE

La commande CREATE TABLE permet de créer une table dans la base de données courante. Sa syntaxe est la

suivante :

CREATE TABLE Nomtable(

champ1 type[(taille)] [NOT NULL] [CONSTRAINT IndexMonochamp ...],

champ2 type[(taille)] [NOT NULL] [CONSTRAINT IndexMonochamp ...],

[...]

[,CONSTRAINT IndexMultichamp... ]]);

Page 2: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 2

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 :

Contrainte MonoChamp portant sur un seul champ :

CONSTRAINT NomIndex {PRIMARY KEY | UNIQUE | NOT NULL |

REFERENCES tableExterne [(ChampExterne)]}

Contrainte MultiiChamps portant sur plusieurs champs.

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)

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 : le champ Matricule entier qui doit

toujours la clé primaire et le champ Nom contenant une chaîne obligatoire de 15 caractères :

CREATE TABLE Etudiants (Matricule long CONSTRAINT PKEtudiants Primary

Key, Nom text(15)Not Null);

2. La commande ALTER TABLE

La commande ALTER TABLE permet de modifier la structure d'une table, sa syntaxe est la suivante :

ALTER TABLE Nomtable {ADD {COLUMN champ type[(taille)] [NOT NULL]

[CONSTRAINT IndexMonochamp ...] |CONSTRAINT IndexMultichamp ...} |

DROP {COLUMN champ | CONSTRAINT NomIndex}}

Page 3: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 3

ALTER TABLE permet deux types d’actions :

ADD pour ajouter un champ ou un index à une table existante

DROP Supprime un champ ou un index d'une table existante

Après l'action, on indique, entre parenthèses, les spécifications du champ ou de l’index de la même façon que

pour la commande CREATE TABLE. On ne peut faire qu'une action à la fois (add ou drop ).

Exemple :

L'exemple suivant ajoute à la table Employés une donnée Salaire avec un champ de type Monétaire :

ALTER TABLE Employés ADD COLUMN Salaire currency ;

L'exemple suivant retire de la table Employés le champ Salaire :

ALTER TABLE Employés DROP COLUMN Salaire ;

L'exemple suivant retire la clé externe existante de la table Commandes :

ALTER TABLE Commandes DROP CONSTRAINT EmployésCommandes ;

L'exemple suivant remet la clé externe dans la table Commandes :

ALTER TABLE Commandes ADD CONSTRAINT EmployésCommandes FOREIGN KEY

(N° employé) REFERENCES Employés (N° employé) ;

3. La commande CREATE INDEX

La commande CREATE INDEX permet de créer un index sur une table, sa syntaxe est :

CREATE [UNIQUE] INDEX NomIndex

ON NomTable (Champ1 [ASC|DESC][, Champ2 [ASC|DESC], ...])

[WITH {PRIMARY | DISALLOW NULL | IGNORE NULL}]

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.

Exemple d'instruction CREATE INDEX

Création d'un index comportant les champs Tél domicile et Extension dans la table Employés :

Page 4: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 4

CREATE INDEX NouvIndex ON Employés ([Tél domicile], Extension) ;

Création dans la table Clients d'un index comportant le champ N° client. Deux enregistrements ne peuvent avoir

les mêmes données, et la valeur Nulle est interdite.

CREATE UNIQUE INDEX Numcli ON Clients ([N° client]) WITH DISALLOW NULL;

4. Instruction DROP

Permet de supprimer une table d’une base de données ou de supprimer un index d’une table :

DROP {TABLE NomTable | INDEX NomIndex ON NomTable}

Exemple d'instruction DROP (Microsoft Access)

L'exemple suivant supprime l'index MonIndex de la table Employés :

DROP INDEX MonIndex ON Employés ;

L'exemple suivant supprime la table Stagiaires de la base de données :

DROP TABLE Stagiaires ;

5. Application

Enoncé :

On donne le MCd Suivant :

1. Implanter cet MCD dans Power AMC Designor

2. Vérifier le Modèle

3. Donner le Modèle Relationnel

4. Donner le Code SQL pour implanter la BD sous Access

5. Réaliser La base de données Access

Page 5: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 5

Réponse

3. Le Modèle Relationnel

4. Le Code SQL pour implanter la BD sous Access

# 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,

Page 6: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 6

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,

constraint PK_SITUER primary key (CODEVILLE, VIL_CODEVILLE));

# 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,

Page 7: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 7

constraint PK_VILLES primary key (CODEVILLE));

alter table MARCHANDISES

add constraint FK_MARCHAND_APPARTENI_CLIENTS foreign key (N_CLIENT)

references CLIENTS (N_CLIENT);

alter table TRANSPORTS

add constraint FK_TRANSPOR_ARRIVEE_VILLES foreign key (CODEVILLE)

references VILLES (CODEVILLE);

alter table TRANSPORTS

add constraint FK_TRANSPOR_ASSSURER_CARGOS foreign key (N_CARGO)

references CARGOS (N_CARGO);

alter table TRANSPORTS

add constraint FK_TRANSPOR_DEPART_VILLES foreign key (VIL_CODEVILLE)

references VILLES (CODEVILLE);

alter table MARCHANDISES

add constraint FK_MARCHAND_FOURNIR_FOURNISS foreign key (N_FOUR)

references FOURNISSEURS (N_FOUR);

alter table SITUER

add constraint FK_SITUER_SITUER_VILLES foreign key (CODEVILLE)

references VILLES (CODEVILLE);

alter table SITUER

add constraint FK_SITUER_SITUER2_VILLES foreign key (VIL_CODEVILLE)

references VILLES (CODEVILLE);

alter table MARCHANDISES

add constraint FK_MARCHAND_TRANSPORT_TRANSPOR foreign key (N_TRANSPORT)

references TRANSPORTS (N_TRANSPORT);

III. Les manipulations des bases de données

Une fois les tables créées, on peut commencer à y insérer des données, les mettre à jour, les supprimer. Toutes

ces opérations sont des opérations de manipulation des bases de données. Pour effectuer ces manipulations, SQL

dispose de 4 instructions :

Page 8: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 8

SELECT

INSERT

UPDATE

DELETE

1. La commande SELECT

1.1. Présentation et Syntaxe

La commande SELECT est la commande la plus complexe de SQL. Cette commande va servir à faire des

requêtes pour récupérer des données dans les tables. Sa syntaxe générale est :

SELECT [all|top n|disctinct|Distinct row]

{*|Nomtable.*|[Nomtable.]champ1 [AS alias1]

[, [Nomtable.]champ2 [AS alias2] [,...]]}

FROM ExpressionTable [, ...] [IN Baseexterne]

[WHERE Critère]

[GROUP BY champ1 [, champ2,...]

[HAVING Critère]]

[ORDER BY champ1 [Asc|Desc][, champ2 [Asc|Desc], ...]];

Exemples

Pour sélectionner les champs "prénom" et "nom" de tous les enregistrements de la table Clients :

SELECT prénm,nom FROM Clients;

Si on veut récupérer tous les champs des enregistrements sélectionnés, la syntaxe est la suivante :

SELECT * FROM Clients;

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 :

SELECT * FROM Clients WHERE [code postal]=75000;

1.2. Les opérateurs de condition

On peut utiliser les opérateurs suivants dans les conditions :

Opérateur Signification Opérateur Signification

Page 9: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 9

= Egal > Supérieur

<> Différent <= Inférieur ou égal

< Inférieur >= Supérieur ou égal

Pour sélectionner tous les articles dont le prix est supérieur à 100 F :

SELECT * FROM Produits WHERE prix_unitaire > 100;

1.3. Opérateurs logiques

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

'Dafir' et qui habitent Casa :

SELECT * FROM Clients WHERE nom = 'Dafir' AND ville = 'Casa';

L'opérateur OR réunit deux conditions mais sélectionne un enregistrement si UNE des conditions listées est

satisfaite. Par exemple, pour sélectionner tous les clients nommés 'Dafir' ou 'Dafik' :

SELECT * FROM Clients WHERE nom = 'Dafir' OR nom = 'Dafik';

AND et OR peuvent être combinés : Par exemple pour sélectionner les clients nommés "Dafir" qui habitent soit

à Rabat, soit à Casa :

SELECT * FROM Clients WHERE nom = 'Dafir' AND (ville = 'Rabat' OR

ville ='Casa');

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.

1.4. Clauses IN et BETWEEN

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.

Par exemple : Pour sélectionner les clients vivant à Rabat ou Casa :

SELECT * FROM Clients WHERE ville IN ('Rabat', 'Casa');

Ou pour sélectionner les produits dont le prix est compris entre 100 et 1000 F :

SELECT * FROM Produits WHERE prix_unitaire BETWEEN 100 AND 1000;

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;

Page 10: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 10

De la même façon, NOT IN sélectionne les enregistrements exclus de la liste spécifiée après IN.

1.5. La clause LIKE

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 :

SELECT * FROM Clients WHERE nom LIKE '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 Dafir et Dafik, on utilisera 'Dafi?'.

1.6. Les jointures

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

Equijointure

Jointure externe gauche

Jointure externe droite

Thêta jointure

Auto jointure

1.6.1 Produit cartésien

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.

SELECT listechamps FROM Table1,Table2 …;

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)

SELECT listechamps FROM Table1 INNER JOIN Table2 ON Table1.ClePri =

Table2.CléEtr …;

Ou bien :

SELECT listechamps FROM Table1 ,Table2

WHERE Table1.ClePri = Table2.CléEtr …;

Par exemple pour récupérer le nom et le prénom du client ayant passé la commande n°1 :

Page 11: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 11

SELECT nom, prénom FROM Clients INNER JOIN Commandes ON

Commandes.num_client = Client.num_client

WHERE num_commande = 1;

Ou bien

SELECT nom, prénom FROM Clients , Commandes

WHERE Commande.num_client = Client.num_client AND num_commande = 1;

La clause WHERE indique que le numéro de commande doit être égal à 1 et que la jointure doit se faire sur le

numéro de client.

1.6.3. Jointure externe

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 dominant, 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 :

SELECT listechamps FROM Table1 LEFT JOIN Table2 ON Table1.ClePri =

Table2.CléEtr …;

Jointure externe Droite :

SELECT listechamps FROM Table1 RIGHT JOIN Table2 ON Table1.ClePri =

Table2.CléEtr …;

1.6.4 Thêta jointure

Une thêta jointure est une jointure dont l’expression du pivot utilise des opérateurs autres que l’égalité, tel que <,

<=, >, >=, <>

SELECT listechamps FROM Table1 INNER JOIN Table2 ON Table1.ClePri

{<|<=|>|>=|<>} Table2.CléEtr …;

1.6.5 Auto jointure

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 :

Page 12: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 12

SELECT listechamps FROM Table INNER JOIN Table as AliasTable ON

Table.ClePri = AliasTable.CléEtr …;

Exemple :

Pour afficher pour chaque employé l’employé chef à qui rend compte :

SELECT Employés.[N° employé], Employés.Nom, Employés_1.[N° employé],

Employés_1.Nom

FROM Employés INNER JOIN Employés AS Employés_1 ON Employés.[Rend

compte à] = Employés_1.[N° employé];

1.7. Supprimer les doubles avec DISTINCT

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

SELECT DISTINCT Clients.num_client,nom, prénom FROM Clients, Commande

WHERE Commande.num_client = Client.num_client AND num_commande = 1;

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.

SELECT DISTINCTROW nom, prénom FROM Clients, Commande

WHERE Commande.num_client = Client.num_client AND num_commande = 1

ORDER BY nom, prénom;

1.8. Les fonctions d'ensemble

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.

Page 13: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 13

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

SELECT COUNT (*) FROM Produits WHERE libelle LIKE 'P*';

1.9. La clause GROUP BY

Une des utilisations les plus courantes de la clause GROUP BY est son association avec une fonction d'ensemble

(COUNT, SUM, AVG, MIN, MAX, …)

Par exemple, pour afficher le nombre de commandes effectuées par les vendeurs :

SELECT num_vendeur,COUNT (*) FROM Commandes GROUP BY num_vendeur;

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.

SELECT num_vendeur, COUNT (*) FROM Commandes

WHERE month([date commande])=1

GROUP BY num_vendeur HAVING COUNT(*)>=10;

1.10. Les sous-requêtes

On peut imbriquer autant de requêtes que l'on veut. La condition

après la clause WHERE peut porter sur le résultat d'une autre requête

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

SELECT Num_acheteur FROM Vente

WHERE prix >( SELECT AVG (prix) + 100 FROM Vente);

Num_acheteur

Nom

Prénom

Acheteurs

Num_acheteur

Num_produit

Date_Vente

Prix

Ventes

Page 14: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 14

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 :

SELECT DISTINCT Num_acheteur FROM Vente

WHERE prix >( SELECT AVG (prix) + 100 FROM Vente);

1.11. Les UNIONS

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.

SELECT … from …

UNION

SELECT … from … ;

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 :

SELECT num_client FROM clients_Rabat

UNION

SELECT num_client FROM clients_Casa;

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 monotable

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

Select Société , adresse from clients where …

ii. Liste des clients dont les nom 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]*’;

Page 15: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 15

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;

iv. Liste des commandes faites dans le mois 7 de l’année 1996

Select * from commandes where month([date cmmande])=7 and year([date

commande])=1996 ;

Select * from commandes where [date commande] like ‘*/07/1996’;

v. Liste des commandes réalisées au cours du 2ème semestre de l’année 1997

Select * from commandes where [date commande] between #07/01/1997# and #12/31/1997#

Ou bien

Where month([date commande]) in (7,8,9,10,11,12) and year([date commande]) =1997;

b. Requêtes multi tables

i. Liste des produits fournis par le fournisseur "Exotic Liquids"

Select produits.*

From fournisseurs inner join produits on fournisseurs.[n° fournisseur] = produits.[n°

fournisseur]

Where Société= ‘Exotic Liquids’ ;

Ou bien

From fournisseurs, produits

Where fournisseurs.[n° fournisseur] = produits.[n° fournisseur] and Société= ‘Exotic

Liquids’ ;

ii. Liste des employés qui rendent compte à l’employé "Fuller"

Select Employés.*

from Employes inner join employés as employésChef on employés.[rend compte à] =

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

c. Requêtes multi tables avec groupement

i. Nombre de commande par clients

Select clients.[code client], société , count(*) as NbreCommandes

From Clients inner join Commandes on clients.[code client]=commandes.[code client]

Page 16: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 16

Group by clients.[code client], société

ii. Liste des clients dont le nombre de commande est supérieur ou égal à 5. Le résultat doit être trié par

ordre décroissant du nombre de commande

Select clients.[code client], société , count(*) as NbreCommandes

From Clients inner join Commandes on clients.[code client]=commandes.[code client]

Group by clients.[code client], société

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

From commandes inner join [détails commandes] on commandes.[n° commande]= [détails

commandes].[n° commande]

Group by commandes.[n° commande]

iv. Liste des produits commandés 5 fois

Select produits.[réf produit],count(*) as NbreCommandes

From Produits inner join [détails commandes] on produits.[réf produit]= [détails

commandes].[réf produit]

Group by produits.[réf produit]

Having count(*)=5

2. La commande INSERT INTO

2.1. Présentation et syntaxe

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 :

1ère forme

INSERT

INTO Nomtable (champ1,champ2,...)

VALUES ('valeur1','valeur2',...);

Exemple

insert into

fournisseurs(numfournisseur,société,adresse,cp,ville)

Remarque

Pour paramétrer la requête on peut utiliser des

paramètres placés entre crochets au des valeurs

constantes :

Insert

Into nomtable(champ1,champ2,…)

Values([param1],[param2],…) ;

Exemple

insert into fournisseurs(numfournisseur,société,adresse,cp,ville,téléphone) values([quel est num du fournisseur ?],[quel est le nom ?],[quelle est l'adresse ?],[CP?],[Ville ?],[Tél ?])

Page 17: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 17

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

INTO Nomtable (champ1,champ2,...)

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

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 ( ' ).

2.2. Insérer tout ou une partie d'un enregistrement

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.

La syntaxe est alors :

INSERT

INTO Nomtable

VALUES ('valeur1','valeur2','valeur3',...);

Par exemple, dans la table Client, pour insérer un nouveau client :

INSERT

INTO Clients

VALUES (100,'Alami','Farid','rue de la résistance,’75000’,'Casa',

NULL);

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.

Page 18: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 18

2.3. Insérer plusieurs enregistrements ou plusieurs parties d'enregistrements

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

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;

Insert Into Sociétés IN 'C:\tp\tp1\geststockD.mdb' Select * FROM Sociétés;

Insert Into Produits IN 'C:\tp\tp1\geststockD.mdb' Select * FROM Produits;

Insert Into Entrées IN 'C:\tp\tp1\geststockD.mdb' Select * FROM Entrées;

Insert Into Sorties IN 'C:\tp\tp1\geststockD.mdb' Select * FROM Sorties;

Insert Into DétailsEntrées IN 'C:\tp\tp1\geststockD.mdb' Select * FROM DétailsEntrées;

Insert Into DétailsSorties IN 'C:\tp\tp1\geststockD.mdb' Select * FROM DétailsSorties;

Insert Into Règlements IN 'C:\tp\tp1\geststockD.mdb' Select * FROM Règlements;

Page 19: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 19

Insert Into Encaissements IN 'C:\tp\tp1\geststockD.mdb' Select * FROM Encaissements;

2.

Insert Into Catégories Select * FROM Catégories 'C:\tp\tp2\geststockS.mdb';

Insert Into Sociétés Select * FROM Sociétés 'C:\tp\tp2\geststockS.mdb';

Insert Into Produits Select * FROM Produits 'C:\tp\tp2\geststockS.mdb';

Insert Into Entrées Select * FROM Entrées 'C:\tp\tp2\geststockS.mdb';

Insert Into Sorties Select * FROM Sorties 'C:\tp\tp2\geststockS.mdb';

Insert Into DétailsEntrées Select * FROM DétailsEntrées 'C:\tp\tp2\geststockS.mdb';

Insert Into DétailsSorties Select * FROM DétailsSorties 'C:\tp\tp2\geststockS.mdb';

Insert Into Règlements Select * FROM Règlements 'C:\tp\tp2\geststockS.mdb';

Insert Into Encaissements Select * FROM Encaissements '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';

Insert Into Sociétés IN 'C:\tp\tp1\geststockD.mdb' Select * FROM Sociétés in 'C:\tp\tp2\geststockS.mdb';

Insert Into Produits IN 'C:\tp\tp1\geststockD.mdb' Select * FROM Produits in 'C:\tp\tp2\geststockS.mdb';

Insert Into Entrées IN 'C:\tp\tp1\geststockD.mdb' Select * FROM Entrées in 'C:\tp\tp2\geststockS.mdb';

Insert Into Sorties IN 'C:\tp\tp1\geststockD.mdb' Select * FROM Sorties in 'C:\tp\tp2\geststockS.mdb';

Insert Into DétailsEntrées IN 'C:\tp\tp1\geststockD.mdb' Select * FROM DétailsEntrées in

'C:\tp\tp2\geststockS.mdb';

Insert Into DétailsSorties IN 'C:\tp\tp1\geststockD.mdb' Select * FROM DétailsSorties in 'C:\tp\tp2\geststockS.mdb';

Insert Into Règlements IN 'C:\tp\tp1\geststockD.mdb' Select * FROM Règlements in 'C:\tp\tp2\geststockS.mdb';

Insert Into Encaissements IN 'C:\tp\tp1\geststockD.mdb' Select * FROM Encaissements in

'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

Page 20: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 20

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

Remplacer par 0 toutes les qtéStock définies à NULL :

Update Produits

Set QtéStock=0

Where QtéStock is NULL

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, …

WHERE condition = (requête);

Exemple : Pour changer à Dafir le nom des acheteurs qui ont acheté le produit de code 1

UPDATE Acheteurs SET nom = 'Dafir'

WHERE num_acheteur =(SELECT num_acheteur

FROM Ventes WHERE num_Produit = 1);

Page 21: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 21

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 :

DELETE FROM table;

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

FROM table

WHERE condition = (requête);

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.

Page 22: Cours SQL

SQL/Microsoft Jet Par M. Qbadou

Page 22

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.

5.1. Schéma relationnel

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)

Sous forme graphique le schéma se présente comme suit :

5.2. Implantation