SQL 기본 | DML : 데이터 조작 언어 | JOIN
JOIN는 테이블과 테이블 사이의 결합을 할 시에 사용한다.
다음은 SQL에있는 JOIN의 여러 유형이다.
- (INNER) JOIN : 두 테이블에서 값이 일치하는 레코드를 반환한다.
- LEFT (OUTER) JOIN : 왼쪽 테이블에서 모든 레코드를 반환하고, 오른쪽 테이블에서 일치하는 레코드를 반환한다.
- RIGHT (OUTER) JOIN : 오른쪽 테이블에서 모든 레코드를 반환하고, 왼쪽 테이블에서 일치하는 레코드를 반환한다.
- FULL (OUTER) JOIN : 왼쪽 또는 오른쪽 테이블의 모든 레코드를 반환한다.
추가적으로 아래와 같이 반환되는 값을 조절할 수도 있다.
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이 된다.