Vous êtes sur la page 1sur 20

Chapitre 2

Les langages de manipulation des données


relationnelles

Introduction

On peut distinguer trois grandes classes de langages de manipulation des


données
- Les Langages algébriques
Ces langages sont basés sur l’algèbre relationnelle. Cette dernière a été
définie par E.Codd comme une collection d’opérations sur les relations.
Dans cette catégorie a été défini le langage SQL (Structured Query
Langage) .

- Le Calcul relationnel de tuples


Il est Construit à partir de la logique de prédicats de premier ordre en
associant à chaque variable des formules logiques les tuples d’une
relation. On y a défini le langage QUEL du SGBD INGRES.

- Le Calcul relationnel de domaines


Ce type est construit à partir de la logique de prédicats en en variant les
variables des formules logiques sur les domaines des relations. On y
trouve le langage QBE (Query By Example) d’IBM.

Ces langages sont équivalents : ils permettent de désigner les mêmes ensembles
de données.

1. Algèbre relationnelle
1.1 Opérations de base
1.1.1 Opérations unaires
Restriction
La restriction d’une relation R par un prédicat Q est une relation R’ de
même schéma contenant les nuplets (tuples) de R satisfaisant Q.

Notation : R’= σ(R; Q)

La Qualification Q est de la forme: (A1 θ1 c1)⋀(A2 θ2 c2)⋀…⋀ (Ap θp cp)


Où : Ai attributs
θi ∊ {=, < , ≤, ≻, ≥, ≠} et ci Constantes.
Repésentation graphique R’

R
Exemple
Soit la relation Etudiant (ID-Etud, Nom, Prénom, Ville, DN, NbreAnnées)

Etudiant
ID_Etud Nom Prénom Ville DN NbreAnnées
001 Amir Ali Oran 15/01/1994 2
002 Bey Mohamed SBA 02/03/1992 3
003 Kadi Amal SBA 19/05/1993 3
004 Amar Ahmed Oran 20/04/1994 3

σ(Etudiant; Ville=‘Oran’) donne le résultat :


ID_Etud Nom Prénom Ville DN NbreAnnées
001 Amir Ali Oran 15/01/1994 2
004 Amar Ahmed Oran 20/04/1994 3

σ(Etudiant;(Ville=‘Oran’)∧(NbreAnnées>2) ) donne :
ID_Etud Nom Prénom Ville DN NbreAnnées
004 Amar Ahmed Oran 20/04/1994 3

Projection
La projection d’une relation R de schéma R( A1, A2,…, An ) sur les attributs
{A1, A2,…, Ap} ,p<n, est une relation R’ de schéma R’(A1, A2,…, Ap ) contenant
les tuples obtenus à partir des tuples de R par élimination des valeurs des
attributs de R n’appartenant pas à R’ et suppression des tuples en doubles.

Notation : R’= Π A1, A2,…, Ap (R)


Repésentation graphique R’

A1, …, Ap
R

Exemple : l’opération ΠNom, Prénom(Etudiant) donne le résultat :

Nom Prénom
Amir Ali
Bey Mohamed
Kadi Amal
Amar Ahmed

1.1.2 Opérations binaires


Union : l’union de deux relations R et S de même schéma (mêmes attributs) est
une relation T de même schéma contenant l’ensemble des tuples appartenant à R
ou S ou aux deux relations.

Notation : T=R ∪ S

Repésentation graphique
T

R S

Exemple Soit la relation :

Enseignant (Enseignant_ID, Nom, Prénom, Département_ID, grade)


ID_Enseignant Nom Prénom Département_ID grade
01 Amine Hichem D1 MCA
02 Benali Amira D2 MCA
03 Bekkar Reda D1 MAA
04 Azzi Mohamed D3 MCB
L’opération ΠNom,Prénom(Enseignant) ∪ ΠNom,Prénom(Etudiant) donne le résultat

Nom Prénom
Amine Hichem
Benali Amira
Bekkar Reda
Azzi Mohamed
Amir Ali
Bey Mohamed
Kadi Amal
Amar Ahmed

Différence : la différence de deux relations R et S de même schéma (dans


l’ordre R-S) est une relation T de même schéma contenant l’ensemble des tuples
appartenant à R et n’appartenant à S.

Notation : T= R – S

Repésentation graphique
T

R S

Exemple R2 A B
R1 A B a1 b1
a1 b1 a4 b4
a2 b2 a5 b5

R1-R2 A B
a2 b2
Produit cartésien : le p.c de deux relations R et S de schémas quelconques est
une relation T ayant pour attributs la concaténation des attributs de R et S et
pour tuples toutes les concaténations d’un tuple de R à un tuple de S.
Notation : T= R×S

Repésentation graphique
T

R S

Exemple
R1 A B S1 C D
a1 b1 c1 d1
a2 b2 c2 d2

R1xS1 A B C D
a1 b1 c1 d1
a1 b1 c2 d2
a2 b2 c1 d1
a2 b2 c2 d2

1.2 Autres opérations


Les opérations qui suivent sont construites à partir des opérateurs de base.

Sélection : cette opération est définie par une restriction suivie d’une projection.

Par exemple si on veut obtenir les noms et prénoms des étudiants habitant Oran
on écrira :

ΠNom, Prénom (σ(Etudiant; Ville=‘Oran’)) .


Nom Prénom
Appliqué à l’instance de relation Etudiant on aura :
Amir Ali
Amar Ahmed
Intersection : l’intersection de deux relations R et S de même schéma est une
relation T de même schéma contenant les tuples appartenant à la fois à R et à S.
Notation : T= R ∩ S

On peut démontrer que:


R ∩ S = R - (R - S) = S- (S-R)
Repésentation graphique T

R S

Exemple
R1 A B R2 A B
a1 b1 a1 b1
a2 b2 a4 b4
a3 b3 a5 b5

R1∩R2 A B
a1 b1

La jointure : la jointure de deux relations R et S selon une qualification Q est


l’ensemble des tuples du produit cartésien R×S satisfaisant Q.

Notation : R ⋈ S = σ(R ×S; Q)


Q

Repésentation graphique
T

R S
Exemple
R1 A B S3 C D
a1 b1 a1 d1
a2 b2 c4 d4
a3 b3 c5 d5

On veut réaliser la jointure de R1 et S3 selon la qualification Q : R1.A=S3.C

R1 ⋈ S3 A B C D
a1 b1 a1 d1

Cas particuliers de jointure:


• Equijointure: l’équijointure de R et S sur les attributs Ai et Bj est la
jointure selon la qualification Ai=Bj.
• Autojointure: l’autojointure de R selon un attribut Ai est la jointure de R
avec R selon la qualification Ai=Ai.
• Jointure naturelle : la jointure naturelle de R et S notée R ⋈ S est
l’équijointure de R et S sur tous les attributs communs de R et S, suivie de
la projection qui permet de conserver un seul de ces attributs égaux de
même noms.
• Semi-jointure : la s.j de R par S selon une qualification Q est l’ensemble
des tuples de R participant à la jointure de R par S selon Q.
Notation : R⋉S
Q

Division
La division de S (A1,A2, …Ap, Ap+1,…, An) par S(Ap+1,…, An) est une
relation Q(A1,A2,…Ap) formée de tous les tuples qui concaténés à chacun des
tuples de S donne toujours un tuple de R.

Notation : Q=R÷S
Cette opération s’applique à une requête qui contient le terme « pour tous ».

Repésentation graphique
T

R S
Exemple
R1 A B C
S4 A B
a1 b1 c1
a1 b1
a2 b2 c2
a2 b2
a3 b3 c3
a1 b1 c2

Le quotient des deux relations donne le résultat :

R1÷S4 C
c2

La division peut être exprimée par une suite d’opérations de base :


R÷S= T-U
Où T= ΠA1,A2, …Ap (R)
U= ΠA1,A2, …Ap ((T×S)-R)

Expression de requête:
Soit la base de données suivante :

Client ( NC, Nom, Adresse)


Produit (NP, désignation, type, année-prod)
Achat ( NC, NP, Quantité)

Soit la Requête (R):


«Donnez les noms et adresses des clients ayant acheté plus de 50 produits de
type ‘portable’ avec leurs années de productions’

Une expression en algèbre relationnelle de cette requête est :


Π Nom, Adresse, année-prod (σ (((Client ⋈Q1 Achat) ⋈Q2Produit) ; (Quantite>50) ⋀
(type=" portable") ⋀ (c)).

Q1 : Client.NC=Achat.NC ; Q2 : Produitt.NP=Achat.NP

Une écriture optimisée de cette requête serait :


Π Nom, Adresse , année-prod ((Client ⋈Q1 σ (Achat ; Quantite>50))⋈Q2 σ (Produit ;
type="portable")).
Représentation graphique:

Résultat

Nom, Adresse
année-prod

Q2

Q1

type=
Client "portable"
Quantite>50

Achat Produit

Un arbre algébrique de la requête R


2. Le langage SQL (Structured Query Language )

SQL est une évolution commercialisée par IBM du langage SEQUEL


initialement développé comme un langage de recherche. Ce langage peut être
perçu comme une expression très complète de séquences d’opérations
relationnelles.

SQL est un:


• Langage de Manipulation de Données (LMD) :
interroger et modifier les données de la base
• Langage de Définition de Données (LDD) : définir le schéma de la base de
données
• Langage de contrôle d’accès aux données

On distingue
• SQL2 : standard adopté en 1992
• SQL3 : extension de SQL2 avec "gestion" d’objets.

2.1 Commandes de requête (LMD)

Dans ce qui suit on va présenter les commandes SQL de manipulation des


données.

Pour cela on considère un exemple de schéma de base de données :

CLIENT (NC, Nom, Adresse)


PRODUIT (NP, designation, type, prix, couleur)
ACHAT (NC, NP, qte)

2.1.1. Expression de projection

Une projection s’exprime par la clause :

SELECT DISTINCT liste-attributs


FROM relation ;

Le mot clé DISTINCT permet de supprimer les doubles.

Exemple : «Listez les noms des clients»

SELECT DISTINCT Nom FROM CLIENT ;


2.1.2. Expression des sélections

Une sélection est une combinaison d’une restriction suivie d’une projection. Une
restriction s’exprime par un bloc du type :

SELECT *
FROM nom de relation
WHERE condition ;

La combinaison avec une projection s’effectue en remplaçant * par une liste


d’attributs de projection.
La condition après WHERE peut inclure :
- des opérateurs de comparaison : =, <>, <, <=, >, >=,
- des opérateurs : AND, OR, NOT et ( ) pour indiquer l’ordre
d’évaluation ;
- un prédicat LIKE
- un prédicat BETWEEN
- un prédicat IN
- un test de valeur NULL
- un prédicat EXISTS
- un prédicat ALL ou ANY

Exemples
« Lister les clients dont le nom comporte la lettre A en 2ième position »

SELECT *
FROM client C
WHERE C.nom LIKE '_A%'

Le prédicat LIKE compare une chaîne avec un modèle. (_) remplace n'importe
quel caractère (%) remplace n'importe quelle suite de caractères

« Lister les produits dont le prix est compris entre 5000 et 12000”
SELECT *
FROM produit P
WHERE P.prix BETWEEN 5000 AND 12000

Le prédicat BETWEEN teste l'appartenance à un intervalle

« Lister les produits de type Dell, Apple ou HP


SELECT * FROM produit P
WHERE P.type IN ('Dell', 'Apple', 'HP')
Le prédicat IN teste l'appartenance à une liste de valeurs
« Lister les produits dont le prix est inconnu »
SELECT *
FROM produit P
WHERE P.prix IS NULL

La valeur NULL signifie qu'une donnée est inconnue

On peut trier les résultats selon l’ordre croissant (ASC) ou décroissant (DESC)
d’un ou plusieurs attributs en utilisant la clause :

ORDER BY nom d’attribut[ordre] [, nom d’attribut[ordre]]…

Exemple : « listez les noms des clients habitant Sidi-Bel-Abbès par ordre
alphabétique croissant » s’écrit :

SELECT Nom
FROM Client
WHERE Adresse = « SBA »
ORDER BY Nom ASC;

L’ordre par défaut est l’ordre croissant (ASC).

2.1.3 Expression des jointures


Un cas particulier de jointure est le produit cartésien qui est une jointure sans
qualification qui s’écrit :

SELECT *
FROM relation1, relation2

Exemple

SELECT * FROM Client, Achat;

Cette requête aura pour résultat l’affichage de toutes les concaténations de


chaque tuple de la relation client avec chaque tuple de la relation achat.
La jointure avec qualification peut s’exprimer de plusieurs manières.

Par exemple, la requête « Trouvez les noms des clients qui ont fait des achats »
nécessite d’effectuer la jointure de Client avec Achat sur l’attribut NC (cette
jointure est appelée jointure naturelle):

SELECT Nom FROM Client, Achat


WHERE Client.NC=Achat.NC;
Cette même requête peut être exprimée de manière procédurale avec des blocs
imbriqués en utilisant l’opérateur IN

SELECT Nom FROM Client


WHERE NC IN (SELECT NC
FROM Achat);

Dans cette requête on exprime le fait que le numéro client (NC) des noms des
clients cherchés doit appartenir à la liste des numéros des clients (NC) de la
relation Achat.
Les attributs résultats doivent appartenir aux relations citées dans le bloc le plus
externe.

On peut combiner jointure, restriction et projection.


De même il est possible d’imbriquer des blocs SELECT … FROM…WHERE
à plusieurs niveaux.

Soit la requête : « Noms des clients ayant acheté des livres»

On peut l’exprimer de plusieurs manières :


1)
SELECT DISTINCT Nom
FROM Client, Achat, Produit
WHERE (Client.NC=Achat.NC)
AND (Achat.NP=Produit.NP)
AND (Produit.designation=’livre’);

2)
SELECT DISTINCT Nom
FROM Client
WHERE NC IN (SELECT NC
FROM Achat, Produit
WHERE (Achat.NP=Produit.NP)
AND (Produit.designation=’ livre’));
3)
SELECT DISTINCT Nom
FROM Client
WHERE NC IN (SELECT NC
FROM Achat
WHERE NP IN (SELECT NP FROM Produit
WHERE (Produit.designation=’ livre’)));
Afin de faciliter des imbrications des blocs, on peut référencer dans un bloc
interne une relation d’un bloc externe, on parle alors de référence inter-bloc.
Ainsi, la requête peut encore s’écrire :

4)
SELECT DISTINCT Nom
FROM Client
WHERE ‘livre’ IN (SELECT designation
FROM Achat, Produit
WHERE (Achat.NP=Produit.NP)
AND (Achat.NC=Client.NC));

2.1.4 Expression d’union, différence, intersection


Union
« Donnez les numéros des produits de type Dell ou de couleur noire »

SELECT NP
FROM Produit
WHERE type=’Dell’
UNION
SELECT NP
FROM Produit
WHERE couleur=’noire’;

Différence
« Listez les numéros des produits qui n’ont jamais été acheté»

SELECT NP
FROM Produit
MINUS
SELECT NP
FROM Achat;

Intersection
« Quels sont les numéros des produits qui sont achetés par les clients 1 et 2»

SELECT NP
FROM Achat
WHERE NC=1
INTER
SELECT NP
FROM Achat
WHERE NC=2;
2.1.5 Expressions de calcul

Des fonctions de calcul peuvent être utilisées :

COUNT : nombre de valeurs


SUM : somme des valeurs
AVG : moyenne
MAX : la plus grande valeur
MIN : la plus petite valeur

Ces fonctions peuvent être utilisées dans la clause SELECT, par exemple pour
« trouver le nombre de clients habitant SBA », on écrit :

SELECT COUNT(NC)
FROM Client
WHERE Adresse=’SBA’;

Mais aussi pour exprimer une qualification de recherché à l’aide d’une clause
spéciale:

GROUP BY liste d’attributs HAVING qualification avec fonction

Par exemple, « la recherche des numéros de produits achetés par plus de 20


acheteurs » s’écrit :

SELECT NP
FROM Achat
GROUP BY NP HAVING COUNT (DISTINCT NC) >20 ;

SQL fournit aussi d’autres clauses et mots clés tel que : ALL, ANY, EXISTS
qui permettent de distinguer les cas où l’on recherche un élément quelconque
des cas où l’on recherche tous les éléments.

Exemples :
« Donner les noms des produits qui n'ont pas été acheté »
SELECT C.nom
FROM produit P
WHERE NOT EXISTS( SELECT *
FROM Achat A
WHERE A.NP = P.NP );
« Donnez les nos des clients ayant acheté un produit en quantité supérieure à
chacune des quantités de produits achetées par le client 'c1' »

SELECT A.NC
FROM Achat A
WHERE A.qte >= ALL(SELECT B.qte
FROM Achat B
WHERE B.NC = 'c1' ) ;

« Donnez les nos des clients ayant acheté un produit en quantité supérieure à
au moins l'une des quantités de produits achetées par le client 'c1' »

SELECT A.NC
FROM Achat A
WHERE A.qte >= ANY(SELECT B.qte
FROM Achat B
WHERE B.NC = 'c1' );

2.1.6 Commandes de mises à jour

SQL offre 3 opérations de mise à jour : insertion (INSERT), suppression


(DELETE) et modification (UPDATE)

Exemples
« Ajoutez le client 10 de nom Amine habitant SBA » , s’écrit :

INSERT INTO Client VALUES(10 ,‘Amine’, ‘SBA’) ;

« Ajoutez dans une table « temp » de même schéma que la table Achat, tous
les achats qui sont en quantité supérieur à 50 »

INSERT INTO temp (NC, NP, qte)


SELECT A. NC, A.NP, A.qte
FROM Achat A
WHERE A.qte>50;

“Supprimez tous les produits achetés par ‘Ahmed’, s‘écrit :

DELETE Produit
WHERE ‘Ahmed’ IN (SELECT Nom FROM Client, Achat
WHERE(Client.NC=Achat.NC)AND (Achat.NP=Produit. NP));
« Mettre la quantité à 0 pour tous clients d’adresse SBA », s’exprime par :

UPDATE Achat
SET Quantite=0
WHERE ‘SBA’ IN (SELECT Adresse
FROM Client
WHERE Client.NC=Achat.NC);

2.2. Commandes de Définition (LDD)


2.2.1. Création d'un schéma de relation

CREATE TABLE nom de table (liste de définition de colonne,


[liste de contrainte de table]) ;

définition de colonne : :=
nom de colonne
(nom de domaine ou type)
[liste de contrainte de colonne]
[DEFAULT valeur par défaut]

contrainte de colonne : :=
[CONSTRAINT nom]
type de contrainte de colonne

type de contrainte de colonne : :=


PRIMARY KEY ou
NOT NULL ou
UNIQUE ou
CHECK(condition sur valeur) ou
REFERENCES nom de table(nom de colonne)

contrainte de table : :=
[CONSTRAINT nom]
type de contrainte de table

type de contrainte de table : :=


PRIMARY KEY (liste de nom de colonne) ou
NOT NULL (liste de nom de colonne) ou
UNIQUE (liste de nom de colonne) ou
CHECK (condition sur ligne) ou
FOREIGN KEY liste de nom de colonne REFERENCES
nom de de table (liste de nom de colonne)
Une contrainte qui ne fait référence qu'à une seule colonne de la table peut faire
partie intégrante de la définition de colonne.
Toute opération de mise à jour violant une des contraintes spécifiées sera rejetée
Le système garantit l'intégrité des données.

Exemples:

Client(NC, Nom, Adresse)

CREATE TABLE Client (


NC Integer PRIMARY KEY
Nom varchar(20) NOT NULL UNIQUE
Adresse varchar(50)) ;

avions(noAV, nomAV, CAP, LOC)

CREATE TABLE avions (


noAV NUMBER(4)
CONSTRAINT Cle Pavions PRIMARY KEY,
NOM AV VARCHAR(20),
CAP NUMBER(4)
CONSTRAINT Dom- CAP- avions CHECK (CAP> 4),
LOC VARCHAR(15) ) ;
O

2.2.2. Modification de table

ALTER TABLE nom de table modification de table ;

modification de table : :=
ADD COLUMN définition de colonne
ADD CONSTRAINT contrainte de table
DROP COLUMN nom de colonne
DROP CONSTRAINT nom de contrainte

Exemple : ajout d'un attribut à Client

ALTER TABLE Client


ADD COLUMN age Integer ;
2.2.3. Suppression d'une table

DROP TABLE Client ;

2.2.4. Notions de vues

Une vue est une table virtuelle résultat d’une requête. Son rôle est de :
- réduire la complexité syntaxique des requêtes
- définir les schémas externes.
- définir des contraintes d’intégrité.
- définir un niveau additionnel de sécurité en restreignant l’accès à un
sous-ensemble de lignes et/ ou de colonnes.

Création d’une vue de schéma externe

CREATE [OR REPLACE ] [ FORCE | NO FORCE]


VIEW nom de table [(liste de nom de colonne)]
AS requête [WITH CHECK OPTION | WITH READ ONLY] ;

Exemple
« création de la vue correspondant aux clients qui habitent Alger »

CREATE VIEW ClientsAlger


AS SELECT NC, Nom
FROM Client
WHERE Adresse = ’Alger’ ;

On peut interroger cette vue :

SELECT * FROM ClientsAlger;

Suppression d’une vue

DROP VIEW nom de la vue ;

2.2.5. Création d'index


La commande CREATE INDEX permet de créer des index multi-colonne

Syntaxe :
CREATE [UNIQUE] INDEX index ON table (colonne [ASC|DESC], ...)

L'option UNIQUE permet d'assurer l'unicité d'une clé


Exemple:
CREATE UNIQUE INDEX index1 ON client(Nom)

Les index permettent d'accélérer les recherches. Le système détermine sa


stratégie d'accès en fonction des index existants
Un index est supprimé par la commande DROP INDEX

Vous aimerez peut-être aussi