MySQL : l’opérateur ensembliste UNION (1/2)

En algèbre relationnelle, UNION est un opérateur dit « ensembliste ». Par définition, il travaille sur au moins deux ensembles (l’extension de deux relations), qu’il agrège tout en éliminant les éventuels doublons. Créons deux relations matérialisant des employés et des managers au sein d’une entreprise pour voir comment tout cela fonctionne :


create table employe (
    id tinyint unsigned NOT NULL PRIMARY KEY,
    nom varchar(20) NOT NULL,
    prenom varchar(30) NOT NULL
);

create table manager(
    id smallint unsigned NOT NULL PRIMARY KEY,
    nom varchar(30),
    prenom varchar(20)
);

INSERT INTO employe VALUES (1, 'Klein', 'Roger'),
                           (2, 'Bagnole', 'Marcel'),
                           (3, 'De Narvale', 'Nadine');

INSERT INTO manager VALUES (1, 'Avignon', 'Eric'),
                           (2, 'Avril', 'Mathilda'),
                           (3, 'Klein', 'Roger');

Ces deux relations ont le même schéma, c’est à dire le même nombre d’attributs; c’est une des conditions de l’UNION. Lorsque l’on fait l’union de nos deux relations, par la requête :


select * from employe union select * from manager;

On obtient les tuples suivants :

snapshot2

Vous notez que Roger Klein est présent deux fois, car il est à la fois employé et manager; ce n’est pas un doublon au sens strict du terme car il a deux valeurs d’identifiant différentes dans chaque table. Il apparaît donc logiquement deux fois, ce qui n’aurait pas été le cas s’il avait eu la valeur d’id 3 dans employe ou de 1 dans manager.

La condition pour réaliser une UNION, je l’ai déjà dit plus haut, est d’avoir le même schéma dans les deux tables, c’est à dire le même nombre d’attributs; prenons deux tables qui n’ont aucun rapport entre elles :


create table chevre (

    id tinyint unsigned NOT NULL PRIMARY KEY,

    nom varchar(20) NOT NULL,

    age tinyint unsigned NOT NULL default 0

);

create table chou (

    variete varchar(15) NOT NULL PRIMARY KEY,

    poids tinyint unsigned NOT NULL default 0,

    couleur varchar(10) NOT NULL

);

insert into chevre values (1, 'Biquette', 10),
                          (2, 'Lola', 13);

insert into chou values ('romanesco', 2, 'vert'),
                        ('chinois', 1, 'blanc');

Faisons l’UNION de ces deux relations de même schéma :


select * from chevre UNION select * from chou;

Je ne comprends pas, on me répète depuis tout petit qu’il ne faut pas ménager la chèvre et le chou et pourtant, stupeur…

snapshot2

C’est tout à fait possible d’avoir les deux ! Vous avez vu que mes champs sont mélangés, il ne sont pas de même type (le premier champ de chevre est un entier non signé alors que le premier champ de chou est une chaîne de caractères, le deuxième est une chaîne de caractères dans l’un et un entier dans l’autre, etc.). Au final, le résultat de notre union ne veut pas dire grand chose sémantiquement parlant, regardez le nom des colonnes : nom contient le nom de nos sympathiques caprins mais aussi le poids de nos choux, age contient l’âge de nos ruminants mais aussi la couleur de nos choux.

Maman avait donc raison : on ne doit pas ménager la chèvre et le chou !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.