内部結合(INNER JOIN)は、2つ以上のテーブルを結合し、結合条件を満たす複数のテーブルデータを返すためのものです。内部結合は単純結合とも呼ばれます。
内部結合の構文
内部結合では、JOIN が返す結果はデフォルトで ON 句に記述された結合条件を満たすものになります。通常、キーワード INNER は省略されます。JOIN の前後に記述されるテーブルは、それぞれ左テーブルと右テーブルと呼ばれます、ON 句では、左テーブルと右テーブルの結合条件およびフィルタリング条件を記述します。
内部結合のSQL構文は以下のとおりです:
SELECT select_list FROM table_name1 [INNER] JOIN table_name2 ON join_condition
[ WHERE query_condition ]
[ ORDER BY column_list ]
WHERE と ORDER BY の両方の句を同時に使用する場合、SQLが返す結果は JOIN の結果を基に、WHERE 句の検索条件でフィルタリングされ、さらに ORDER BY 句で指定された列に従ってソートされます。
ON 句がない場合、INNER JOIN が返すのは左テーブルと右テーブルのすべてのデータであり、これをデカルト積と呼びます。
同じ結合条件の下で、ON 句は WHERE 句に置き換えて内部結合クエリを実現することもできます。構文は以下のとおりです:
SELECT select_list FROM table_name1,table_name2 [ WHERE query_condition ]
例
サンプルテーブルを作成し、データを挿入します。
obclient [SYS]> CREATE TABLE tbl1(id NUMBER NOT NULL PRIMARY KEY, name VARCHAR(50));
Query OK, 0 rows affected
obclient [SYS]> CREATE TABLE tbl2(id NUMBER NOT NULL PRIMARY KEY, name VARCHAR(50));
Query OK, 0 rows affected
obclient [SYS]> INSERT INTO tbl1 VALUES(1,'A1'),(2,'B1'),(4,'D1'),(6,'F1'),(8,'H1'),(10,'J1');
Query OK, 6 rows affected
Records: 6 Duplicates: 0 Warnings: 0
obclient [SYS]> INSERT INTO tbl2 VALUES(1,'B2'),(3,'C2'),(6,'F2'),(9,'I2');
Query OK, 4 rows affected
Records: 4 Duplicates: 0 Warnings: 0
結合条件を使用したクエリの例
サンプルテーブルを作成し、適切なデータを挿入し、結合条件を持つ方法でデータをクエリします。
tbl1テーブルとtbl2テーブルのidが同じid列とname列のデータをクエリします。obclient [SYS]> SELECT tbl1.id, tbl1.name, tbl2.id, tbl2.name FROM tbl1 JOIN tbl2 ON tbl1.id=tbl2.id; +----+------+----+------+ | ID | NAME | ID | NAME | +----+------+----+------+ | 1 | A1 | 1 | B2 | | 6 | F1 | 6 | F2 | +----+------+----+------+ 2 rows in set内部結合を使用して、
tbl1テーブルとtbl2テーブルのidが同じid列とname列のデータをクエリします。obclient [SYS]> SELECT tbl1.id, tbl1.name, tbl2.id, tbl2.name FROM tbl1 INNER JOIN tbl2 ON tbl1.id=tbl2.id; +----+------+----+------+ | ID | NAME | ID | NAME | +----+------+----+------+ | 1 | A1 | 1 | B2 | | 6 | F1 | 6 | F2 | +----+------+----+------+ 2 rows in setWHERE条件を使用して、tbl1テーブルとtbl2テーブルのidが同じであるid、name列のデータをクエリします。obclient [SYS]> SELECT tbl1.id, tbl1.name, tbl2.id, tbl2.name FROM tbl1,tbl2 WHERE tbl1.id=tbl2.id; +----+------+----+------+ | id | name | id | name | +----+------+----+------+ | 1 | A1 | 1 | B2 | | 6 | F1 | 6 | F2 | +----+------+----+------+ 2 rows in set
結合条件なしのクエリの例
上記で作成されたテーブルとデータに基づき、無条件結合の方法を用いて、tbl1 テーブルと tbl2 テーブルの id 列と name 列のデータをクエリします。
obclient [SYS]> SELECT tbl1.id, tbl1.name, tbl2.id, tbl2.name FROM tbl1 INNER JOIN tbl2;
+----+------+----+------+
| id | name | id | name |
+----+------+----+------+
| 1 | A1 | 1 | B2 |
| 1 | A1 | 3 | C2 |
| 1 | A1 | 6 | F2 |
| 1 | A1 | 9 | I2 |
| 2 | B1 | 1 | B2 |
| 2 | B1 | 3 | C2 |
| 2 | B1 | 6 | F2 |
| 2 | B1 | 9 | I2 |
| 4 | D1 | 1 | B2 |
| 4 | D1 | 3 | C2 |
| 4 | D1 | 6 | F2 |
| 4 | D1 | 9 | I2 |
| 6 | F1 | 1 | B2 |
| 6 | F1 | 3 | C2 |
| 6 | F1 | 6 | F2 |
| 6 | F1 | 9 | I2 |
| 8 | H1 | 1 | B2 |
| 8 | H1 | 3 | C2 |
| 8 | H1 | 6 | F2 |
| 8 | H1 | 9 | I2 |
| 10 | J1 | 1 | B2 |
| 10 | J1 | 3 | C2 |
| 10 | J1 | 6 | F2 |
| 10 | J1 | 9 | I2 |
+----+------+----+------+
24 rows in set
組み合わせ条件を使用したクエリの例
上記で作成したテーブルとデータに基づき、条件を組み合わせてデータをクエリします。
内部結合とAND結合条件を持つ方法でデータをクエリします。
obclient [SYS]> SELECT tbl1.id, tbl1.name, tbl2.id, tbl2.name FROM tbl1 INNER JOIN tbl2 ON tbl1.id=tbl2.id AND tbl1.id=6; +----+------+----+------+ | id | name | id | name | +----+------+----+------+ | 6 | F1 | 6 | F2 | +----+------+----+------+ 1 row in set内部結合とWHERE結合条件を持つ方法でデータをクエリします。
obclient [SYS]> SELECT tbl1.id, tbl1.name, tbl2.id, tbl2.name FROM tbl1 INNER JOIN tbl2 ON tbl1.id=tbl2.id WHERE tbl1.id=6; +----+------+----+------+ | id | name | id | name | +----+------+----+------+ | 6 | F1 | 6 | F2 | +----+------+----+------+ 1 row in setWHERE結合条件とAND結合条件を持つ方法でデータをクエリします。
obclient [SYS]> SELECT tbl1.id, tbl1.name, tbl2.id, tbl2.name FROM tbl1,tbl2 WHERE tbl1.id=tbl2.id AND tbl1.id=6; +----+------+----+------+ | id | name | id | name | +----+------+----+------+ | 6 | F1 | 6 | F2 | +----+------+----+------+ 1 row in set内部結合条件とORDER BYソートを持つ方法でデータをクエリします。
obclient [SYS]> SELECT tbl1.id, tbl1.name, tbl2.id, tbl2.name FROM tbl1 INNER JOIN tbl2 ON tbl1.id=tbl2.id ORDER BY tbl1.id DESC; +----+------+----+------+ | id | name | id | name | +----+------+----+------+ | 6 | F1 | 6 | F2 | | 1 | A1 | 1 | B2 | +----+------+----+------+ 2 rows in set