SQLite | 데이터 조인(Join) | 자연 조인 (NATURAL 키워드)


내부 조인과 외부 조인은 두 테이블의 지정된 컬럼을 조인 조건으로 데이터를 조인하였다. NATURAL 키워드를 지정하면 컬럼명을 따로 지정하지 않고 두 테이블에서 같은 이름의 컬럼명을 사용되어 조인이 된다. 이러한 조인을 자연 조인이라고 한다. 여기에서는 NATURAL 키워드를 사용한 자연 조인 사용에 대해 설명한다.

자연 조인 사용 방법

내부 조인과 외부 조인을 할 때에 NATURAL 키워드를 지정하면 자연 조인이 된다. 형식은 다음과 같다.

내부 조인의 경우

SELECT 테이블명.컬럼명, ... FROM 테이블명1
   NATURAL INNER JOIN 테이블명2;

외부 조인의 경우

SELECT 테이블명.컬럼명, ... FROM 테이블명1
   NATURAL LEFT OUTER JOIN 테이블명2;

자연 조인을 하면 두 테이블에 포함된 동일한 컬럼명의 값이 일치하는지 비교되기 때문에 조인 조건을 지정할 필요가 없다. 비교되는 컬럼명이 자동으로 결정되는 것 외에는 내부 조인과 외부 조인의 사용법과 동일하다.

간단한 예를 통해 어떻게 사용하는지에 대해 확인해 보자. 직원 목록이 등록된 employee 테이블과 부서가 등록된 dept 테이블을 만든다. 두 테이블에는 dept_id라는 컬럼이 동일하게 존재한다. INSERT 문을 사용하여 데이터도 같이 추가한다.

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> 

그러면 우선 NATURAL 키워드를 넣어 내부 조인을 하여 데이터를 조회해 보자. 두 테이블에는 dept_id라는 같은 이름의 컬럼이 존재하므로 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를 사용하면 두 테이블에서 같은 이름의 컬럼 하나만 결과에 표시된다.

이는 내부 조인에서 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> 

다음은 NATURAL 키워드를 넣어 외부 조인을 하여 데이터를 조회해 보자. 두 테이블에는 dept_id라는 같은 이름의 컬럼이 존재하므로 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>