SQL 기본 | DML : 데이터 조작 언어 | JOIN

JOIN는 테이블과 테이블 사이의 결합을 할 시에 사용한다.

다음은 SQL에있는 JOIN의 여러 유형이다.

  • (INNER) JOIN : 두 테이블에서 값이 일치하는 레코드를 반환한다.
  • LEFT (OUTER) JOIN : 왼쪽 테이블에서 모든 레코드를 반환하고, 오른쪽 테이블에서 일치하는 레코드를 반환한다.
  • RIGHT (OUTER) JOIN : 오른쪽 테이블에서 모든 레코드를 반환하고, 왼쪽 테이블에서 일치하는 레코드를 반환한다.
  • FULL (OUTER) JOIN : 왼쪽 또는 오른쪽 테이블의 모든 레코드를 반환한다.

SQL JOINS

추가적으로 아래와 같이 반환되는 값을 조절할 수도 있다.

SQL JOINS

JOIN 문법

INNER JOIN

SELECT column_name(s)
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;

LEFT (OUTER) JOIN

SELECT column_name(s)
FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name;

RIGHT (OUTER) JOIN

SELECT column_name(s)
FROM table1
RIGHT JOIN table2 ON table1.column_name = table2.column_name;

FULL (OUTER) JOIN

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

INNER JOIN 예제

SQL의 결합(JOIN)에 대한 예제이다.

store_information 테이블

store_name sales txn_date
Los Angeles 1500 Jan-05-2018
San Diego 250 Jan-07-2018
Los Angeles 300 Jan-08-2018
Boston 700 Jan-08-2018

geography 테이블

region_name store_name
East Boston
East New York
West Los Angeles
West San Diego

내부 조인 (inner join)는 두 테이블에서 일치하는 값이 있어야, 해당 데이터가 조회 된다.

지역(region_name) 별로 매출(Sales)을 조사한다. geography 테이블에 각 지역의 상점, store_information 테이블에 각 점포의 매출이 표시된다. 만약 지역별 매출을 살펴보면 그 두 테이블의 데이터를 결합한다. 자세히 보면 필드 store_name의 하나로,이 두 테이블을 조인 할 수 있는 것을 알 수 있다.

SELECT A1.region_name REGION, SUM(A2.sales) SALES
FROM geography A1 JOIN store_information A2 ON A1.store_name = A2.store_name
GROUP BY A1.region_name;

혹은

SELECT A1.region_name REGION, SUM(A2.sales) SALES
FROM geography A1, store_information A2
WHERE A1.store_name = A2.store_name
GROUP BY A1.region_name;

결과는 아래와 같다.

REGION SALES
East 700
West 2050

첫번째 줄 곳에서 SQL을 사용하여 두 필드를 선택한다. 첫째는 geography 테이블의 region_name 필드 (일명 REGION), 두 번째는 store_information 테이블의 sales 필드(일명 SALES). 여기에서 사용되는 테이블 별칭은 Geography 테이블는 A1으로 store_information 테이블의 별칭은 A2으로 지정하였다. 테이블 별칭을 사용하지 않으면, 첫번째 행은 다음과 같게 된다.

SELECT Geography.region_name REGION, SUM(Store_Information.Sales) SALES

이는 보면 알 수 있듯이 테이블 명을 모두 표시하기 길어지고 복잡해 진다. 여기에서 본 테이블 별칭의 용도는 SQL 문이 알기 쉽게 될 수 있으며, 특히 여러 테이블을 포함하는 SQL 문장의 경우 더 유용해 진다.

이어서 두번째 줄에서 FROM 절을 보면, geography 테이블의 store_name 필드와 store_information 테이블의 store_name를 JOIN으로 연결을 하고 있다.

OUTER JOIN 예제

한 테이블있는 데이터 값이 다른 테이블에 하나도 나타나지 않는 경우 OUTER JOIN(외부 조인)를 사용한다.

외부 조인는 데이터베이스에 따라 다른 경우도 있다. 예를 들어, Oracle은 테이블의 데이터가 필요하다는 것을 나타내기 위해 WHERE 절에 로드된 모든 테이블 후에 “(+)“를 넣는다.

각 상점의 매출을 조회한다. 만약 내부 조인을 하면 store_information 테이블에 존재하지 않는 ‘New York’ 매장의 데이터가 누락이 되어 버린다. 그래서 그런 경우 외부 조인을 사용한다.

여기에 사용된 Oracle의 외부 조인는 다음과 같다.

SELECT A1.store_name, SUM(A2.sales) SALES
FROM geography A1, store_information A2
WHERE A1.store_name = A2.store_name (+)
GROUP BY A1.store_name;

결과는 아래와 같다.

store_name SALES
Boston 700
New York
Los Angeles 1800
San Diego 250

두번째 테이블에 해당 데이터가 없는 경우 SQL에서 NULL 값이 들어간다. 이 예제에서 ‘New York’가 store_information 테이블에 존재하지 않기 때문에, 그 “SALES"필드가 NULL이 된다.




최종 수정 : 2021-08-27