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>