{"id":364,"date":"2011-03-07T14:47:21","date_gmt":"2011-03-07T12:47:21","guid":{"rendered":"http:\/\/grummfy.be\/blog\/?p=364"},"modified":"2011-03-07T14:47:21","modified_gmt":"2011-03-07T12:47:21","slug":"sql-differences-entre-left-join-right-join-etc","status":"publish","type":"post","link":"https:\/\/grummfy.be\/blog\/364","title":{"rendered":"SQL : diff\u00e9rences entre LEFT JOIN, RIGHT JOIN, etc"},"content":{"rendered":"<p>J&rsquo;ai toujours eu quelques diffucult\u00e9 a bien visualis\u00e9 les diff\u00e9rence qu&rsquo;il y avait entre left join, right join, join, etc lorsque je fait des requ\u00eates SQL. Aujourd&rsquo;hui je suis tomb\u00e9 sur un exemple frappant, et je me suis dit que cela pouvait en aider plus d&rsquo;un! Comme une image vaux mieux qu&rsquo;un long discours, en voici l&rsquo;essence.<\/p>\n<p>L&rsquo;exemple suivant se base sur une base de donn\u00e9e mysql :<br \/>\n<code lang=\"SQL\"><br \/>\nCREATE TABLE IF NOT EXISTS `acl_roles` (<br \/>\n`id` int(11) unsigned NOT NULL AUTO_INCREMENT,<br \/>\n`name` varchar(30) CHARACTER SET utf8 NOT NULL,<br \/>\n`build_on` int(11) unsigned DEFAULT NULL,<br \/>\nPRIMARY KEY (`id`),<br \/>\nKEY `build_on` (`build_on`)<br \/>\n) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin;<\/p>\n<p>INSERT INTO `acl_roles` (`id`, `name`, `build_on`) VALUES<br \/>\n(1, 'guest', NULL),<br \/>\n(2, 'normal', 1),<br \/>\n(3, 'modo', 2),<br \/>\n(4, 'admin', 3);<\/p>\n<p>ALTER TABLE `acl_roles`  ADD CONSTRAINT FOREIGN KEY (`build_on`) REFERENCES `acl_roles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;<br \/>\n<\/code><\/p>\n<p>Nous avons donc une table avec des clefs de r\u00e9f\u00e9rence pour marquer les d\u00e9pendance entre les roles. En images cela donne ceci :<\/p>\n<table boder=\"1\">\n<thead>\n<tr>\n<th>id<\/th>\n<th>name<\/th>\n<th>build_on<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>guest<\/td>\n<td>NULL<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>normal<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>modo<\/td>\n<td>2<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>admin<\/td>\n<td>3<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Maintenant regardons le r\u00e9sultats de divers SELECT, le r\u00e9sultat parle de lui-m\u00eame.<\/p>\n<p>SELECT ar.*, arp.name AS parent_name FROM acl_roles ar, acl_roles arp WHERE arp.id = ar.build_on<\/p>\n<table boder=\"1\">\n<thead>\n<tr>\n<th>id<\/th>\n<th>name<\/th>\n<th>build_on<\/th>\n<th>parent_name<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"right\">2<\/td>\n<td>normal<\/td>\n<td align=\"right\">1<\/td>\n<td>guest<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">3<\/td>\n<td>modo<\/td>\n<td align=\"right\">2<\/td>\n<td>normal<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">4<\/td>\n<td>admin<\/td>\n<td align=\"right\">3<\/td>\n<td>modo<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>SELECT ar.*, arp.name AS parent_name FROM acl_roles ar LEFT JOIN acl_roles arp ON arp.id = ar.build_on<\/p>\n<table boder=\"1\">\n<thead>\n<tr>\n<th>id<\/th>\n<th> name<\/th>\n<th> build_on<\/th>\n<th> parent_name<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"right\">1<\/td>\n<td>guest<\/td>\n<td align=\"right\"><em>NULL<\/em><\/td>\n<td><em>NULL<\/em><\/td>\n<\/tr>\n<tr>\n<td align=\"right\">2<\/td>\n<td>normal<\/td>\n<td align=\"right\">1<\/td>\n<td>guest<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">3<\/td>\n<td>modo<\/td>\n<td align=\"right\">2<\/td>\n<td>normal<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">4<\/td>\n<td>admin<\/td>\n<td align=\"right\">3<\/td>\n<td>modo<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>SELECT ar.*, arp.name AS parent_name FROM acl_roles ar JOIN acl_roles arp ON arp.id = ar.build_on<\/p>\n<table boder=\"1\">\n<thead>\n<tr>\n<th>id<\/th>\n<th> name<\/th>\n<th> build_on<\/th>\n<th> parent_name<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"right\">2<\/td>\n<td>normal<\/td>\n<td align=\"right\">1<\/td>\n<td>guest<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">3<\/td>\n<td>modo<\/td>\n<td align=\"right\">2<\/td>\n<td>normal<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">4<\/td>\n<td>admin<\/td>\n<td align=\"right\">3<\/td>\n<td>modo<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>SELECT ar.*, arp.name AS parent_name FROM acl_roles ar RIGHT JOIN acl_roles arp ON arp.id = ar.build_on<\/p>\n<table boder=\"1\">\n<thead>\n<tr>\n<th>id<\/th>\n<th> name<\/th>\n<th> build_on<\/th>\n<th> parent_name<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td align=\"right\">2<\/td>\n<td>normal<\/td>\n<td align=\"right\">1<\/td>\n<td>guest<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">3<\/td>\n<td>modo<\/td>\n<td align=\"right\">2<\/td>\n<td>normal<\/td>\n<\/tr>\n<tr>\n<td align=\"right\">4<\/td>\n<td>admin<\/td>\n<td align=\"right\">3<\/td>\n<td>modo<\/td>\n<\/tr>\n<tr>\n<td align=\"right\"><em>NULL<\/em><\/td>\n<td><em>NULL<\/em><\/td>\n<td align=\"right\"><em>NULL<\/em><\/td>\n<td>admin<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>J&rsquo;esp\u00e8re que l&rsquo;exemple servira a certain et que cela en aidera plus d&rsquo;un!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>J&rsquo;ai toujours eu quelques diffucult\u00e9 a bien visualis\u00e9 les diff\u00e9rence qu&rsquo;il y avait entre left join, right join, join, etc lorsque je fait des requ\u00eates SQL. Aujourd&rsquo;hui je suis tomb\u00e9 sur un exemple frappant, et je me suis dit que cela pouvait en aider plus d&rsquo;un! Comme une image vaux mieux qu&rsquo;un long discours, en [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[88],"tags":[18,24,105,28],"class_list":["post-364","post","type-post","status-publish","format-standard","hentry","category-reflexion-du-jour","tag-mysql","tag-programmation","tag-sql","tag-trucs-et-astuces"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/posts\/364","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/comments?post=364"}],"version-history":[{"count":2,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/posts\/364\/revisions"}],"predecessor-version":[{"id":366,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/posts\/364\/revisions\/366"}],"wp:attachment":[{"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/media?parent=364"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/categories?post=364"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/grummfy.be\/blog\/wp-json\/wp\/v2\/tags?post=364"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}