SQL : différences entre LEFT JOIN, RIGHT JOIN, etc

J’ai toujours eu quelques diffuculté a bien visualisé les différence qu’il y avait entre left join, right join, join, etc lorsque je fait des requêtes SQL. Aujourd’hui je suis tombé sur un exemple frappant, et je me suis dit que cela pouvait en aider plus d’un! Comme une image vaux mieux qu’un long discours, en voici l’essence.

L’exemple suivant se base sur une base de donnée mysql :

CREATE TABLE IF NOT EXISTS `acl_roles` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(30) CHARACTER SET utf8 NOT NULL,
`build_on` int(11) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `build_on` (`build_on`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

INSERT INTO `acl_roles` (`id`, `name`, `build_on`) VALUES
(1, 'guest', NULL),
(2, 'normal', 1),
(3, 'modo', 2),
(4, 'admin', 3);

ALTER TABLE `acl_roles` ADD CONSTRAINT FOREIGN KEY (`build_on`) REFERENCES `acl_roles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

Nous avons donc une table avec des clefs de référence pour marquer les dépendance entre les roles. En images cela donne ceci :

id name build_on
1 guest NULL
2 normal 1
3 modo 2
4 admin 3

Maintenant regardons le résultats de divers SELECT, le résultat parle de lui-même.

SELECT ar.*, arp.name AS parent_name FROM acl_roles ar, acl_roles arp WHERE arp.id = ar.build_on

id name build_on parent_name
2 normal 1 guest
3 modo 2 normal
4 admin 3 modo

SELECT ar.*, arp.name AS parent_name FROM acl_roles ar LEFT JOIN acl_roles arp ON arp.id = ar.build_on

id name build_on parent_name
1 guest NULL NULL
2 normal 1 guest
3 modo 2 normal
4 admin 3 modo

SELECT ar.*, arp.name AS parent_name FROM acl_roles ar JOIN acl_roles arp ON arp.id = ar.build_on

id name build_on parent_name
2 normal 1 guest
3 modo 2 normal
4 admin 3 modo

SELECT ar.*, arp.name AS parent_name FROM acl_roles ar RIGHT JOIN acl_roles arp ON arp.id = ar.build_on

id name build_on parent_name
2 normal 1 guest
3 modo 2 normal
4 admin 3 modo
NULL NULL NULL admin

J’espère que l’exemple servira a certain et que cela en aidera plus d’un!