Opérateurs ensemblistes
Impossible d'accéder à la ressource audio ou vidéo à l'adresse :
La ressource n'est plus disponible ou vous n'êtes pas autorisé à y accéder. Veuillez vérifier votre accès puis recharger la vidéo.
Objectifs
Comprendre l'analogie entre table et ensemble.
Savoir réaliser des opérations ensemblistes sur des tables.
Mise en situation
Imaginez que vous gériez une base de données qui liste tous les langages de programmation. Vous décidez d'effectuer votre découpage en tables, selon le type du langage : impératif, comme C, déclaratif, comme SQL, événementiel, comme JavaScript, etc. Vous obtenez donc une table par type de langage.
Mais certains langages ont plusieurs types ! Par exemple, JavaScript est à la fois impératif et événementiel.
Comment faire pour récupérer tous les langages qui sont à la fois impératifs et événementiels ? Cette opération est très facile si on utilise les opérateurs ensemblistes.
Introduction
On peut voir les tables comme des ensembles sur lesquels on peut réaliser des opérations ensemblistes. Pour ce faire, on utilise des opérateurs ensemblistes.
Syntaxe : Union
SELECT * FROM R1
UNION
SELECT * FROM R2
Exemple :
CREATE TABLE parent (
id INTEGER PRIMARY KEY,
nom VARCHAR(255),
prenom VARCHAR(255),
age INTEGER CHECK (age > 0)
);
INSERT INTO parent VALUES (1, 'Brasseur', 'Alexandre', 91);
INSERT INTO parent VALUES (2, 'Brasseur', 'Pierre', 67);
CREATE TABLE enfant (
id INTEGER PRIMARY KEY,
nom VARCHAR(255),
prenom VARCHAR(255),
age INTEGER CHECK (age > 0)
);
INSERT INTO enfant VALUES (2, 'Brasseur', 'Pierre', 67);
INSERT INTO enfant VALUES (3, 'Brasseur', 'Claude', 42);
SELECT *
FROM enfant
UNION
SELECT *
FROM parent;
id | nom | prenom | age
----+----------+-----------+-----
2 | Brasseur | Pierre | 67
3 | Brasseur | Claude | 42
1 | Brasseur | Alexandre | 91
Remarque : Dédoublonnage
Par défaut UNION
supprime les doublons, la clause UNION ALL
permet de conserver les doublons.
Attention :
Pour qu'un opérateur ensembliste soit valide il est nécessaire que les deux relations membres aient le même schéma.
Exemple :
CREATE TABLE parent (
id INTEGER PRIMARY KEY,
nom VARCHAR(255),
prenom VARCHAR(255),
age INTEGER CHECK (age > 0)
);
INSERT INTO parent VALUES (1, 'Brasseur', 'Alexandre', 91);
INSERT INTO parent VALUES (2, 'Brasseur', 'Pierre', 67);
CREATE TABLE enfant (
id INTEGER PRIMARY KEY,
nom VARCHAR(255),
prenom VARCHAR(255),
age INTEGER CHECK (age > 0),
parent INTEGER NOT NULL,
FOREIGN KEY (parent) REFERENCES parent(id)
);
INSERT INTO enfant VALUES (2, 'Brasseur', 'Pierre', 67, 1);
INSERT INTO enfant VALUES (3, 'Brasseur', 'Claude', 42, 2);
/** Cette requête renvoie une erreur car les schémas ne sont pas identiques. */
SELECT *
FROM enfant
UNION
SELECT *
FROM parent;
/** Cette requête fonctionne car après la projection les schémas sont identiques. */
SELECT id, nom, prenom, age
FROM enfant
UNION
SELECT id, nom, prenom, age
FROM parent;
Syntaxe : Intersection
SELECT * FROM R1
INTERSECT
SELECT * FROM R2
Exemple :
SELECT id, nom, prenom, age
FROM enfant
INTERSECT
SELECT id, nom, prenom, age
FROM parent;
id | nom | prenom | age
----+----------+--------+-----
2 | Brasseur | Pierre | 67
On sélectionne ici les personnes qui sont enfants et parents.
Syntaxe : Différence
SELECT * FROM R1
EXCEPT
SELECT * FROM R2
Exemple :
SELECT id, nom, prenom, age
FROM enfant
EXCEPT
SELECT id, nom, prenom, age
FROM parent;
id | nom | prenom | age
----+----------+--------+-----
3 | Brasseur | Claude | 42
On sélectionne ici les enfants qui ne sont pas des parents.
Remarque :
Les opérations INTERSECT
et EXCEPT
n'existent que dans la norme SQL2, et non dans la norme SQL1. Certains SGBD sont susceptibles de ne pas les implémenter.
Impossible d'accéder à la ressource audio ou vidéo à l'adresse :
La ressource n'est plus disponible ou vous n'êtes pas autorisé à y accéder. Veuillez vérifier votre accès puis recharger la vidéo.