Skip to main content

Command Palette

Search for a command to run...

[ 살펴보기 ] Sql - Join

Updated
3 min readView as Markdown
[ 살펴보기 ] Sql - Join
C

A developer living in Busan, Korea

특정 데이터를 기준으로 서로 다른 테이블에서 데이터를 함께 조회할 때 Join을 사용할 수 있다. 만약 users라는 table과 orders라는 table 두 곳에서 특정 user에 대한 정보와 user가 주문한 데이터를 함께 조회해야 할 때 Join을 통해 두 table 모두에서 데이터를 조회할 수 있다. 그리고 이 때 두 테이블 간의 연결 수단으로 흔히 사용되는 것이 Foreign key다

데이터베이스에 users와 orders라는 두 개의 데이터을 만들어 간단한 데이터로 채워 Join의 차이점을 살펴보자

현재 users table에 있는 데이터는 다음과 같다

그리고 orders 테이블에 존재하는 데이터는 아래와 같다. user_id는 user 데이블의 id column에 대한 외래키로 설정되어 있다.

Inner Join

Inner Join은 Join하는 조건을 충족하는 데이터만 검색 결과에 포함한다. 다음 예제를 살펴보자

SELECT users.name as userName, orders.title as orderName
FROM users 
INNER JOIN orders
ON users.id = orders.user_id;

위의 예제는 users와 orders 테이블 두 곳에서 필요한 데이터를 검색하며 JOIN의 조건으로 users 테이블의 id와 orders 테이블의 user_id 값이 동일한 행을 검색 결과에 포함시킨다. 즉, 결과는 다음과 같다

Left ( Outer ) Join

두 테이블을 Join할 때 왼쪽에 선언된 테이블의 데이터를 모두 출력하고 오른쪽에 선언된 테이블은 조건에 일치하는 행을 가지고 온다. 만약 오른쪽에 선언된 테이블에 매칭되는 행이 없으면 값을 NULL로 대체되어 들어간다

다음 예제를 살펴보자

SELECT users.name as userName, orders.title as orderName
FROM users
LEFT JOIN orders
ON users.id = orders.user_id;

위의 예제에서는 LEFT JOIN의 대상은 users 테이블이 된다. 즉 users 테이블의 데이터는 모두 출력되고 orders table 중에 조건에 만족하는 데이터가 없다면 NULL로 대체된다. 즉 결과는 다음과 같다

Left 또는 Right Join을 수행할 때 Outer 키워드는 선택사항이므로 위의 예제와 같이 JOIN JOIN만 기입해도 무관하지만 명확성을 중요시 한다면 아래와 같이 OUTER 키워드를 추가해도 무관하다. 쿼리 결과는 OUTER 키워드가 없을 때와 동일하다.

SELECT users.name as userName, orders.title as orderName
FROM users
LEFT OUTER JOIN orders
ON users.id = orders.user_id;

Right ( Outer ) Join

Left Join의 반대되는 역할을 한다. RIGHT JOIN 구문 오른쪽에 오는 table의 데이터를 모두 출력하고 조건에 만족하는 데이터가 없으면 구문 왼쪽 테이블의 출력 데이터를 NULL로 대체된다

SELECT users.name as userName, orders.title as orderName
FROM orders
RIGHT JOIN users
ON users.id = orders.user_id;

위의 예제와 같이 RIGHT JOIN에 대상이 되는 Table을 users로 변경해서 다시 테스트 해보면 결과는 다음과 같다

3방향 Join

만약 세 개의 테이블을 통해 데이터를 검색해야 한다면 Join절을 하나 더 추가하여 작업을 수행한다. 3방향 Join 테스트를 위해 refunds이라는 이름의 table을 하나 더 만들고 다음과 같이 간단히 테이터를 삽입하여 테스트를 해보자

위의 테이블에서 order_id는 order table id column에 대한 외래키이고 user_id는 user table id column에 대한 외래키이다.

위에서 살펴보았던 join 테스트 결과와 더불어 order id에 따라 refunds table의 reason 데이터로 조회하고 싶다면 아래와 같이 처리할 수 있다

SELECT users.name as userName, orders.id as orderId, 
orders.name as orderName, refunds.reason  as refundReason
FROM users
LEFT JOIN orders
ON users.id = orders.user_id
LEFT JOIN refunds
ON refunds.order_id = orders.id;

그리고 위의 쿼리를 실행한 결과는 다음과 같다

Join에 추가 필터 적용하기

JOIN절과 더불어 추가적으로 검색에 필요한 필터를 추가해야 할 때 다음과 같이 추가 필터를 적용할 수 있다.

SELECT users.name as userName, orders.id as orderId, orders.name as orderName
FROM users
LEFT JOIN orders 
ON users.id = orders.user_id
WHERE users.name = 'jake'

위의 쿼리는 users table에 대한 Left Join이후 user name이 jake인 데이터를 추가적으로 필터한다. 위 쿼리에 대한 결과는 다음과 같다

More from this blog

[ 살펴보기 ] TypeORM - Transactions, Migration

Transation Database 종류에 따라 detail한 부분은 차이점이 조금씩 있겠지만 각 sql statement는 개별적인 transaction block을 통해 실행되며 Database 설정에 따라 sql statement의 실행 결과가 자동으로 commit되어 영구히 적용되거나 commit을 직접 실행하기 전까지는 영구히 적용되지 않을 수 있다. 대부분의 경우 default로 sql statement 실행 결과가 자동으로 comm...

Feb 9, 20256 min read
[ 살펴보기 ] TypeORM - Transactions, Migration

Dev Diary

184 posts