본문 바로가기

sql

SQL : Inner Join

일반적으로 데이터베이스는 여러 개의 데이터 테이블의 관계로 구성되어 있다. 

따라서 데이터베이스에 저장되어 있는 데이터를 목적에 맞게 활용하기 위해서는, 여러 개의 테이블에 따로 저장되어 있는 데이터를 필요에 맞게 하나로 불러올 수 있어야 한다. 

 

이를 위해 사용하는 것이 JOIN 문이다. 

JOIN은 join을 하는 기준이 되는 컬럼을 포함하는지에 따라 INNER JOINOUTER JOIN으로 나뉘는데, 

이중 가장 기본이 되고 가장 많이 쓰이는 INNER JOIN이다. 

 

Inner Join은 join의 기준이 되는 column의 데이터가 두 테이블 모두 존재할 때, 두 데이터테이블을 join한다. 

 

PostgreSQL에서 INNER JOIN은 앞의 'inner'을 생략하고 join만 적으면 되며,

기본적인 형식은 다음과 같다.

select ~~ 
from Table_A 
join Table_B on Table_A.column = Table_B.column

데이터테이블 Table_A와 Table_B를 join하고 싶다면, 

from에서 불러온 데이터테이블과 join하고자 하는 다른 데이터테이블을 join 문에서 지정한 후,

'on' 뒤에 기준이 되는 column을 적으면 된다. 

 

이렇게만 보면 헷갈리므로, 구체적인 예시를 통해 살펴보자.

위와 같은 관계를 갖는 데이터베이스가 있다고 해보자. 

 

Customer 테이블은 Invoice 테이블과 'CustomerId'라는 컬럼을 기준으로 연결되어 있으며,

Invoice 테이블은 InvoiceLine 테이블과 'InvoiceId' 컬럼을 기준으로 연결되어 있다.

 

먼저, Customer 테이블과 Invoice 테이블을 inner join해서 

Customer 테이블의 'CustomerId', Name('FirstName' + 'LastName'), 'City'와

Invoice 테이블의 'InvoiceDate', 'Total' 값을 출력해보도록 하겠다.

select a.CustomerId, a.FirstName ||' '|| a.LastName as Name, a.City, b.InvoiceId, b.Total 
from Customer a
	join Invoice b on a.CustomerId = b.CustomerId;

두 테이블의 값을 가져오기 위해, 두 테이블이 공통으로 데이터를 가지고 있는 'CustomerId' 컬럼을 기준으로 join한 것을 확인할 수 있다. 이렇게 두 테이블을 join한 후, 가져오고자 하는 데이터를 select 해주면 된다.

(위 쿼리문에서는 'FirstName'과 'LastName'을 ||' '||을 통해 공백을 두고 합친 다음, as를 통해 Name이라는 컬럼명으로 출력하였다.)

 

아래는 그 결과값이다.

 

 

INNER JOIN을 활용해서 여러 개의 테이블을 join할 수도 있다. 

가령, 위의 데이터테이블 관계도에서 서로 직접적으로 연결되어 있지 않은 Customer 테이블과 InvoiceLine 테이블의 데이터를 한 번에 가져오기 위해서는 여러 번의 join문을 수행해야 한다.

 

Customer 테이블에서 CustomerId과 Name을,

Invoice 테이블에서는 InvoiceId, Total을,

InvoiceLine 테이블에서는 UnitPrice, Quantity를 join문을 두 개 사용하여 가져와보자.

select a.CustomerId, a.FirstName ||' '|| a.LastName as Name, 
	b.InvoiceId, b.Total, c.UnitPrice, c.Quantity  
from Customer a
	join Invoice b on a.CustomerId = b.CustomerId
	join InvoiceLine c on b.InvoiceId = c.InvoiceId;

이를 위해서는 먼저 Customer 테이블과 Invoice 테이블을 기준 컬럼 'CustomerId'를 통해 join한 후,

다시 Invoice 테이블과 InvoiceLine 테이블을 기준 컬럼 'InvoiceId'를 통해 join하면

서로 직접적으로 연결되어 있지 않은 Customer 테이블과 InvoiceLIne 테이블에서 한 번에 필요한 데이터를 불러올 수 있다. 

'sql' 카테고리의 다른 글

SQL : OUTER JOIN  (0) 2022.10.01
SQL 기본 구문: SELECT와 FROM  (0) 2022.09.15
SQL(Structured Query Language)이란 무엇일까?  (0) 2022.09.03