Bases de données SQL
Dr. Cheikh Ibrahima Fall DIOP
B:mamecheikhdiop@[Link]
H:(+221)7 76 543 01 00
Chapitre V - Le langage SQL
1 Introduction
SQL (Structured Query Language) qu’on peut traduire en français “langage de
requêtes structurées” est le langage standard utilisé le plus couramment aujourd’hui
pour créer, modifier, lire, mettre à jour, . . . des bases données relationnelles.
Il existe 5 type de commandes SQL : DDL (Data Definition Language), DML (Data
Manipulation Language), DCL (Data Control Language), TCL (Transaction Control
Language), et DQL (Data Query Language).
2 Le langage de définition des données
C’est le sous-ensemble de SQL qui permet de pour manipuler les structures de données
d’une base de données, et non les données elles-mêmes.
Il permet :
1. de définir le domaine des données, c’est-à-dire l’ensemble des valeurs que peut
prendre une donnée : nombre, chaîne de caractères, date, booléen.
2. de regrouper les données ayant un lien conceptuel au sein d’une même entité.
3. de définir les liens entre plusieurs entités de nature différente.
4. d’ajouter des contraintes de valeur sur les données.
On distingue typiquement trois types de commandes SQL de définition de données :
Commande Description
CREATE création d’une structure de données
ALTER modification d’une structure de données
DROP suppression d’une structure de données
Ces commandes peuvent porter sur les structures de données de type suivantes :
DATABASE (base de données), TABLE table, INDEX (indice),VIEW (table virtuelle),
SEQUENCE (suite de nombres),SYNONYM (synonyme) et USER (utilisateur).
2.1 La commande CREATE
Pour créer une base de données la commande est :
1 CREATE DATABASE mabase;
Alors que pour une table on devra écrire
1 CREATE TABLE nom_table (
2 colone1 type,
3 colone2 type,
4 colone3 type,
5 ....
6 );
Chaque champs d’une table possède un type : CHAR, VARCHAR, INTEGER, NUM-
BER, DECIMAL, FLOAT, DOUBLE, DATE, TIME, TIMESTAMP, etc.
Ainsi, la création de la table serais :
1 CREATE TABLE Personne (
2 ID integer,
3 Nom varchar(25),
4 Prenom varchar(50),
5 Addresse varchar(255)
6 );
Lors de la création d’un table on doit définir l’identifiant avec PRIMARY
KEY. Il est aussi possible qu’une clé étrangère soit présente dans une
! table dans ce cas on devra le marquer par FOREIGN KEY.
1 CREATE TABLE Commande (
2 IDCommande int NOT NULL,
3 Montant int NOT NULL,
4 IDPersonne int,
5 PRIMARY KEY (IDCommande),
6 FOREIGN KEY (IDPersonne) REFERENCES Personne(ID)
7 );
Le langage SQL est normalisé, c’est-à-dire qu’un organisme s’est chargé
d’établir la bonne façon de l’utiliser afin que le langage soit semblable
d’un SGBD à l’autre.
Les différents SGBDR qui l’utilisent n’ont cependant pas suivi toutes
! les normes du standard SQL, ce qui fait que la syntaxe sera légèrement
différente de l’un à l’autre.
Les fonctionnalités supportées dépendent également du SGBDR.
Voici un exemple de requête SQL qui sera différente entre les SGBD :
Ex :
MySQL
1 CREATE TABLE `etudiants` (
2 `id` int(11) NOT NULL AUTO_INCREMENT,
3 `nomfamille` varchar(50) COLLATE utf8_unicode_ci,
4 `prenom` varchar(50) COLLATE utf8_unicode_ci,
5 `da` varchar(6) COLLATE utf8_unicode_ci,
6
7 PRIMARY KEY(`id`)
8 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
SQLite
1 CREATE TABLE IF NOT EXISTS `etudiants` (
2 `id` INTEGER PRIMARY KEY AUTOINCREMENT,
3 `nomfamille` TEXT,
4 `prenom` TEXT,
5 `da` TEXT);
MS SQL
1 CREATE TABLE [dbo].[etudiants] (
2 [id] INT IDENTITY(1, 1) NOT NULL,
3 [nomfamille] NVARCHAR(50),
4 [prenom] NVARCHAR(50),
5 [da] NVARCAHR(6)
6 );
2.2 La commande ALTER
Elle permet de modifier un champs d’une table, d’ajouter un nouveau champs ou d’en
supprimer un.
1 ALTER TABLE Personne ADD (Telephone integer);
2 ALTER TABLE Personne MODIFY (Nom varchar(10));
3 ALTER TABLE Personne DROP Nom ;
2.3 La commande DROP
1 DROP DATABASE nombase;
2 DROP TABLE nomtable;
3 Le langage de manipulation des données
Permet de manipuler les données d’une base de données. On distingue typiquement
trois types de commandes SQL dédiées à la manipulation des données :
Commande Description
INSERT insertion de données (enregistrement) dans une table
DELETE suppression de données d’une table
UPDATE mise à jour de données d’une table
3.1 La commande INSERT
Insertion de données dans une table :
1 INSERT INTO eleves (nom, prenom)
2 VALUES ('DIOUF', 'Moussa');
3.2 La commande DELETE
Suppression de données dans une table :
1 DELETE FROM eleves
2 WHERE prenom = 'DIOP' and nom = 'Doudou;
3.3 La commande UPDATE
Mise à jour de données dans une table :
1 UPDATE eleves
2 SET prenom = 'Demba'
3 WHERE nom = 'SANE';
4 Le langage de contrôle des données
Est utilisé pour contrôler l’accès aux données d’une base de données. On distingue
typiquement quatres types de commandes SQL pour le contrôle des données
Commande Description
GRANT autorisation d’un utilisateur à effectuer une action
DENY interdiction à un utilisateur d’effectuer une action
REVOKE annulation d’une commande de contrôle de données précédente
LOCK verrouillage sur une structure de données
4.1 La commande GRANT
Autorisation d’un utilisateur à effectuer une action :
1 GRANT UPDATE (nom, prenom) ON eleves
2 TO enseignant
3 WITH GRANT OPTION;
4.2 La commande DENY
Interdiction d’un utilisateur à effectuer une action :
1 DENY DELETE
2 TO enseignant
4.3 La commande REVOKE
Annulation d’une commande de contrôle de données précédente :
1 REVOKE UPDATE (nom, prenom)
2 ON eleves
3 FROM enseignant
4.4 La commande LOCK
Verrouillage d’une structure de données :
1 LOCK TABLE eleves IN EXCLUSIVE MODE;
5 Le langage de contrôle des transactions
Il est utilisé pour le contrôle transactionnel dans une base de données, c’est-à-dire les
caractéristiques des transactions, la validation et l’annulation des modifications.
Commande Description
COMMIT validation d’une transaction en cours
ROLLBACK annulation d’une transaction en cours
SAVEPOINT création d’un point de sauvegarde
Si ROLLBACK annule toute une transaction, SAVEPOINT permet de re-
i tourner jusqu’à une étape marquée comme point de sauvegarde sans annuler
l’ensemble de la transaction
5.1 La commande COMMIT
Validation d’une transaction en cours :
1 START TRANSACTION;
2 UPDATE eleves
3 SET age = '19'
4 WHERE nom = 'BA' and prenom = 'Adji';
5 COMMIT;
5.2 La commande ROLLBACK
Annulation d’une transaction en cours :
1 DELETE FROM eleves
2 WHERE age = 25;
3 ROLLBACK;
5.3 La commande SAVEPOINT
Annulation d’une jusqu’à une sauvegarde :
1 DELETE FROM eleves
2 WHERE age = 25;
3 SAVEPOINT sauvegarde
4 DELETE FROM eleves
5 WHERE nom = 'DIOP';
6 ROLLBACK TO sauvegarde;
6 Le langage d’interrogation des données
Est principalement ce à quoi on pense lorsqu’on parle de SQL. Il est matérialisé par la
commande SELECT qui permet de faire sélection de données dans une table.
Il possède des caractéristiques proches de l’algèbre relationnelle (jointure par emboîte-
ment) et d’autres proches du calcul des tuples (variables sur les relations) et utilise
des opérateurs arithmétiques, de comparaison et logiques.
— Les opérateurs arithmétiques :
Opérateur Description
+ Ajoute des valeurs de chaque côté de l’opérateur.
- Soustrait l’opérande droit de l’opérande gauche.
* Multiplie les valeurs de chaque côté de l’opérateur.
/ Divise l’opérande gauche par l’opérande droit.
% Divise l’opérande gauche par l’opérande droit et renvoie le reste.
— Les opérateurs de comparaison :
Opérateur Description
= Vérifie si les valeurs de deux opérandes
sont égales ou non, si oui, la condition
devient vraie.
!= Vérifie si les valeurs de deux opérandes
sont égales ou non, si les valeurs ne sont
pas égales, alors la condition devient
vraie.
<> Vérifie si les valeurs de deux opérandes
sont égales ou non, si les valeurs ne sont
pas égales, alors la condition devient
vraie.
> Vérifie si la valeur de l’opérande gauche
est supérieure à la valeur de l’opérande
droit. Si oui, la condition devient vraie.
< Vérifie si la valeur de l’opérande gauche
est inférieure à la valeur de l’opérande
droit. Si oui, la condition devient vraie.
>= Vérifie si la valeur de l’opérande de
gauche est supérieure ou égale à la valeur
de l’opérande de droite, si oui, la
condition devient vraie.
Opérateur Description
<= Vérifie si la valeur de l’opérande gauche
est inférieure ou égale à la valeur de
l’opérande droit. Si oui, la condition
devient vraie.
!< Vérifie si la valeur de l’opérande gauche
n’est pas inférieure à la valeur de
l’opérande droit. Si la réponse est oui, la
condition devient vraie.
!> Vérifie si la valeur de l’opérande de
gauche n’est pas supérieure à la valeur de
l’opérande de droite, si oui, la condition
devient vraie.
— Les opérateurs logiques :
Opérateur Description
ALL L’opérateur ALL permet de comparer
une valeur à toutes les valeurs d’un autre
jeu de valeurs.
Opérateur Description
ANY L’opérateur ANY est utilisé pour
comparer une valeur à une valeur
applicable de la liste conformément à la
condition.
BETWEEN L’opérateur BETWEEN permet de
rechercher des valeurs comprises dans un
ensemble de valeurs, en fonction de la
valeur minimale et de la valeur maximale.
EXISTS L’opérateur EXISTS est utilisé pour
rechercher la présence d’une ligne dans
une table spécifiée qui répond à un
certain critère.
IN L’opérateur IN est utilisé pour comparer
une valeur à une liste de valeurs littérales
spécifiées.
LIKE L’opérateur LIKE est utilisé pour
comparer une valeur à des valeurs
similaires à l’aide d’opérateurs
génériques.
Opérateur Description
NOT L’opérateur NOT inverse la signification
de l’opérateur logique avec lequel il est
utilisé. Ex. : NOT EXISTS, NOT
BETWEEN, NOT IN, etc. Ceci est un
opérateur de négation.
AND L’opérateur AND permet l’existence de
plusieurs conditions dans la clause
WHERE d’une instruction SQL.
OR L’opérateur OR est utilisé pour combiner
plusieurs conditions dans la clause
WHERE d’une instruction SQL.
IS NULL L’opérateur IS NULL est utilisé pour
comparer une valeur avec une valeur
NULL.
UNIQUE L’opérateur UNIQUE recherche dans
chaque ligne de la table spécifiée l’unicité
(pas de doublons).
Les exemples dans cette partie s’appuient sur la base de données relative aux
fournisseurs (F), produits (P), usines (U) et livraisons (PUF), décrite par le schéma
suivant :
F (NF, nomF, statut, ville)
P (NP, nomP, poids, couleur)
U (NU, nomU, ville)
PUF (NP, NU, NF, qt)
6.1 Format de base d’une requête
SELECT Liste des noms d’attributs du résultat
FROM Nom d’une relation (ou de plusieurs relations)
[WHERE Condition logique qui définit les tuples du résultat]
Exemple : nom et poids des produits rouges.
1 SELECT nomP, poids FROM P
2 WHERE couleur = "rouge"
Exemple : tous les renseignements sur tous les fournisseurs.
1 SELECT NF, nomF, statut, ville FROM F
ou
1 SELECT * FROM F
Un résultat sans doubles Les SGBD commercialisés (dont les SQL. . .) ne suppriment
pas automatiquement les doubles.
La clause DISTINCT permet à l’utilisateur d’avoir un résultat sans double.
Exemple : liste des couleurs qui existent.
1 SELECT DISTINCT couleur FROM P
Un résultat trié La clause ORDER BY permet de définir un ordre de tri pour les tuples
du résultat.
Exemple : liste des fournisseurs de Pikine par ordre alphabétique.
1 SELECT nomF, NF, statut
2 FROM F
3 WHERE ville = "Pikine" ORDER BY nomF ASC , NF ASC
Si plusieurs fournisseurs ont le même nom, ils seront classés selon leurs numéros.
6.2 Recherche avec blocs emboîtés
Exemple : numéros des fournisseurs de produits rouges ? ensemble des numéros des
produits rouges :
1 SELECT NP
2 FROM P
3 WHERE couleur = "rouge"
ensemble des numéros des fournisseurs de produits rouges :
1 SELECT NF
2 FROM PUF
3 WHERE NP IN
4 (SELECT NP FROM P
5 WHERE couleur = "rouge")
Le mot clef IN signifie “appartient” dans le sens de l’opérateur mathématique de la
théorie des ensembles (∈)
La phrase NP IN ( SELECT NP FROM P WHERE couleur = “rouge”) est une condition
logique, signifiant “la valeur de NP est dans l’ensemble des numéros de produits
rouges”, ce qui est vrai ou faux.
Pour répondre à cette requête, le SGBD :
1. exécute la requête interne (calcul de l’ensemble des numéros des produits rouges),
2. exécute la requête externe SELECT NF FROM PUF WHERE NP IN (. . .) en balayant
PUF et en testant pour chaque tuple si ce NP appartient à l’ensemble des
numéros de produits rouges.
Dans le WHERE , la condition logique peut avoir plusieurs formes :
— elle peut être composée de conditions élémentaires connectées par AND, OR, NOT,
et par des parenthèses ;
— les conditions élémentaires sont du type :
— <valeur attribut> <opérateur de comparaison> <valeur attribut> |
— <valeur attribut> <opérateur d’appartenance> <ensemble> avec :
— <valeur attribut> : := nom d’attribut | constante
— <opérateur de comparaison> : := > | < | ≤ | ≥ | = | ≠
— <opérateur d’appartenance> : := IN | NOT IN
— <ensemble> est soit un ensemble constant, par exemple (1,2,3), soit
un ensemble défini par une requête SELECT, soit une union, différence
ou intersection d’ensembles :
— <ensemble> : := “(” <constantes> “)” <requête SELECT> |
— <ensemble> <opérateur ensembliste> <ensemble>
— <constantes> : := constante | constante”,“<constantes>
— <opérateur ensembliste> : := UNION | MINUS | NTERSECT
Exemple : noms des fournisseurs numéro 1, 2, 3.
1 SELECT nomF FROM F
2 WHERE NF = 1 OR NF =2 OR NF = 3
ou
1 SELECT nomF FROM F
2 WHERE NF IN (1, 2, 3)
6.3 Qualification des noms d’attributs
Notations :
NP : attribut
[Link], [Link] : attributs qualifiés par le nom d’une relation
Règle 1 : Un nom d’attribut non qualifié, référence la relation la plus interne qui a un
attribut de ce nom-là.
Règle 2 : On peut renommer localement une relation dans la clause FROM . Par exemple :
. . . FROM PUF PUF1 . . . la relation PUF s’appelle alors PUF1 pour le SELECT corres-
pondant à ce FROM uniquement.
Exemple : noms des fournisseurs ne livrant pas le produit numéro 2.
1 SELECT nomF
2 FROM F
3 WHERE 2 NOT IN
4 (SELECT
5 FROM NP
6 PUF
7 WHERE [Link] = [Link])
Dans le WHERE du SELECT interne qui calcul l’ensemble des NP livrés par ce
fournisseur , on aurait pu tout aussi bien écrire : WHERE NF = [Link] (cf. règle 1).
Exemple : numéros des fournisseurs livrant le même produit que le fournisseur 1 en
une quantité plus grande.
1 SELECT NF
2 FROM PUF PUFX -- PUF est renomme
3 WHERE NP IN
4 (SELECT NP -- ensemble des produits du fournisseur 1
5 FROM PUF
6 WHERE NF = 1 AND qt < [Link])
6.4 Recherche sur plusieurs relations simultanément
Format général :
SELECT Ai. . .
FROM R1, R2. . ., Rn
WHERE < condition de jointure entre les Ri > AND < condition(s) de la requête >
Exemple : pour chaque produit livré, le nom du produit et les villes de leurs fournisseurs.
1 SELECT nomP, ville FROM P, F, PUF
2 WHERE [Link] = [Link] AND [Link] = [Link]
6.5 Recherche avec quantificateurs : SOME, ANY, ALL
SQL permet d’écrire des conditions où apparaissent des quantificateurs proches de
ceux de la logique (“il existe” (∃), “quelque soit” (∀) ), grâce aux mots clefs SOME, ANY
et ALL. Les mots clefs SOME et ANY ont exactement la même signification ; ce sont des
synonymes.
Le format général d’une condition élémentaire avec quantificateur est le suivant :
<valeur attribut> <opérateur de comparaison> <quantificateur> <ensemble> avec
<quantificateur> : := SOME | ANY | ALL ce qui signifie :
— pour SOME et ANY : “existe-t-il dans l’ensemble au moins un élément e qui satisfait
la condition : e <opérateur de comparaison> <ensemble> ?”
— pour ALL : “tous les éléments de l’ensemble satisfont-ils la condition ?”
Le mot clef IN est équivalent à un quantificateur existentiel (SOME ou ANY) avec
l’opérateur de comparaison d’égalité. SOME et ANY sont donc plus puissants. De même,
les requêtes avec un quantificateur universel (ALL) et un comparateur d’égalité peuvent
s’écrire avec une condition ensembliste (voir le paragraphe suivant). Cependant le mot
clef ALL ne permet pas d’exprimer toutes les requêtes contenant un quantificateur du
type “quelque soit”. On peut alors écrire la requête inverse avec un “NOT EXISTS”
(voir paragraphe plus loin). Par exemple la requête “chercher les X qui pour tout Y
satisfont telle condition” peut aussi s’exprimer : “chercher les X tels qu’il n’existe
aucun Y qui ne satisfait pas telle condition”.
Exemples :
Ensemble des numéros des fournisseurs de produits rouges :
1 SELECT NF
2 FROM PUF WHERE NP = ANY
3 (SELECT NP FROM P
4 WHERE couleur = "rouge")
Ensemble des numéros des fournisseurs qui ne fournissent que des produits rouges :
1 SELECT NF
2 FROM F
3 WHERE "rouge" = ALL
4 (SELECT couleur FROM P
5 WHERE NP = ANY (SELECT NP FROM PUF
6 WHERE [Link] = [Link]))
6.6 Recherche avec des conditions sur des ensembles
Dans les paragraphes précédents, les conditions élémentaires portant sur une valeur
d’attribut ont été définies. D’autres types de conditions élémentaires permettent de
comparer des ensembles entre eux. Ce sont :
6.6.1 Test d’égalité d’ensembles :
<ensemble 1> = <ensemble 2>
<ensemble 1> ≠ <ensemble 2>
6.6.2 Test d’inclusion d’ensembles :
<ensemble 1> CONTAINS <ensemble 2>
Cette condition signifie que l’ensemble 1 contient (ou est égal à) à l’ensemble 2, ce qui
en théorie des ensembles s’écrirait : <ensemble 1> ⊇ <ensemble 2>.
La condition : <ensemble 1> NOT CONTAINS <ensemble 2> est la négation de la pré-
cédente ; elle est vraie si un élément de l’ensemble 2 n’appartient pas à l’ensemble 1.
Exemple : noms des fournisseurs qui fournissent tous les produits rouges.
1 SELECT nomF
2 FROM F
3 WHERE (SELECT NP
4 FROM PUF /* ensemble des produits du fournisseur F*/
5 WHERE NF = F. NF)
6 CONTAINS
7 (SELECT NP
8 FROM P /* ensemble des produits rouges*/
9 WHERE couleur ="rouge")
6.6.3 EXISTS < ensemble>
Cette condition teste si l’ensemble n’est pas vide (ensemble ≠ ∅).
Exemple : noms des fournisseurs qui fournissent au moins un produit rouge.
1 SELECT nom F FROM F
2 WHERE EXISTS (SELECT *
3 FROM PUF, P
4 WHERE NF = [Link] AND couleur ="rouge" AND
[Link]=[Link])
Il existe aussi la condition inverse : NOT EXISTS <ensemble> qui teste si l’ensemble
est vide.
6.7 Fonctions d’agrégation
SQL offre les fonctions d’agrégation usuelles :
cardinal : COUNT
moyenne : AVG
minimum et maximum : MIN, MAX
total : SUM
qui opèrent sur un ensemble de valeurs prises par un attribut, ou pour COUNT unique-
ment, sur un ensemble de tuples.
Exemple : quel est le nombre de livraisons faites par le fournisseur 1 ?
1 SELECT COUNT (*) --on compte les tuples de PUF tels que NF = 1
2 FROM PUF
3 WHERE NF=1
Exemple : combien de produits différents a livré le fournisseur 1 ?
Attention : il faut ôter les doubles, car COUNT compte toutes les valeurs, y compris les
valeurs doubles.
1 SELECT COUNT (DISTINCT NP)
2 FROM PUF
3 WHERE NF=1
6.8 Recherche avec partition des tuples d’une relation
6.8.1 Clause GROUP BY
Exemple : combien de produits différents ont été livrés par chacun des fournisseurs ?
Il faut partitionner l’ensemble des tuples de PUF en un sous-ensemble (ou groupe)
par numéro de fournisseur. C’est ce que permet la clause GROUP BY.
1 SELECT NF, COUNT (DISTINCT NP)
2 FROM PUF
3 GROUP BY NF
Cette instruction génère dans le SGBD les actions suivantes :
1. Classer les tuples de PUF, groupe par groupe (un groupe = ensemble des tuples
ayant même NF),
2. Pour chaque groupe évaluer le résultat du SELECT (compter le nombre de NP
différents dans ce groupe).
6.8.2 Clause HAVING <condition>
Exemple : combien de produits différents ont été livrés par chacun des fournisseurs,
tels que la quantité totale de produits livrés par ce fournisseur soit supérieure à l000 ?
1 SELECT NF, COUNT (DISTINCT NP) FROM PUF
2 GROUP BY NF
3 HAVING SUM (qt) > 1000
La clause "HAVING <condition>" permet de sélectionner les groupes qui
satisfont une condition. Attention, contrairement à la clause "WHERE
! <condition>", la condition ne porte pas sur un tuple mais sur l’ensemble
des tuples d’un groupe.
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) ,
et {Ak1, Ak2, . . . , Akw} ⊇ {Ai1, Ai2, . . . , Aiu} ,
et {Ak1, Ak2, . . . , Akw} ∩ {Aj1, Aj2, . . . , Ajv} = ∅.
La condition du HAVING peut être de deux types :
1. Condition comparant le résultat d’une fonction d’agrégation portant sur un
attribut qui ne fait pas partie de la clause GROUP BY :
f(Ajx) <opérateur de comparaison> valeur
Cette fonction porte alors sur l’ensemble des valeurs prises par l’attribut pour le
groupe de tuples ;
2. Condition comparant l’ensemble des valeurs prises par un attribut (qui ne fait
pas partie de la clause GROUP BY) pour les tuples du groupe ; cette comparaison
se fait en général par rapport à un autre ensemble, à l’aide des comparateurs
logiques d’ensembles : =, ≠, CONTAINS, NOT CONTAINS.
Dans ce dernier cas, afin d’exprimer le fait qu’il s’agit de l’ensemble des valeurs prises
par l’attribut pour tous les tuples du groupe, le nom de l’attribut est précédé du mot
clé SET.
La condition du HAVING peut donc s’écrire :
SET nom-attribut <opérateur de comparaison ensembliste> <ensemble>
avec <opérateur de comparaison ensembliste> : := = | ≠ | CONTAINS | NOT CONTAINS
L’instruction ci-dessus génère dans le SGBD les actions suivantes :
1. Créer une relation de travail, R’, qui est une copie de R ; éliminer de R’ les tuples
qui ne satisfont pas la condition du WHERE.
2. Classer les tuples de R’, groupe par groupe (un groupe = ensemble des tuples
ayant même Ak1 [,Ak2] . . . [,Akw]).
3. Pour chaque groupe de tuples de R’ faire :
— tester la condition du HAVING
— si elle est vérifiée, alors évaluer le résultat du SELECT.
Exemple : numéros des fournisseurs qui fournissent au moins tous les produits fournis
par le fournisseur numéro 100.
1 SELECT NF
2 FROM PUF GROUP BY NF
3 HAVING SET NP /* ensemble des produits du fournisseur NF*/
4 CONTAINS
5 (SELECT NP FROM PUF WHERE NF=100)
6.9 Mise à jour de la base de données
6.9.1 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).
1 INSERT INTO P :
2 SELECT NP, nomP, couleur, poids
3 FROM Catalogue
6.9.2 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.
6.9.3 Mettre à jour un (des) attribut(s)
UPDATE nom relation
SET nomattr_1 = <expression1 qui définit une valeur pour l’attribut1>,
. . ...
nomattr_n = <expression n qui définit une valeur pour l’attribut n>
[WHERE condition]
Exemple : pour les produits verts, changer leur couleur, elle devient “vert d’eau”.
1 UPDATE P
2 SET couleur = "vert d'eau"
3 WHERE couleur = "vert"