左結合(LEFT JOIN)とは左外部結合を表します。このステートメントを使用すると、左テーブルのすべてのレコードと、左テーブルと右テーブルの結合フィールドと一致するレコードを返します。
背景
外部結合(OUTER JOIN)は、比較演算子を使用して2つのテーブルのデータを比較します。結合結果には結合条件がマッチする行だけでなく、条件がマッチしない行も含まれます。
外部結合には、全結合(FULL JOIN)、左結合(LEFT JOIN)、右結合(RIGHT JOIN)が含まれます。外部結合は、結合条件を満たすすべての行を返すと同時に、どちらか一方のテーブルにのみ存在する(もう一方のテーブルに対応する行がない)行も返します。その際、対応する行がない側のテーブルの列はNULLで補完されます。
本記事は主に左外結合の例を提供します。全結合の例については 完全結合 を、右結合の例については 右結合を参照してください。
LEFT JOIN構文
外部結合ステートメントには通常左テーブルと右テーブルが含まれます。JOIN 句の左端が左テーブル、JOIN 句の右端が右テーブルです。
LEFT JOINのSQL構文は以下のとおりです:
SELECT select_list FROM table_name1 LEFT JOIN table_name2 ON join_condition
[ WHERE query_condition ]
[ ORDER BY column_list ];
ここで、table_name1 が左テーブル、table_name2 が右テーブルです。
例
サンプルテーブルを作成し、適切なデータを挿入します。
obclient [info]> CREATE TABLE tbl_a(id INT NOT NULL PRIMARY KEY, name VARCHAR(50));
Query OK, 0 rows affected
obclient [info]> CREATE TABLE tbl_b(number INT NOT NULL PRIMARY KEY, value INT);
Query OK, 0 rows affected
obclient [info]> CREATE TABLE tbl_c(id INT NOT NULL , name VARCHAR(50));
Query OK, 0 rows affected (0.081 sec)
obclient [info]> INSERT INTO tbl_a VALUES(1,'ab'),(2,'cd'),(3,'ef'),(4,'gh');
Query OK, 6 rows affected
Records: 6 Duplicates: 0 Warnings: 0
obclient [info]> INSERT INTO tbl_b VALUES(1,1001),(3,1003),(5,1005);
Query OK, 4 rows affected
Records: 4 Duplicates: 0 Warnings: 0
obclient [info]> INSERT INTO tbl_c VALUES(1,'aa'),(2,'dd'),(6,'ee'),(7,'hh'),(9,'xx');
Query OK, 5 rows affected (0.005 sec)
Records: 5 Duplicates: 0 Warnings: 0
シンプルな左結合クエリ
JOIN が返すデータが結合条件やフィルタ条件にマッチするデータのほか、左テーブルのフィルタ条件にマッチするものの結合条件を満たさないデータも含む場合、左外部結合(LEFT OUTER JOIN)を使用することができます。これは、略して左結合(LEFT JOIN)とすることもできます。
左結合クエリを使用する際、左のテーブルの1行が右テーブルで見つからない場合、右テーブルの該当する行に自動的に NULL が入力されます。
例1:テーブル tbl_a とテーブル tbl_b に左結合クエリを実行し、実行結果を取得します。
obclient> SELECT * FROM tbl_a;
+------+------+
| id | name |
+------+------+
| 1 | ab |
| 2 | cd |
| 3 | ef |
| 4 | gh |
+------+------+
4 rows in set
obclient> SELECT * FROM tbl_b;
+--------+-------+
| number | value |
+--------+-------+
| 1 | 1001 |
| 3 | 1003 |
| 5 | 1005 |
+--------+-------+
3 rows in set
obclient> SELECT * FROM tbl_a LEFT JOIN tbl_b ON tbl_a.id=tbl_b.number;
+------+------+--------+-------+
| id | name | number | value |
+------+------+--------+-------+
| 1 | ab | 1 | 1001 |
| 2 | cd | NULL | NULL |
| 3 | ef | 3 | 1003 |
| 4 | gh | NULL | NULL |
+------+------+--------+-------+
4 rows in set
複雑な左結合クエリ
例:
obclient> SELECT * FROM tbl_a;
+------+------+
| id | name |
+------+------+
| 1 | ab |
| 2 | cd |
| 3 | ef |
| 4 | gh |
+------+------+
4 rows in set (0.002 sec)
obclient> SELECT * FROM tbl_b;
+--------+-------+
| number | value |
+--------+-------+
| 1 | 1001 |
| 3 | 1003 |
| 5 | 1005 |
+--------+-------+
3 rows in set (0.002 sec)
obclient> SELECT * FROM tbl_c;
+------+------+
| id | name |
+------+------+
| 1 | aa |
| 2 | dd |
| 6 | ee |
| 7 | hh |
| 9 | xx |
+------+------+
5 rows in set (0.002 sec)
obclient> SELECT * FROM tbl_a a LEFT JOIN tbl_b b LEFT JOIN tbl_c c ON c.id=b.number ON a.name=c.name;
+------+------+--------+-------+------+------+
| id | name | number | value | id | name |
+------+------+--------+-------+------+------+
| 1 | ab | NULL | NULL | NULL | NULL |
| 4 | gh | NULL | NULL | NULL | NULL |
| 3 | ef | NULL | NULL | NULL | NULL |
| 2 | cd | NULL | NULL | NULL | NULL |
+------+------+--------+-------+------+------+
4 rows in set (0.004 sec)
左結合とWHERE句の組み合わせ使用
左結合を使用して結合結果を取得し、次に WHERE 句を使用して結合結果をフィルタリングできます。
例2:テーブル tbl_a とテーブル tbl_b で左結合クエリを実行した後、tbl_a テーブルの name='ab のデータを返します。
obclient> SELECT * FROM tbl_a;
+------+------+
| id | name |
+------+------+
| 1 | ab |
| 2 | cd |
| 3 | ef |
| 4 | gh |
+------+------+
4 rows in set
obclient> SELECT * FROM tbl_b;
+--------+-------+
| number | value |
+--------+-------+
| 1 | 1001 |
| 3 | 1003 |
| 5 | 1005 |
+--------+-------+
3 rows in set
obclient> SELECT * FROM tbl_a LEFT JOIN tbl_b ON tbl_a.id=tbl_b.number WHERE tbl_a.name='ab';
+------+------+--------+-------+
| id | name | number | value |
+------+------+--------+-------+
| 1 | ab | 1 | 1001 |
+------+------+--------+-------+
1 row in set