SQLite | データの結合 | 自然結合(NATURALキーワード)
内部結合や外部結合では通常、結合条件にカラムを指定します。NATURALキーワードを使うと、両方のテーブルにある同名カラムが自動的に使われます。ここでは自然結合を説明します。
自然結合の使い方
内部結合または外部結合にNATURALを指定します。構文は次のとおりです。
内部結合の場合
SELECT テーブル名.カラム名, ... FROM テーブル1
NATURAL INNER JOIN テーブル2;
外部結合の場合
SELECT テーブル名.カラム名, ... FROM テーブル1
NATURAL LEFT OUTER JOIN テーブル2;
自然結合では同名カラムが自動的に比較されるため、結合条件は不要です。それ以外は対応する内部結合や外部結合と同じです。
–
employeeテーブルとdeptテーブルを作成します。どちらにもdept_idカラムがあり、サンプルデータを追加します。
create table employee (id integer, name text, dept_id integer);
insert into employee values (1, 'dekuma', 1);
insert into employee values (2, 'kimkc', 3);
insert into employee values (3, 'araikuma', 1);
insert into employee values (4, 'happykuma', 2);
insert into employee values (5, 'mykuma', 4);
insert into employee values (6, 'raccoon', 3);
sqlite> create table employee (id integer, name text, dept_id integer);
sqlite>
sqlite> insert into employee values (1, 'dekuma', 1);
sqlite> insert into employee values (2, 'kimkc', 3);
sqlite> insert into employee values (3, 'araikuma', 1);
sqlite> insert into employee values (4, 'happykuma', 2);
sqlite> insert into employee values (5, 'mykuma', 4);
sqlite> insert into employee values (6, 'raccoon', 3);
sqlite>
create table dept(dept_id integer, deptname text);
insert into dept values(1, 'Sales');
insert into dept values(2, 'Manage');
insert into dept values(3, 'Dev');
sqlite> create table dept(dept_id integer, deptname text);
sqlite>
sqlite> insert into dept values(1, 'Sales');
sqlite> insert into dept values(2, 'Manage');
sqlite> insert into dept values(3, 'Dev');
sqlite>
まず自然内部結合を実行します。両テーブルにdept_idがあるため、このカラムで結合されます。
select * from employee natural inner join dept;
sqlite> select * from employee natural inner join dept;
id name dept_id deptname
---------- ---------- ---------- ----------
1 dekuma 1 Sales
2 kimkc 3 Dev
3 araikuma 1 Sales
4 happykuma 2 Manage
6 raccoon 3 Dev
sqlite>
NATURALを使うと、同名カラムは結果に1つだけ表示されます。
これは明示的なON条件を使った内部結合と同じです。
select * from employee inner join dept on employee.dept_id = dept.dept_id;
sqlite> select * from employee inner join dept on employee.dept_id = dept.dept_id;
id name dept_id dept_id deptname
---------- ---------- ---------- ---------- ----------
1 dekuma 1 1 Sales
2 kimkc 3 3 Dev
3 araikuma 1 1 Sales
4 happykuma 2 2 Manage
6 raccoon 3 3 Dev
sqlite>
次に自然外部結合を実行します。この場合も共通のdept_idで結合されます。
select * from employee natural left outer join employee;
sqlite> select * from employee natural left outer join employee;
id name dept_id
---------- ---------- ----------
1 dekuma 1
2 kimkc 3
3 araikuma 1
4 happykuma 2
5 mykuma 4
6 raccoon 3
sqlite>
これは明示的なON条件を使った外部結合と同じです。
select * from employee left outer join dept on employee.dept_id = dept.dept_id;
sqlite> select * from employee left outer join dept on employee.dept_id = dept.dept_id;
id name dept_id dept_id deptname
---------- ---------- ---------- ---------- ----------
1 dekuma 1 1 Sales
2 kimkc 3 3 Dev
3 araikuma 1 1 Sales
4 happykuma 2 2 Manage
5 mykuma 4
6 raccoon 3 3 Dev
sqlite>