4.7. INTERROGERUNEBASE–LANGAGEDEMANIPULATIONDEDONNÉES :SELECT (2e PARTIE) {S8}93
SELECT * FROM relation_1 UNION SELECT * FROM relation_2
Traduction de l’opérateur d’intersection
L’opérateur d’intersection R1 ∩ R2 se traduit tout simplement en SQL par la requête :
SELECT * FROM relation_1 INTERSECT SELECT * FROM relation_2
Traduction de l’opérateur de différence
L’opérateur de différence R1 − R2 se traduit tout simplement en SQL par la requête :
SELECT * FROM relation_1 EXCEPT SELECT * FROM relation_2
Traduction de l’opérateur de division
Il n’existe pas de commande SQLpermettant de réaliser directement une division. Prenons la requête :
Quels sont les acteurs qui ont joué dans tous les films de Lars von Trier ?
Cela peut se reformuler par :
Quels sont les acteurs qui vérifient : quel que soit un film de Lars von Trier, l’acteur a joué dans ce film.
Malheureusement, le quantificateur universel (∀) n’existe pas en SQL. Par contre, le quantificateur
existentiel (∃) existe : EXISTS. Or, la logique des prédicats nous donne l’équivalence suivante :
∀xP(x) = ¬∃x¬P(x)
On peut donc reformuler le problème de la manière suivante :
Quels sont les acteurs qui vérifient : il est faux qu’il existe un film de Lars von Trier
dans lequel l’acteur n’a pas joué.
Ce qui correspond à la requête SQL :
SELECT DISTINCT nom, prenom FROM individu AS acteur_tous_lars
WHERE NOT EXISTS (
SELECT * FROM ( film JOIN individu ON num_realisateur = num_individu
AND nom = ’von Trier’ AND prenom = ’Lars’ ) AS film_lars
WHERE NOT EXISTS (
SELECT * FROM individu JOIN jouer ON num_individu = num_acteur
AND num_individu = acteur_tous_lars.num_individu
AND num_film = film_lars.num_film
)
);
En prenant le problème d’un autre point de vue, on peut le reformuler de la manière suivante :
Quels sont les acteurs qui vérifient : le nombre de films réalisés par Lars von Trier dans lequel l’acteur à joué est
égal au nombre de films réalisés par Lars von Trier.
Ce qui peut se traduire en SQL indifféremment par l’une des deux requêtes suivantes :
SELECT acteur.nom,