Académique Documents
Professionnel Documents
Culture Documents
Semestre: S5
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)
Remarque :
NomProduit CouleurProduit
Pc Laptop Jaune
Selection
Algèbre:
Conditions de sélection :
• =, <, >, <>,…
• BETWEEN, LIKE
• IS NULL, IS NOT NULL, IN
Condition de sélection : Sélection : la clause WHERE
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
p NOT LIKE s
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
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)
SQL:
SELECT nomf
FROM FOURNISSEUR
WHERE Ville IS NULL
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}
Remarques :
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.
Departement
Employe
SQL:
SELECT , , FROM
Employe NATURAL FULL OUTER JOIN Departement ON
Departement
Employe
SELECT , , FROM
Employe NATURAL RIGHT OUTER JOIN Departement ON
Departement
Employe
UNION
PRODUIT (npro, nomp, qtes, couleur)
Requête: Produits dont la quantité est supérieure à 100 ou ceux qui ont
la couleur „Rouge‟.
SQL :
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
INTERSECT
Remarques :
SQL :
EXCEPT
Remarque:
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.
Algèbre:
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
Algèbre:
πPNOM, PRIX, FNOM ( σCNOM = „Ali„ (COMMANDES) (FOURNITURE))
SQL :
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
Soit la table :
SELECT CNOM
FROM COMMANDE
WHERE QUANTITE <= ALL (SELECT QUANTITE FROM COMMANDE
WHERE PNOM = 130)
SELECT DEPTNO
FROM DEPARTEMENT
WHERE DETPNO NOT = ALL (SELECT DISTINCT DEPTNO
FROM EMPLOYE)
Exemple :
COMMANDE (CNUM, CNOM, PNUM, QUANTITE) ; FOURNITURE (PNUM,
FNUM, PRIXA)
Equivalente à :
SELECT PNUM, PRIXA, FNUM FROM FOURNITURE
WHERE PNUM = ANY (SELECT PNUM FROM COMMANDE WHERE CNOM =
‟Omar‟)
Formes équivalentes de Quantification (1)
Equivalent à :
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…).
Fournisseur (IdF,NomF,Adresse)
Produit (IdP, NomP, Qualité)
Catalogue (IdF, IdP, PU)
Commandes(IdC, NomC, IdP, Quantité)
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
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 :
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
! Insertion de 2 fournisseurs :
INSERT INTO FOURNISSEUR (FNUM, FNOM, VILLE)
VALUES (234, ‟tessala‟, ‟Sfisef‟), (235, ‟maria‟, ‟SBA‟)
Insérer des tuples
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
• 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)
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)