SQL - requêtesOpérations ensemblistes

On a vu lors de notre cours sur l'algèbre relationnelle le principe des opérations ensemblistes. Le passage en SQL est juste une pure traduction de cela. C'est-à-dire qu'il faut que les deux requêtes reliées par une union, une intersection, ou une différence doivent se faire sur le même schéma.

En SQL, les trois opérateurs sont modélisés par les mots-clés union, interect, minus, MAIS évidemment ce serait trop facile comme cela, ces opérations fonctionnent ou pas en fonction du SGBD utilisé. Par exemple, ça n'existe pas avec mysql.

"Cool, ça veut dire qu'on aura pas à le voir, si ça existe pas en mysql!"
Ben non, comme on l'avait vu en alèbre, on peut éviter l'utilisation de certains opérateurs en passant par d'autres, c'est exactement ce qu'il va se passer pour intersect et minus.

La syntaxe générale est la suivante:
union: select a,b from R UNION select a,b from S;

intersection méthode 1: select a from R INTERSECT select b from S;
intersection méthode 2: select a from R where a in (select b from S);
intersection méthode 3: select a,b from R where exists(select c,d from S where a=c and b=d);

différence méthode 1: select a from R MINUS select b from S;
différence méthode 2: select a from R where a not in (select b from S);
différence méthode 3: select a,b from R where not exists(select c,d from S where a=c and b=d);

Voici quelques exemples concrets avec notre base de données de notes.
eleves
cours
affectation
  1. mysql> # liste des étudiants qui ont une note en PHP ou en BDD
  2. mysql> select id_e from affectation where id_c=1 union select id_e from affectation where id_c=2;
  3. mysql> # liste des étudiants qui ont une note en PHP et en BDD
  4. mysql> select id_e from affectation where id_c=1 intersect select id_e from affectation where id_c=2;
  5. mysql> select id_e from affectation where id_c=1 and id_e in (select id_e from affectation where id_c=2);
  6. mysql> select id_e from affectation a1 where id_c=1 and exists (select id_e from affectation a2 where a1.id_e=a2.id_e and a2.id_c=2);
  7. mysql> # liste des étudiants qui ont une note en BDD mais pas en PHP
  8. mysql> select id_e from affectation where id_c=2 minus select id_e from affectation where id_c=1;
  9. mysql> select id_e from affectation where id_c=2 and id_e not in (select id_e from affectation where id_c=1);
  10. mysql> select id_e from affectation a1 where id_c=2 and not exists (select id_e from affectation a2 where a1.id_e=a2.id_e and a2.id_c=1);

Vous voyez, rien d'impossible dans les requêtes ensemblistes!