SQL

SQL로 서로 다른 테이블 조합(JOIN)하기 | INNER JOIN, OUTER JOIN, CROSS JOIN, SELF JOIN

sean11 2025. 1. 9. 12:00
반응형

INNER JOIN

내부 조인(Inner Join)은 키에 해당하는 각 테이블의 열 값을 비교해 조건에 맞는 값을 검색한다. 기초 교육 과정에서 배운 집합의 관점에서 살펴본다면, 두개의 서로 다른 집합(테이블)의 교집합이라고 생각할 수 있다. 다음은 내부 조인의 기본 형식이다.

SELECT [열]
FROM [테이블1]
INNER JOIN [테이블2] ON [테이블1.열] = [테이블2.열]
WHERE [검색 조건]

 

여기서 ON문은 조인 조건으로 활용된다. WHERE와의 차이점은 ON은 조인을 수행할 때 조건으로 사용되는 것이고, WHERE는 조인을 완료한 상태에서 데이터를 조회할 때 사용한다.

 

만약 서로 다른 3개 이상의 테이블을 조인한다면 아래처럼 INNER JOIN을 추가하는 방식으로 가능하다.

SELECT [열]
FROM [테이블1]
INNER JOIN [테이블2] ON [테이블1.열] = [테이블2.열]
INNER JOIN [테이블3] ON [테이블2.열] = [테이블3.열]
WHERE [검색 조건]

예시

아래는 industry_group 테이블에서 industry가 automobile인 그룹의 열들을 조회하는 쿼리이다. 테이블 간 열 이름이 같을 수 있고, 이로 인해 쿼리가 제대로 동작하지 않거나 불필요하게 쿼리가 길어질 수 있으므로 테이블에 별칭을 AS로 지정하였다.

SELECT 
    a.industry
    c.symbol
    c.company_name
    c.ipo_year
    c.sector   
FROM industry_group AS a
    INNER JOIN industry_group_symbol AS b ON a.num = b.num
    INNER JOIN nasdaq_company AS c ON b.symbol = c.symbol
WHERE a.industry = N'automobile'

OUTER JOIN

외부 조인(OUTER JOIN)은 일치 항목을 고려하지 않고, 한쪽 테이블을 다른 쪽 테이블에 조합할 때 사용한다. 아래는 외부 조인의 기본 형식이다. 여기서 < >로 감싼 항목은 1개만 선택해야 한다는 뜻이다.

SELECT [열]
FROM [테이블1]
<LEFT, RIGHT, FULL> OUTER JOIN [테이블2] ON [테이블1.열] = [테이블2.열]
WHERE [검색 조건]

LEFT & RIGHT OUTER JOIN (교집합 포함)

위 기본 형식은 다소 추상적이기에 좀 더 구체적인 쿼리를 살펴보자. LEFT와 RIGHT는 두개의 테이블 중 어느 것을 선택하느냐의 문제이다. SELECT의 대상이 되는 테이블(A)은 왼쪽, 그게 아닌 경우는 다른 테이블(B)로 가정한다. LEFT OUTER JOIN을 하면 우선 A를 모두 포함한다. 그 다음 A와 B의 Key 값을 비교해 교집합 부분을 제외하고서는 NULL 처리를 한다. 이를 쿼리로 나타내면 다음과 같다.

SELECT [열]
FROM A
LEFT OUTER JOIN B ON A.Key = B.Key

LEFT & RIGHT OUTER JOIN (교집합 제외)

위에서 진행한 것에서 교집합 부분을 제외하고 싶다면, 아래와 같이 쿼리를 작성할 수 있다. 만약 SELECT FROM 테이블 대상(A)이 아닌 B 테이블에 진행하고 싶다면 LEFT를 RIGHT로만 바꿔주면 된다.

SELECT [열]
FROM A
LEFT OUTER JOIN B ON B.Key IS NULL

FULL OUTER JOIN

FULL OUTER JOIN은 LEFT OUTER JOIN과 RIGHT OUTER JOIN을 각각 수행한 것이다. 위에서 공부한 두가지를 섞어 보면 교집합 포함 케이스는 집합에서 합집합으로 나타날 것이다.

SELECT [열]
FROM A
FULL OUTER JOIN B ON A.Key = B.Key

만약 교집합은 제외하면 합집합에서 교집합만 뺀 것으로 나타나는데, 이를 쿼리로 표현하면 다음과 같다.

SELECT [열]
FROM A
FULL OUTER JOIN B ON B.Key IS NULL

다만, FULL OUTER JOIN은 많이는 사용하지 않는다고 하는데, 전체에서 데이터의 누락이나 오류가 있을 때 사용한다고 한다. 다음은 그런 예시이다. 2개의 테이블(A, B)에서 symbol 열의 NULL 값을 필터링하는 쿼리다.

SELECT 
    A.symbol
    B.symbol
FROM A
    FULL OUTER JOIN B ON A.symbol = B.symbol
WHERE A.symbol IS NULL OR B.symbol IS NULL

CROSS JOIN

교차 조인(CROSS JOIN)은 각 테이블의 모든 경우의 수를 조합할 때 사용한다. 교차 조인은 테이블1,2의 데이터를 모두 조합해 샘플 데이터를 만들 때 활용할 수 있다. 다음은 교차 조인의 기본 형식이다.

SELECT [열]
FROM [테이블 1]
    CROSS JOIN [테이블 2]
WHERE [검색 조건]

SELF JOIN

셀프 조인(SELF JOIN)은 테이블 자기 자신을 조인에 활용하는 것이다.

 

아래 이미지는 JOIN에 관해 시각적으로 잘 이해될 수 있는 이미지다. 잘 참고해서 JOIN을 이해하자.

JOIN 이미지[2]

 

참고자료

  1. 강성욱. Do it! SQL 입문. 이지스 퍼블리싱.
  2. https://stackoverflow.com/questions/53949197/isnt-sql-a-left-join-b-just-a
반응형