mysql left joinを理解しよう

まず、テーブルを作ります。

mysql> create table staff(
-> id int,
-> name varchar(10),
-> deptid int
-> );
Query OK, 0 rows affected (0.20 sec)

mysql> insert into staff values(1, ‘yamada’, 1);
Query OK, 1 row affected (0.11 sec)

mysql> insert into staff values(2, ‘honda’, 4);
Query OK, 1 row affected (0.00 sec)

mysql> insert into staff values(3, ‘kudou’, 6);
Query OK, 1 row affected (0.03 sec)

mysql> insert into staff values(4, ‘nishi’, 1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into staff values(5, ‘tagawa’, 3);
Query OK, 1 row affected (0.06 sec)

mysql> select * from staff;
+——+——–+——–+
| id | name | deptid |
+——+——–+——–+
| 1 | yamada | 1 |
| 2 | honda | 4 |
| 3 | kudou | 6 |
| 4 | nishi | 1 |
| 5 | tagawa | 3 |
+——+——–+——–+
5 rows in set (0.00 sec)

更にもう一つテーブルを作ります。
mysql> create table dept(id int, name varchar(10));
Query OK, 0 rows affected (0.15 sec)

mysql> insert into dept values(1, ‘Develop’);
Query OK, 1 row affected (0.07 sec)

mysql> insert into dept values(3, ‘Legal’);
Query OK, 1 row affected (0.01 sec)

mysql> insert into dept values(5, ‘Planning’);
Query OK, 1 row affected (0.02 sec)

mysql> insert into dept values(6, ‘Marketing’);
Query OK, 1 row affected (0.00 sec)

mysql> select * from dept;
+——+———–+
| id | name |
+——+———–+
| 1 | Develop |
| 3 | Legal |
| 5 | Planning |
| 6 | Marketing |
+——+———–+
4 rows in set (0.00 sec)

さーそれではleft.joinを使ってみましょう。

mysql> select * from staff left join dept on staff.deptid = dept.id;
+——+——–+——–+——+———–+
| id | name | deptid | id | name |
+——+——–+——–+——+———–+
| 1 | yamada | 1 | 1 | Develop |
| 4 | nishi | 1 | 1 | Develop |
| 5 | tagawa | 3 | 3 | Legal |
| 3 | kudou | 6 | 6 | Marketing |
| 2 | honda | 4 | NULL | NULL |
+——+——–+——–+——+———–+
5 rows in set (0.05 sec)

おおおおおおおおおおおおお。逆バージョン

mysql> select * from dept left join staff on dept.id = staff.deptid;
+——+———–+——+——–+——–+
| id | name | id | name | deptid |
+——+———–+——+——–+——–+
| 1 | Develop | 1 | yamada | 1 |
| 6 | Marketing | 3 | kudou | 6 |
| 1 | Develop | 4 | nishi | 1 |
| 3 | Legal | 5 | tagawa | 3 |
| 5 | Planning | NULL | NULL | NULL |
+——+———–+——+——–+——–+
5 rows in set (0.00 sec)

並び順がidではないだね。んーん。

カラムを指定する場合は、
mysql> select * from staff.id, staff.name, dept.name left join dept on staff.deptid = dept.id;
ERROR 1146 (42S02): Table ‘staff.id’ doesn’t exist

あれ、ちゃう。こうやな。
select staff.id, staff.name, dept.name from staff left join dept on staff.deptid = dept.id;