Vous êtes sur la page 1sur 60

Chapitre 4: Le Langage SQL

3ème Année Ingénieur

Semestre: S5

Ecole Supérieure en Informatique


Département d’Informatique
Plan
I. Introduction
II. Opérations de base de l’algèbre relationnelle : SELECT,…
- Projection, Sélection, Jointures, Opérations ensemblistes, Division, …

III. Imbrication de requêtes :


- Simples, ANY, ALL, EXIST, …

IV. Fonctions de calcul :


- COUNT, AVG, SUM, MAX, MIN, …
V. Fonctions d’Agrégation :
- GROUP BY, HAVING, ORDER BY

VI. Opérations de mises à jour :


- INSERT, UPDATE, DELETE

VII. Opérations additionnelles :


- création de tables, vues, administration des tables,
I. Introduction
Origine

Origine : SQL (Structured Query Language), langage de requêtes standard


pour les SGBD relationnels est dérivé de SEQUEL, interface de consultation
pour System R (Astr IBM 81)
Historique
Année Nom Appellation Commentaires
Édité par l'ANSI puis adopté par l'ISO
en 1987.
Requêtes compilées puis exécutées
depuis un programme d‟application :
ISO/CEI 9075: SQL-86 ou SQL-
1986 • Types de données simples (entiers,
1986 87
réels, chaînes de caractères de taille fixe)
• Opérations ensemblistes restreintes
(UNION)

ISO/CEI 9075:
1989 SQL-89 ou SQL-1 Révision mineure.
1989
• Requêtes dynamiques: exécution
différée ou immédiate
• Types de données plus riches
(intervalles, dates, chaînes de caractères
de taille variable)
ISO/CEI 9075: SQL-92 (en)alias
1992 • Différents types de jointures: jointure
1992 SQL2
naturelle, jointure externe
• Opérations ensemblistes: différence
(EXCEPT), intersection (INTERSECT)
• Renommage des attributs dans la
clause SELECT
Historique (1)

Année Nom Appellation Commentaires

Expressions rationnelles, requêtes


récursives, déclencheurs, types non-scalaires
ISO/CEI 90 SQL-99 (en)alias et quelques fonctions orientées objet (les
1999
75:1999 SQL3 deux derniers points sont quelque peu
controversés et pas encore largement
implémentés).
Introduction de fonctions pour la
manipulation XML, « window functions »,
ISO/CEI 90
2003 SQL:2003(en) ordres standardisés et colonnes avec valeurs
75:2003
auto-produites (y compris colonnes
d'identité).
Ajout de quelques fonctions de fenêtrage
(ntile, lead, lag, first value, last value, nth
ISO/CEI 90 value), limitation du nombre de ligne
2008 SQL:2008(en)
75:2008 (OFFSET / FETCH), amélioration mineure sur
les types distincts, curseurs et mécanismes
d'auto incréments.
II. Opérations de base de l’algèbre relationnelle
Requêtes simples
Soit le schéma relationnel de la BDD suivante:
PRODUIT (npro, nomp, pu, qtes, couleur)
VENTE (nvente, nomc, nprv, qtev)
ACHAT (nachat, npra, qtea, nfour)
FOURNISSEUR (nfour, nomf, Statut, Ville

SELECT * FROM Produit WHERE nomp= „Pc Laptop‟;


SELECT nomp FROM Produit, Achat
WHERE Produit.npro=Achat.npra;

SELECT → liste des attributs demandés


FROM → liste des relations utilisées par la requête
WHERE → conditions pour les sélections et attributs de jointure

… permet de faire des projections, sélections et jointures !


Projections : la clause SELECT

La clause SELECT permet d'effectuer des projections Nomp


SELECT Nomp FROM Produit; Pc Laptop
Pc Laptop
Mais elle ne supprime pas les redondances

Remarque :

Contrairement à l‟algèbre relationnelle, SQL n‟élimine pas les doublons.


Pour les éliminer on utilise DISTINCT :

SELECT DISTINCT Nomp From Produit

Le DISTINCT peut être remplacé par la clause UNIQUE dans certains


systèmes
Renomage :

SELECT DISTINCT Nomp AS NomProduit , couleur AS CouleurProduit


FROM Produit;

NomProduit CouleurProduit
Pc Laptop Jaune
Selection

 Soit la relation VENTE (nvente, nomc, nprv, qtev)

 Requête: N° des produits vendus au client Rafik.

 Algèbre:

πnprv (σnomc= „Rafik„ (Vente))


 SQL :
nprv
SELECT nprv P2012
FROM Vente P1012
WHERE nomc = ‟Rafik‟
P2345

 Conditions de sélection :
• =, <, >, <>,…
• BETWEEN, LIKE
• IS NULL, IS NOT NULL, IN
Condition de sélection : Sélection : la clause WHERE

 La clause conditionnelle WHERE peut utiliser des:


 Comparateurs: =, <>, <, >, <=, >=
Opérateurs arithmétiques: +, *, …
Concaténations de chaînes: „Moussoul '||„ Ali' a pour valeur
„Moussoul Ali„
Opérateurs logiques: AND, OR, NOT
BETWEEN, LIKE
IS NULL, IS NOT NULL, IN
Comparateurs: =, <>, <, >, <=, >=

 Les conditions de base sont exprimées de 2 façons:


• attribut comparateur valeur
• attribut comparateur attribut

où le comparateur est : =, <, >, < >, …

 Soit la table : PRODUIT (npro, nomp, pu, qtes, couleur)

 Requête: Produits de prix unitaire est supérieur 150 000 DA

 SQL:

SELECT *
FROM Produit npro nomp pu qtes couleur
WHERE PU > 150 000
P1234 Laptop 160 000 50 Grise
P4567 PC Tablette 200 000 54 Noir
P9087 PC Appel 300 000 30 Blanc
Comparateur : BETWEEN, LIKE

 Soit la table : PRODUIT (npro, nomp, pu, qtes, couleur)


Requête: Produits avec un prix d‟achat entre 10000 DA et 20000 DA
 SQL:
SELECT nomp
FROM PRODUIT
WHERE PU BETWEEN 10000 AND 20000
Remarque: La condition y BETWEEN x AND z est équivalente à y <= z AND x
<= y
 Table VENTE (nvente, nomc, nprv, qtev)
Requête: Clients dont le nom commence par "C"
 SQL:
SELECT nomc
FROM vente
WHERE CNOM LIKE ‟C%‟
Remarque:
le littéral qui suit LIKE, pas exprimable avec l‟algèbre relationnelle, doit être
une chaîne de caractères éventuellement avec des caractères jokers (_, %).
Comparateur : BETWEEN, LIKE (1)

p LIKE s avec p une chaîne et s un pattern:

p NOT LIKE s

§ SELECT .. WHERE nomc LIKE „BOU _ _ _ _';

(recherche nomc de 7 caractères qui commence par 'STAR')


Opérations avec NULL
 La valeur NULL est une valeur “spéciale” représentant une valeur
(information) inconnue :

A θ B est inconnu (ni vrai, ni faux) si la valeur de A ou/et B est NULL


(θ est l‟un de : =, <, >, ≤ , ≥, <>)
A op B est NULL si la valeur de A ou/et B est NULL (op est l‟un de :
+, -, *, / ).

 En d‟autres termes :
 Le résultat d'une opération arithmétique dont un des termes est
NULL est NULL.
Le résultat d'une opération de comparaison dont un des termes est
NULL est UNKNOWN

 Table FOURNISSEUR (nfour, nomf, Statut, Ville)


Requête: Nom des fournisseurs d‟Alger.
 SQL:
SELECT nomf
FROM FOURNISSEUR
WHERE Ville = ‟Alger‟
Remarque : On ne trouve pas les fournisseurs avec VILLE = NULL !
Opérations avec NULL (1)
 NULL est une valeur par défaut mais pas une constante : elle ne peut
pas être utilisée explicitement dans une expression

 X IS NULL (X IS NOT NULL) : permettent de tester si une variable


contient la valeur NULL

Exemples:
Supposons que x a pour valeur NULL
x - x → NULL (et non 0)
x+5 → NULL
x=3 → UNKNOWN
Expressions incorrectes: NULL = x , NULL+5
 Pour connaître la valeur de vérité d'une expression contenant
UNKNOWN, on peut raisonner de la manière suivante:
TRUE = 1 FALSE= 0 UNKNOWN = ½
X AND Y = min(X,Y) X OR Y = max (X,Y) NOT X=1-X
Opérations avec NULL (2)

 Table FOURNISSEUR (nfour, nomf, Statut, Ville)


Requête: nom des fournisseurs dont l‟adresse est inconnu.

 SQL:
SELECT nomf
FROM FOURNISSEUR
WHERE Ville IS NULL

Remarque : Le prédicat IS NULL (ou IS NOT NULL) n‟est pas exprimable en


algèbre relationnelle.
Opérations avec IN

 Table PRODUIT (npro, nomp, pu, qtes, couleur)

Requête: numéro des produits avec un prix d‟achat de 1000 DA, de 2000
DA ou de 3000 DA

 SQL:

SELECT npro
FROM PRODUIT
WHERE pu IN {1000,2000,3000}

Remarque : La condition x IN {a, b, …, z} est équivalente à a OR x = b OR


…OR x = z.
Jointure Simple

PRODUIT (npro, nomp, pu, qtes, couleur)


VENTE (nvente, nomc, nprv, qtev)

! Requête: npro, nomp, pu des produits vendus à Sofiane

Algèbre : π npro, nomp, pu ( σ nomc= „Sofiane„ (PRODUIT)* (VENTE))


En SQL de base :

SELECT npro, nomp, pu


FROM PRODUIT, VENTE
WHERE nomc=„Sofiane‟ AND PRODUIT.npro=VENTE.nprv
Jointure Simple (1)

En utilisant les alias :

SELECT npro, nomp, pu


FROM PRODUIT P, VENTE V
WHERE nomc=„Sofiane‟ AND P.npro=V.nprv

Remarques :

1- Cette requête est équivalente à une équi-jointure naturelle. Les


attributs de jointure sont explicités.

2- SELECT npro, nomp, pu


FROM PRODUIT, VENTE
Équivaut à un produit cartésien des 2 tables, suivi d‟une projection.
Equijointure
 Une équijointure utilise l‟opérateur d‟égalité dans la clause de jointure et
compare généralement des clés primaires avec des clés étrangères.
 La clause JOIN … ON condition permet de programmer une équijointure.
 L‟utilisation de la directive INNER devant JOIN… est optionnelle et est
appliquée par défaut.
ETUDIANT(NINSP, ENOM, MAT, NIVEAU)
PROFESSEUR(MAT, PNOM, GRADE)
! Requête: NINSP, ENOM des étudiant encadrés par le professeur Mohamed
SELECT ETUDIANT.NINSP, ENOM SELECT ETUDIANT.NINSP, ENOM
FROM ETUDIANT JOINT PROFESSEUR ON FROM ETUDIANT INNER JOINT PROFESSEUR
ETUDIANT.MAT = PROFESSEUR.MAT ON ETUDIANT.MAT = PROFESSEUR.MAT
WHERE PNOM=‘Mohamed’ WHERE PNOM=‘Mohamed’

Remarques :
• Cette notation rend plus lisible la requête en distinguant clairement les
conditions de jointures, derrière ON, et les éventuelles conditions de
sélection ou restriction, derrière WHERE.
• L‟oubli du ON empêche l‟exécution de la requête (évite de lancer un
couteux produit cartésien en SQL de base)
Autojointure
 Cas particulier de l‟équijointure, l‟autojointure relie une table à elle
même.

Employe (Matricule, Nom, Prénom, Adresse, Salaire)


Requête: Nom et Salaire des Employés gagnant plus que l‟employé de
Matricule : 55577

R1 := πSAL ( σMatricule=55577 (Employe)


R2 := πNOm, Employe.Salaire (Employe) ((Employe.Salaire>R1.Salaire) (R1))

SELECT E1.Nom, E1.Salaire


FROM Employe E1, Employe E2
WHERE E2.Matricule = 55577 AND E1.Salaire > E2.Salaire
Les jointures externes

 Les jointures externes permettent d‟extraire des enregistrements qui


ne répondent pas aux critères de jointure.
 Lorsque deux tables sont en jointure externe, une table est «
dominante » par rapport à l‟autre (qui est dite « subordonnée »).
 Ce sont les enregistrements de la table dominante qui sont retournés
(même s‟ils ne satisfont pas aux conditions de jointure).

Departement
Employe

Mat NomE Ndept Salaire Ndept NomD localisation


1 Ali 1 50000 1 Personnel SBA
2 Kada 2 80000 2 Production Oran
3 Nhari 3 100000 4 Commercial Oran
Les jointures externes (1)
 les tuples qui ne peuvent pas être joints ne sont pas éliminés.

On garde tous les tuples des 2 tables Employe departement

SQL:
SELECT , , FROM
Employe NATURAL FULL OUTER JOIN Departement ON

Résultat de la Jointure Externe

Mat NomE Ndept Salaire NomD localisation


1 Ali 1 50000 Personnel SBA
2 Kada 2 80000 Production Oran
3 Nhari 3 100000 NULL NULL
NULL NULL 4 NULL Commercial Oran
Les jointures externes (2)

Jointure externe gauche: On garde tous les n-uplets de la première table


(gauche) :
SELECT , , FROM
Employe NATURAL LEFT OUTER JOIN Departement ON

Departement
Employe

Mat NomE Ndept Salaire Ndept NomD localisation


1 Ali 1 50000 1 Personnel SBA
2 Kada 2 80000 2 Production Oran
3 Nhari 3 100000 4 Commercial Oran

Mat NomE Ndept Salaire NomD localisation


1 Ali 1 50000 Personnel SBA
2 Kada 2 80000 Production Oran
3 Nhari 3 100000 NULL NULL
Les jointures externes (3)

Jointure externe droite: On garde tous les n-uplets de la deuxième table


(droite) :

SELECT , , FROM
Employe NATURAL RIGHT OUTER JOIN Departement ON
Departement
Employe

Mat NomE Ndept Salaire Ndept NomD localisation


1 Ali 1 50000 1 Personnel SBA
2 Kada 2 80000 2 Production Oran
3 Nhari 3 100000 4 Commercial Oran

Mat NomE Ndept Salaire NomD localisation


1 Ali 1 50000 Personnel SBA
2 Kada 2 80000 Production Oran
NULL NULL 4 NULL Commercial Oran
SQL Opération Algébre
R1 CROSS JOIN R2 produit Cartésien R1 X R2

R1 JOIN R2 ON prédicat Théta-jointure R1 R1.A<R2.B R2


(R1 JOIN R2 ON R1.A<R2.B)

R1 FULL/LEFT/RIGHT OUTER théta-jointure R1 R1.A<R2.B R2


JOIN R2 ON prédicat externes R1 R1.A<R2.B R2
R1 R1.A<R2.B R2

R1 NATURAL JOIN R2 jointure naturelle R1 R2

R1 NATURAL FULL/LEFT/RIGHT jointure externes R1 R2


OUTER JOIN R2 R1 R2
R1 R2
Operateurs ensemblistes
 Les operateurs ensemblistes s'appliquent a des ensembles dont les
données sont compatibles (même type).
 Contrairement aux autres operateurs, les operateurs ensemblistes
conservent la structure des relations.
Intersection, union et différence peuvent s'appliquer aux résultats de
deux SELECT qui retournent les mêmes colonnes ou les attributs de
même domaine.
Ces trois operateurs sont des operateurs binaires. Ils prennent en
paramètre deux relations compatibles ayant la même structure.
Syntaxe (operateurs ensemblistes) :
R UNION S
R INTERSECT S
R EXCEPT S
Operateurs ensemblistes (1)

UNION
PRODUIT (npro, nomp, qtes, couleur)

Requête: Produits dont la quantité est supérieure à 100 ou ceux qui ont
la couleur „Rouge‟.

SQL :

SELECT * FROM PRODUIT


WHERE qtes < 100
UNION
SELECT * FROM PRODUIT
WHERE couleur =„rouge‟;

Remarque:
• l‟union élimine les doublons
• Pour les garder on utilise l‟opération UNION ALL : le résultat contient chaque
tuple a + b fois, où a et b est le nombre d‟occurrences du tuple dans le 1° et le
2° SELECT.
Operateurs ensemblistes (2)
INTERSECTION

EMPLOYE (MAT, NOME, NDEPT, SAL) ; DEPARTEMENT (NDEPT, NOMD, LOC)

! Requête: Départements ayant des employés gagnant plus que 100000


DA et se trouvant à Sidi Bel Abbes ?

SELECT NDEPTNO FROM DEPARTEMENT WHERE LOC = ‟Sidi Bel-AbbesParis‟

INTERSECT

SELECT NDEPT FROM EMPLOYE WHERE SAL > 100000

Remarques :

• l‟intersection ne fait pas partie du standard


• l‟intersection élimine les doublons
• pour les garder on utilise l‟opération INTERSECT ALL : le résultat contient
chaque n-uplet min(a, b) fois où a et b est le nombre d‟occurrences du
tuple dans la 1° et le 2° SELECT
Operateurs ensemblistes (3)
DIFFERENCE
EMPLOYE (MAT, NOME, NDEPT, SAL) ; DEPARTEMENT (NDEPT, NOMD, LOC)
Requête: Départements sans employés ?

SQL :

SELECT NDEPT FROM DEPARTEMENT

EXCEPT

SELECT NDEPT FROM EMPLOYE

Remarque:

• la différence ne fait pas partie du standard


• la différence élimine les doublons
• pour les garder on utilise l‟opération EXCEPT ALL : le résultat contient
chaque tuple a – b fois, où a et b est le nombre d‟occurrences du tuple
dans la 1° et le 2° SELECT.
Operateurs ensemblistes (4)
DIVISION

Intérêts de la division :

 Elle permet de rechercher dans une table les sous-tables qui sont
complétées par tous ceux d‟une autre table.
 Elle permet ainsi de répondre à des requêtes de la forme
« quel que soit x, trouver y »
 L‟opérateur de division n‟est pas fourni par MySQL (ni par aucun autre
SGBDR). Il n‟existe donc pas d‟instruction DIVIDE.

FOURNITURE (FNUM, PNUM, QUANTITE)


PRODUIT (PNUM, PRIXV)
FOURNISSEUR (FNUM, FNOM, STATUS, VILLE)

! Requête: Nom des fournisseurs qui fournissent tous les produits ?

Algèbre:

R1 := πFNUM, PNUM (FOURNITURE) † πPNUM (PRODUIT)


R2 := πFNOM (FOURNISSEUR R1)
Operateurs ensemblistes (5

DIVISION
SQL:
SELECT FNOM
FROM FOURNISSEUR
WHERE NOT EXISTS
(SELECT *
FROM PRODUIT
WHERE NOT EXISTS
(SELECT *
FROM FOURNITURE
WHERE FOURNITURE.FNUM = FOURNISSEUR.FNUM
AND FOURNITURE.PNUM = PRODUIT.PNUM))

L’opérateur NOT EXISTS retourne la valeur TRUE si aucun enregistrement n’est extrait par
la sous-interrogation.
III. Requêtes Imbriquées :
Cas Simple

la Jointure peut aussi s‟exprimer par 2 blocs imbriqués


COMMANDES (CNUM, CNOM, PNUM, QUANTITE) ; FOURNITURE (PNUM,
FNUM, PRIXA)
! Requête: N°, prix et N° des fournisseurs des Produits commandés par Ali ?

Algèbre:
πPNOM, PRIX, FNOM ( σCNOM = „Ali„ (COMMANDES) (FOURNITURE))

SQL :

SELECT FOURNITURE.PNUM, PRIXA, FNUM


FROM FOURNITURE,COMMANDES
WHERE FOURNITURE.PNUM = COMMANDES.PNUM AND CNOM = ‟Ali‟
Equivalent à :
SELECT PNUM,PRIXA,FNUM FROM FOURNITURE
WHERE PNUM IN (SELECT PNUM FROM COMMANDES
WHERE CNOM = ‟Ali‟)
Cas Simple de la Différence
la Différence peut aussi s‟exprimer par 2 blocs imbriqués

EMPLOYE (MAT, NOME, NDEPT, SAL) ; DEPARTEMENT (NDEPT, NOMD, LOC)

! Requête: Départements sans employés ?

Algèbre :
πNDEPTNO (DEPARTEMENT) __πNDEPT (EMPLOYE)
SQL :

SELECT NDEPT
FROM DEPARTEMENT
EXCEPT
SELECT DISTINCT NDEPT
FROM EMPLOYE
Equivalent à :
SELECT NDEPT
FROM DEPARTEMENT
WHERE NDETP NOT IN (SELECT DISTINCT NDEPT FROM EMPLOYE)
Requête Imbriqué avec ANY

FOURNITURE (PNUM, FNUM, PRIXA)


COMMANDE (CNUM, CNOM, PNUM, QUANTITE)
! Requête: N° des fournisseurs du produit N°130 à un prix d‟achat inférieur
au prix d‟achat maximum des produit n°140 ?

SELECT FNUM FROM FOURNITURE


WHERE PNUM = 130 AND PRIX < ANY (SELECT PRIX
FROM FOURNITURE WHERE PNUM = 140)

Remarque: la condition < ANY (SELECT F FROM . . . ) est vraie ssi la


comparaison >v est vraie au moins pour une valeur v du résultat du bloc
(SELECT F FROM . . . ).

! Requête: N°, prix d‟achat et n° fournisseur des produits commandés par


Sofiane
SELECT PNUM, PRIXA, FNUM FROM FOURNITURE
WHERE PNUM = ANY (SELECT PNUM FROM COMMANDE WHERE CNOM =
‟Sofiane‟)
Remarque: les prédicats IN et = ANY sont utilisés de la même façon.
Requête Imbriqué avec ALL

Soit la table :

COMMANDE (CNUM, CNOM, PNUM, QUANTITE)

! Requête: Clients ayant commandé la plus petite quantité de produit N°130

SELECT CNOM
FROM COMMANDE
WHERE QUANTITE <= ALL (SELECT QUANTITE FROM COMMANDE
WHERE PNOM = 130)

Remarque: la condition <= ALL (SELECT F FROM . . . ) est vraie ssi la


comparaison ≤ v est vraie pour toutes les valeurs v du résultat du bloc
(SELECT F FROM . . . ).
Requête Imbriqué avec ALL (1)

Soit les tables :


- EMPLOYE (EMPNO, ENOM, DEPNO, SAL)
-DEPARTEMENT (DEPTNO, DNOM, LOC)

! Requête: Départements sans employés

SELECT DEPTNO
FROM DEPARTEMENT
WHERE DETPNO NOT = ALL (SELECT DISTINCT DEPTNO
FROM EMPLOYE)

Remarque: les prédicats NOT IN et NOT = ALL sont utilisés de la même


façon.
Requête Imbriqué avec EXIST
FOURNISSEUR (FNUM, FNOM, STATUS, VILLE) ; FOURNITURE (PNUM,
FNUM, PRIX)
! Requête: N° des fournisseurs qui fournissent au moins un produit
SELECT FNUM
FROM FOURNISSEUR
WHERE EXISTS (SELECT *
FROM FOURNITURE
WHERE FNUM = FOURNISSEUR.FNUM)
Remarque: la condition EXISTS (SELECT * FROM . . . ) est vraie ssi le
résultat du bloc (SELECT F FROM . . . ) n‟est pas vide.

! Requête: N° des fournisseurs qui ne fournissent aucun produit


SELECT FNUM
FROM FOURNISSEUR
WHERE NOT EXISTS (SELECT *
FROM FOURNITURE
WHERE FNUM = FOURNISSEUR.FNUM)

Remarque: la condition NOT EXISTS (SELECT * FROM . . . ) est vraie ssi le


résultat du bloc (SELECT F FROM . . . ) est vide.
Formes équivalentes de Quantification
Si θ est un des opérateurs de comparaison <, =, >,…
• la condition x θ ANY (SELECT Ri.y FROM R1,… Rn WHERE p) est
équivalente à : EXISTS (SELECT * FROM R1, … Rn WHERE p AND x M Ri.y)

• la condition x θ ALL (SELECT Ri.y FROM R1, … Rn WHERE p) est


équivalente à :
NOT EXISTS (SELECT * FROM R1, … Rn WHERE (p) AND NOT (x M Ri.y))

Exemple :
COMMANDE (CNUM, CNOM, PNUM, QUANTITE) ; FOURNITURE (PNUM,
FNUM, PRIXA)

! Requête: N°, prix et n°fournisseur des produits commandés par Omar

SELECT PNUM, PRIXA, FNUM FROM FOURNITURE


WHERE EXISTS (SELECT * FROM COMMANDE
WHERE CNOM = ‟Omar‟ AND PNUM = FOURNITURE.PNUM)

Equivalente à :
SELECT PNUM, PRIXA, FNUM FROM FOURNITURE
WHERE PNUM = ANY (SELECT PNUM FROM COMMANDE WHERE CNOM =
‟Omar‟)
Formes équivalentes de Quantification (1)

FOURNITURE (PNUM, FNUM, PRIXA)

! Requête: N° des fournisseurs qui fournissent au moins un produit avec un


prix d‟achat supérieur au prix d‟achat des produits fournis par le
fournisseur N°125

SELECT DISTINCT P1.FNUM


FROM FOURNITURE P1
WHERE NOT EXISTS (SELECT * FROM FOURNITURE P2
WHERE P2.FNUM = 125 AND P1.PRIX <= P2.PRIX)

Equivalent à :

SELECT DISTINCT FNOM FROM FOURNITURE


WHERE PRIX > ALL (SELECT PRIX FROM FOURNITURE WHERE FNUM = 125)
IV. Fonctions de calculs : COUNT, SUM, AVG, MIN, MAX

La fonction COUNT
 La fonction COUNT(*) compte le nombre des tuples du résultat d‟une
requête sans élimination des tuples doubles ni vérification des valeurs
nulles.
 Dans le cas contraire on utilise la clause COUNT(UNIQUE…).

Avion (IdAvion, TypeAvion, Portee)


Calendrier(Jour, CodeVol, IdPilote, IdAvion)
Pilote(IdPilote, Nompilote)
Vol(CodeVol, VilleDepart, VilleArrivee, Distance, HeureDepart, HeureArrivee)
Qualification (IdPilote, TypeAvion)

! Requête: Nombre d‟avions dont la porté > 5000 KM


SELECT COUNT(*) FROM Avion WHERE portee> 5000

! Requête: Nombre d‟avions programmées le lundi


SELECT COUNT(DISTINCT IdAvion FROM Calendrier
Fonction SUM, AVG, MAX, MIN

La clause AVERAGE opère sur un ensemble de valeurs prises par un


attribut.
La clause MIN opère sur un ensemble de valeurs prises par un attribut.
La clause MAX opère sur un ensemble de valeurs prises par un attribut.
La clause SUM opère sur un ensemble de valeurs prises par un attribut

Fournisseur (IdF,NomF,Adresse)
Produit (IdP, NomP, Qualité)
Catalogue (IdF, IdP, PU)
Commandes(IdC, NomC, IdP, Quantité)

! Requête: Quantité totale de produit N° 011 commandées


SELECT SUM (Quantite) FROM Commandes
WHERE PNUM = 011
Fonction SUM, AVG, MAX, MIN (1)

Requête: Prix de vente moyen de Tuile

SELECT AVG (PU)


FROM Produit P, Catalogue C
WHERE NomP = ‟Tuile‟ AND P.IdP=C.IdP

! Requête: Quantité maximum de produit n°011 commandés dans les


commandes
SELECT MAX (Quantité)
FROM Commandes
WHERE PNOM = 011;

! Requête: Prix d‟achat minimum des produits vendus


SELECT MIN (PU)
FROM Catalogue;
V. Fonctions d‟Agrégation : GROUP BY, HAVING, ORDER BY
La Clause GROUP BY

La clause GROUP BY permet de regrouper un ensemble de tuples qui


ont la même valeur dans les colonnes mentionnées

Le format général du SELECT avec GROUP BY est le suivant :


Soit une relation R (A1, A2, ... , An)
SELECT [Ai1] [,Ai2] ... [,Aiu] [,f1 (Aj1)] [,f2 (Aj2)] … [,fv (Ajv)]
FROM R
[ WHERE <condition1 portant sur chaque tuple de R> ]
GROUP BY Ak1 [,Ak2] … [,Akw]
[ HAVING <condition2 portant sur chaque groupe de tuples de R> ]
avec fi = fonction d'agrégation (COUNT, SUM, MIN, MAX, AVG) ,
Exemple
Soit le schéma relationnel suivant :

Fournisseur (IdF,NomF,Adresse)
Produit (IdP, NomP, Qualité)
Catalogue (IdF, IdP, PU)
Commandes(IdC, NomC, IdP, Quantité)

! Nombre de produits différents qui sont offerts par chacun des fournisseurs ?
Il faut partitionner l'ensemble des tuples de catalogue en un sous-ensemble (ou
groupe) par numéro de fournisseur (IdF. C'est ce que permet la clause GROUP BY.
SELECT IdF, COUNT (DISTINCT IdP)
FROM Catalogue
GROUP BY IdF;
Cette instruction génère dans le SGBD les actions suivantes :
1. Classer les tuples de Catalogue, groupe par groupe selon l'attribut IdF (un
groupe = ensemble des tuples ayant même IdF),
2. Pour chaque groupe :
- évaluer le résultat du SELECT (compter le nombre de IdP différents dans
ce groupe).
La Clause HAVING

 La Clause HAVING <Condition>permet de construire des groupes en


utilisant une propriété du groupe lui-même.

 Attention, contrairement à la clause "WHERE <condition>", la condition ne


porte pas sur un tuple mais sur l'ensemble des tuples d'un groupe.

Exemple
! Nombre de produits différents qui sont offerts par chacun des
fournisseurs ?, tels que le prix Unitaire est 1000 DA
SELECT IdF, COUNT (DISTINCT IdP)
FROM Catalogue
GROUP BY IdF
HAVING PU > 1000;
.
La Clause ORDER BY
 La clause ORDER BY permet de définir un ordre de tri pour les tuples du
résultat.
La clause ASC signifie selon l'ordre croissant; la clause DESC selon l'ordre
décroissant.

Exemple:
Soit le schéma relationnel suivant:
Employé (Matricule, Nom, Prénom, DateNaissance, Adresse, Salaire,
N°Dep)
Département (N°Dep, NomD, Directeur)
Projet (NomP, N°Pro, Lieu, N°Dep)
Travaille (Matricule, N°Pro, Heures)
! Liste des employés par ordre Alphabétique qui travaillent au
département de recherche.
SELECT Nom, Adresse
FROM Employé
WHERE N°Dep IN
(SELECT N°Dep
FROM Département
WHERE NomD='Recherche„)
ORDER BY Nom ASC , Prénom ASC, Matricule ASC;
VI. Opérations de mises à jour :

 Insertion de tuples : INSERT

 Syntaxe : INSERT INTO R(a1, a2,…, an) VALUES (v1, v1,… vn)
 Liste des attributs (ai ) de la table & liste des valeurs respectives de
chaque attribut (vi).
1. chaque a i doit être un attribut de R
2. les attributs non indiqués restent à NULL ou à leur valeur par défaut.
toujours indiquer une valeur pour un attribut déclaré NOT NULL

PRODUIT (PNUM, PNOM, PRIXV)


FOURNISSEUR (FNUM, FNOM, STATUT, VILLE)

! Insertion d‟une ligne dans Produit :


INSERT INTO PRODUIT (PNUM, PNOM, PRIXV) VALUES (125, ‟café‟, 15)

! Insertion de 2 fournisseurs :
INSERT INTO FOURNISSEUR (FNUM, FNOM, VILLE)
VALUES (234, ‟tessala‟, ‟Sfisef‟), (235, ‟maria‟, ‟SBA‟)
Insérer des tuples

- Insérer un tuple : INSERT INTO nomrelation : < tuple constant>


- Insérer un ensemble de tuples :
INSERT INTO nomrelation :
<requête SELECT dont le résultat a même schéma que la relation nomrelation>
Exemple : autre catalogue de produits à rajouter à P : Catalogue (NP, nomP,
couleur, poids, prix).
INSERT INTO P :
SELECT NP, nomP, couleur, poids
FROM Catalogue.

Supprimer des tuples

DELETE nomrelation [WHERE condition]


Si la clause "WHERE condition" est présente, seuls les tuples satisfaisant la
condition sont
supprimés.
Si la clause "WHERE condition" est absente, alors tous les tuples sont
supprimés; la relation
continue d'exister, mais sa population est vide.
Mettre à jour un (des) attribut(s)

UPDATE nom relation

SET nomattr1 = <expression1 qui définit une valeur pour l'attribut1> ,


.....
[WHERE condition]
Exemple : pour les produits verts, changer leur couleur, elle devient "vert d'eau".

UPDATE P
SET couleur = "vert d'eau"
WHERE couleur = "vert"
 Modification de tuples : UPDATE

Syntaxe : UPDATE R SET a1, = v1, a2, = v2, … an, = vn WHERE condition
Contrairement à INSERT et UPDATE, INSERT s’applique à un ensemble de lignes :
1. énumération des attributs à modifier
2. indication pour chaque attribut à modifier de la nouvelle valeur
3. la clause WHERE condition permet de spécifier les lignes auxquelles s’applique la
mise à jour : identique au WHERE du SELECT
Remarque : on ne peut pas violer les contraintes sur la table.
PRODUIT (PNUM, PNOM, PRIXV)
FOURNITURE (FNUM, PNUM, PRIXA)
! Mise à jour du prix de vente du produit N°111
UPDATE PRODUIT SET PRIXV = 12
WHERE PNUM = 111
! Augmenter les prix de vente de tous les produits fournis par le fournisseur
n°222 de 15% :
UPDATE PRODUIT SET PRIXV = prix*1.15
WHERE PNUM IN (SELECT PNUM FROM FOURNITURE WHERE FNUM = 222)
Suppression de tuples : DELETE

Syntaxe : DELETE FROM R WHERE condition


Permet de supprimer une ou plusieurs lignes dans la table R.
• elle s‟applique à des lignes et pas à des attributs
• la clause WHERE condition est indentique au WHERE du SELECT
PRODUIT (PNUM, PNOM, PRIXV)
FOURNISSEUR (FNUM, FNOM, STATUT, VILLE)
FOURNITURE (FNUM, PNUM, PRIXA)
COMMANDE (CNUM, CNOM, PNUM, QUANTITE)
! Destruction des produits fournit par le fournisseur n°222 :
DELETE FROM PRODUIT
WHERE PNUM IN (SELECT PNUM
FROM FOURNITURE WHERE FNUM = 222)
! Destruction de Maria :
DELETE FROM FOURNISSEUR
WHERE FNOM = ‟Maria‟
VI. Opérations additionnelles :
- création de tables, vues, administration des tables,

Création de Tables : CREATE TABLE

CREATE TABLE PRODUIT(PNUM INTEGER, PNOM VARCHAR(20), PRIXV


INTEGER, PRIMARY KEY (PNUM));
CREATE TABLE FOURNISSEUR(FNUM INTEGER PRIMARY KEY, FNOM
VARCHAR(20), ville VARCHAR(16));
CREATE TABLE FOURNITURE (PNUM INTEGER NOT NULL, FNUM INTEGER
NOT NULL, PRIXA INTEGER,
FOREIGN KEY (PNUM) REFERENCES PRODUIT,
FOREIGN KEY (FNUM) REFERENCES FOURNISSEUR,
PNUM, FNUM PRIMARY KEY);

Destruction de Tables : DROP TABLE :

DROP TABLE FOURNITURE;


DROP TABLE PRODUIT;
DROP TABLE FOURNISSEUR;
Vues :
 Vue "table virtuelle" composée à partir d'une ou plusieurs table(s) dont le
schéma et les tuples se déduisent de ces tables comme étant le résultat
d'une requête d'interrogation
 Seules les définitions de vues sont stockés dans la méta-base
(dictionnaire)
• syntaxe SQL :
CREATE VIEW <nom_vue> [(liste d'attributs)] As <requête>
Usages des vues :

• simplification de requêtes
• confidentialité en définissant des sous-ensembles de la BdD :
• type (attributs): -> cacher un ou plusieurs colonnes à un utilisateur
• occurrences (tuples) -> cacher un ou plusieurs enregistrements à un
utilisateur
• combinaison de types et d'occurrences: -> confidentialité sophistiquée
EXEMPLE
OUVRAGE (IdOuv, Titre, Auteur, domaine)
ABONNE (IdAb, Type, Nom-Prénom, Adresse)
PRET (IdOuv, IdAb, date_emprunt, date_restitution)

1- sous ensemble d'occurrences


CREATE VIEW WEB AS
SELECT IdOuv, Titre, Auteur FROM OUVRAGE
WHERE Domaine = « Technologie Web" ;
2- restructuration d'information pour l'usager
CREATE VIEW lecteur_Tech_WEB AS
SELECT IdAb, Type, Nom-Prénom, Adresse, IdOuv, date_emprunt,
date_restitution FROM OUVRAGE O, ABONNE A, PRÊT P
WHERE O.IdOuv = P.IdOuv
AND A.IdAb = P.IdAb
AND O.Domaine = « Technologie Web" ;
3- dérivation par calculs de nouvelles informations, renomination,...
CREATE VIEW stat_prets (IdAb, nb_prets ) AS
SELECT IdAb, COUNT(*) IdOuv, date_emprunt, date_restitution
FROM ABONNE A, PRET P
WHERE A.IdAb = P.IdAb
AND date_emprunt >"date D1"
GROUP BY IdAb ;
4- simplification de requêtes
! Nom des lecteurs ayant emprunté plus de 2 ouvrage sur le Web sémantique de
Pascal Hitzler, le même jour ?
SELECT DISTINCT Nom-Prénom
FROM lecteur_Tech_WEB, Web
WHERE lecteur_Tech_Web.IdOuv = Web.IdOuv
AND auteur = " Pascal Hitzler "
GROUP BY IdAb, date_emprunt
HAVING COUNT (IdOuv) >2;

L‟exécution de cette requête fait appel aux 3 vues précédemment définies :

CREATE VIEW WEB …


CREATE VIEW lecteur_Tech_Web …
CREATE VIEW stat_prets (IdAb, nb_prets ) …
MISE A JOUR DES VUES

Interdite en général

car :
• Attributs non définis dans la vue :
toute insertion d'un tuple dans la vue entraîne l'insertion d'un tuple dans la
BdD ayant une valeur indéterminée pour des attributs non visibles da la vue
• Risques d'incohérences :
lorsque la vue est obtenue par jointure de relations réelles
ex: V = A joint B :
insert V => insert A ? insert B? insert A et B?
d'où :
• la mise à jour sur vue ne peut être automatique
• il faut décrire pour chaque vue la sémantique des opérations de mise à
jour
Administration des tables,

2 types de d‟administration :

1- Centralisée :
• l'administrateur définit les usagers et ce qu'ils ont le droit de faire sur les
tables et les vues

2 - Décentralisée :
• lorsqu'un utilisateur crée une table, il devient administrateur de sa table
• il possède sur cette table les droits de : lecture, insertion, suppression,
modification, modification de la structure physique (alter)

Transmission/révocation de droits : commandes GRANT et REVOKE

GRANT <liste_droits> ON <nom de la table|vue>


TO <liste_usagers> [With Grant Option]

REVOKE <liste_droits> ON <nom de la table|vue>


FROM <liste_usagers>
Exercice 1 d‟application
Soit le schéma relationnel suivant:
Employé (Nom, Prénom, DateNaissance, Adresse, Matricule, Salaire, N°Dep,
Supérieur)
Département (NomD, N°Dep, Directeur)
Projet (NomP, N°Pro, Lieu, N°Dep)
Travaille (Matricule, N°Pro, Heures)

Précisions: L‟attribut "Supérieur" dans la relation "Employé" contient le


Matricule du supérieur direct de l‟employé. Chaque employé appartient à un
département et travaille sur zéro, un ou plusieurs projets. Chaque projet est
rattaché à un département qui – attention – peut être différent de celui des
employés travaillant sur ce projet.
Exprimer dans les différents langages relationnels les requêtes suivantes :
•Date de naissance et adresse de Makhlouf Ali.
•Nom et adresse des employés qui travaillent au département de recherche.
•Nom et prénom des employés dont le supérieur est Makhlouf ALI.
•Nom des employés qui travaillent plus de 10 heures sur un projet à Oran.
Exercice 2 d‟application

Soit le schéma relationnel suivant, utilisé pour la base d’un fleuriste :


Variété (Num_Variété, Nom_Variété, Couleur, Période_fraîcheur)
Stock (Num_Variété, Date_arrivée, Nombre_fleurs)
Personne (Num_Personne, Nom, Prénom, Adresse)
Commande (Num_Personne, Num_Variété, Date_commande, Adresse_livraison,
Quantité)
Les Variétés sont des fleurs pour lesquelles nous précisons leur type, couleur et
durée de vie. Les stocks précisent la date à laquelle une variété a été achetée et son
nombre. Enfin, une personne peut acheter une certaine quantité de fleurs dans une
commande à une date donnée.

Pour chacune des questions suivantes, donner l’expression algébrique et/ou la


requête en SQL (en fonction de ce qui est demandé) permettant d’y répondre :
1. Quelle variété a été la plus vendue ? Indiquer également le nombre de fleurs
vendues pour cette variété ? (SQL)
2. Quel client a commandé au moins une fois des fleurs de chaque variété ?
(Algèbre + SQL)

Vous aimerez peut-être aussi