© Your Copyright
Les opérateurs de l’algèbre relationnelle sont représentés par des mot-clés du langage SQL. A l’aide de ces mots-clés on pourra formuler une recherche d’information correspondant à une question en langage naturel. Ces requêtes SQL pourront alors être interprétées et éxecutées par le serveur de base de données.
Les opérateurs de l’algèbre relationnelle auront les représentations suivantes en SQL
SELECT
: lister les attributs à retourner dans le résultats de la requêteFROM
(\(\times\)): lister les ensembles nécessaires à la formulation de la requêteWHERE
(\(\sigma\)) : définir les formules logiques que devront satisfaire les éléments à retournerINNER JOIN, OUTER JOIN
: faire les jointures entre attributs de tables (ensembles)UNION
(\(\cup\)) : récupérer les éléments de deux ensembles (requêtes) dans un ensembleEXCEPT
(\(\setminus\)): récupérer les éléments d’un ensemble qui ne sont pas dans l’autreINTERSECT
(\(\cap\)) : récupérer les éléments communs de deux ensembles (requêtes) dans un ensembleSELECT
), de produit cartésien (FROM
) et de différence (EXCEPT
) selon la formulation suivante : \(\div(S,T)=\setminus(\Pi_{(X)}(S),\Pi_{(X)}(\setminus(\times(\Pi_{(X)}(S),T),S)))\)AS
(\(\rho\)) : donner un autre nom à un attribut (colonne) de l’ensemble (table).Un exercice récapitulatif permettra au lecteur de se familiariser avec ces commandes et s’entraîner à la création, insertion, modification et consultation d’informations en SQL.
CREATE TABLE personnes (id integer NOT NULL UNIQUE, nom text, age SMALLINT);
Créer l’ensemble (vide) des personnes
avec les attributs
id
: attribut de typeinteger
nom
: attribut de typetext
age
: attribut de typesmallint
On définit pour l’attribut id
des contraintes lors de l’insertion d’un élément dans l’ensemble des personnes
:
NOT NULL
: on doit obligatoirement renseigner une valeur sur l’attributid
lors de l’insertion (INSERT
en SQL) d’une personne.UNIQUE
: lors de l” insertion (INSERT
en SQL) d’une personne la valeur de l’attributid
doit être différent des valeurs déjà existantes sur cet attribut.
Requête : rechercher le nom
et age
des personnes
SELECT nom,age FROM personnes;
Requête : insérer 'Dupond'
ans dans l’ensemble des personnes
INSERT INTO personnes(id,nom,age ) VALUES(1,'Dupond',35);
Requête : renommer en 'Dupont'
le premier élément (id=1
) de l’ensemble des personnes
UPDATE personnes SET nom='Dupont' WHERE id=1;
Requête : enlever les éléments de nom 'Dupont'
dans l’ensemble des personnes
DELETE FROM personnes WHERE nom='Dupont';
Créer une base de données contenant un ensemble de personnes
.
Insérer dans cet ensemble les éléments :
(1,'Dupont',20)
(2,'Dupond',25)
(3,'Durand',30)
Modifier l’âge de 'Durand'
qui a finalement 35 ans.
Enlever la personne 'Dupont'
de l’ensemble.
CREATE TABLE personnes (id integer NOT NULL UNIQUE, nom text,age SMALLINT);
INSERT INTO personnes(id,nom,age) VALUES(1,'Dupont',20);
INSERT INTO personnes(id,nom,age) VALUES(2,'Dupond',25);
INSERT INTO personnes(id,nom,age) VALUES(3,'Durand',30);
SELECT * FROM personnes;
UPDATE personnes SET age=35 WHERE nom='Durand';
SELECT * FROM personnes;
DELETE FROM personnes WHERE nom='Dupont';
SELECT * FROM personnes;
Syntaxe générale SQL pour formuler des requêtes simples :
1 2 3 | SELECT [DISTINCT] <liste de colonnes>
FROM <liste de tables>
WHERE <conditions de recherche>
|
Ce qui revient à :
SELECT
: sélectionner les informations sur certains attributs des éléments que l’on récupèreFROM
: : en listant les ensembles qui contiennent les informations intéréssantesWHERE
: : et en définissant une condition de restriction pour obtenir uniquement les éléments qui nous intéressent vraiment dans ces ensembles.
Ce qui correspond à la mise en oeuvre des opérateurs de l’algèbre relationnelle :
- \(\large \Pi_{(a_1,...,a_n)}(E)\) : projection, opérateur unaire sur les attributs (\((a_1,...,a_n)\)) de l’ensemble \(E\).
- \(\large \times(E,F)\) : produit cartésien, opérateur binaire pour mettre en relation chaque élément de l’ensemble \(E\) avec tous les éléments de l’ensemble \(F\).
- \(\large \sigma_{[condition]}(E)\) : restriction, opérateur unaire pour définir une
condition
à satisfaire sur les éléments de l’ensemble \(E\).
Requête : « Récupérer les nom
des personnes
«
Ecriture en algèbre relationnelle :
- \(Q = \Pi_{(nom)}(personnes)\)
CREATE VIEW Q AS
SELECT DISTINCT nom FROM personnes;
On remarquera l’application du :code::DISTINCT qui permettra d’obtenir un ensemble (les noms en double seront éliminés du résultat).
Requête : « trouver les personnes de plus de 30 ans »
Ecriture en algèbre relationnelle :
- \(Q = \sigma_{[age>30]}(personnes)\)
CREATE VIEW Q AS
SELECT * FROM personnes WHERE age > 30;
Les opérations ensemblistes permettent de répondre à des questions du type :
- donne-moi des éléments qui se trouvent dans deux ensembles (l’union, \(\cup\))
- donne-moi des éléments qui sont commun à deux ensembles (l’intersection, \(\cap\))
- donne-moi des éléments qui se trouve dans un ensemble mais pas dans l’autre (la différence, \(\setminus\))
Lors d’une formulation d’opérations ensemblistes, il est bnécessaire de représenter les deux ensembles requêtes par deux requêtes contenant le même nombre d’informations,définies sur le même domaine, dans les clauses SELECT
Le lecteur pourra se familiariser aux opération ensemblistes en faisant les exercices ci-dessous.
Requête : « Récupérer les noms des personnes
et des employes
»
Ecriture en algèbre relationnelle :
- \(R_1 = \Pi_{(nom)}(personnes)\)
- \(R_2 = \Pi_{(nom)}(employes)\)
- \(Q = \cup(R_1,R_2)\)
CREATE VIEW Q AS
SELECT nom FROM personnes
UNION
SELECT nom FROM employes;
Selon l’écriture en algèbre relationnelle nous aurions dû créer les vues \(R_1,R_2\).
Cependant si cette requête doit être utilisée par la suite, nous ne manipulerons que le résultat final (SELECT * FROM Q
)
Requête : « Récupérer les noms des personnes
qui sont employes
»
Ecriture en algèbre relationnelle :
- \(R_1 = \Pi_{(nom)}(personnes)\)
- \(R_2 = \Pi_{(nom)}(employes)\)
- \(Q = \cap(R_1,R_2)\)
SELECT * FROM personnes;
SELECT * FROM employes;
CREATE VIEW Q AS
SELECT nom FROM personnes
INTERSECT
SELECT nom FROM employes;
Selon l’écriture en algèbre relationnelle nous aurions dû créer les vues \(R_1,R_2\).
Cependant si cette requête doit être utilisée par la suite, nous ne manipulerons que le résultat final (SELECT * FROM Q
)
Requête : « Récupérer les noms des personnes
qui ne sont pas des employes
»
Ecriture en algèbre relationnelle :
- \(R_1 = \Pi_{(nom)}(personnes)\)
- \(R_2 = \Pi_{(nom)}(employes)\)
- \(Q = \setminus(R_1,R_2)\)
SELECT * FROM personnes;
SELECT * FROM employes;
CREATE VIEW Q AS
SELECT nom FROM personnes
EXCEPT
SELECT nom FROM employes;
Selon l’écriture en algèbre relationnelle nous aurions dû créer les vues \(R_1,R_2\).
Cependant si cette requête doit être utilisée par la suite, nous ne manipulerons que le résultat final (SELECT * FROM Q
)
Les opérations ensemblistes génèrent par défaut des ensembles au sens où on élimine les doublons qui pourraient apparaître dans le résultat pour qu’un élément n’apparaisse qu’une seule fois dans le résultat.
Pour accélérer le traitement on peut formuler la requête ensembliste en faisant suivre l’opérateur du mot-clé ALL
. On risque alors d’obtenir comme résultat un multi-ensemble où un même élément peut apparaître plus d’une fois dans le résultat.
Requête : « Récupérer les noms des personnes et des employés »
ALL
permet d’éviter des tris pour éliminer les doublons.
Par défaut l’union (\(\cup\)) applique un tri pour éliminer les doublons de manière à générer un ensemble (un élément n’apparaît qu’une seule fois dans un ensemble).
L’exemple ci-dessous illustre l’utilisation de l’opération ensembliste d’union :
- en éliminant les doublons
- sans éliminer les doublons (
ALL
)- en éliminant les doublons dans chaque ensemble (
DISTINCT
) de chaque requête SQL
Les requêtes imbriquées peuvent aussi être utilisées pour représenter des opérations ensemblistes.
L’opérateur SQL IN
correspond à la relation d’appartenance mathématique (\(\in\)) à un ensemble.
L’opérateur SQL =ANY
signifie que l’on teste pour chaque élément de la requête externe s’il est égal
à un des éléments de la requête interne.
Le standard SQL autorise les deux syntaxes.
Requête : « Récupérer les noms des personnes
qui sont des employes
»
Chaque élément de la requête externe est (appartient à ) dans l’ensemble décrit par la requête imbriquée.
NB : l’opérateur =ANY
n’existe pas en SQLite
L’opérateur SQL NOT IN
correspond à la relation de non-appartenance mathématique (\(\notin\)) à un ensemble.
L’opérateur SQL <>ALL
signifie que l’on teste pour chaque élément de la requête externe qu’il doit-être
différent de tous les élements de la requête interne.
Requête : « Récupérer les noms des personnes
qui ne sont pas des employes
»
Chaque élément de la requête externe n’est pas (n’appartient pas à ) dans l’ensemble décrit par la requête imbriquée.
NB : l’opérateur <>ALL
n’existe pas en SQLite
Le standard SQL propose le quantificatif existentiel (\(\exists\)) pour vérifier l’existence d’un élément dans un ensemble.
N.B : le quantificateur universel n’existe pas ( ;-) ) dans la norme SQL mais on pourra l’exprimer à l’aide d’équivalences logiques.
Requête : « Récupérer les noms des personnes
qui sont des employes
»
chaque élément de la requête externe se trouve (existe) dans l’ensemble décrit par la requête imbriquée.
Pour vérifier la non-existence (\(\not\exists\)) d’un élément dans un ensemble.
Requête : « Récupérer les noms des personnes
qui ne sont pas des employes
»
chaque élément de la requête externe ne se retrouve pas (n’existe pas) dans l’ensemble décrit par la requête imbriquée.