이번 포스팅에서는 아우터 조인(OUTER JOIN)에 대해 알아보겠습니다.
아우터 조인은 이너 조인(INNER JOIN)의 반대로 조인 조건에 맞지 않는 데이터들도 표현하고자 할 때 사용합니다.
아우터 조인의 종류는 LEFT, RIGHT, FULL이 있습니다.
아우터 조인은 [LEFT/RIGHT/FULL] OUTER JOIN 문법으로 사용을 할 수 있고 OUTER를 생략하고 [LEFT/RIGHT/FULL] JOIN으로도 사용할 수 있습니다.
아우터 조인을 쉽게 하는 방법은 다음과 같습니다.
합치고자(조인을 하고자)하는 테이블 두 개를 선정하여 주인공, 나머지 관계를 파악해야 합니다.
보통 A테이블과 B테이블의 관계가 1:N이라고 가정 A테이블이 주인공(부모)이고 B테이블이 나머지(자식)입니다.
하지만, 아우터 조인을 할 때는 1:N 관계만을 통해 주인공(부모), 나머지(자식) 관계를 단정짓기 보다는 두 테이블 중 한 테이블에 다른 테이블이 곁다리로 붙는 관계를 파악해야 좋습니다.
예시를 통해 알아보겠습니다.
아래와 같은 사진의 리스트를 뽑아야 하는 상황이라 가정하겠습니다.
사업자명, 연락처는 팀플하는 팀원들의 개인정보라 블러처리하였습니다.
1. '사업자명'은 'COMPANY' 테이블이 관리를 하고 있습니다.
2. '업체종류'는 'ACC_TYPE' 테이블이 관리를 하고 있습니다.
3. 숙소명, 위치, 등록일, 연락처는 'ACC' 테이블이 관리를 하고 있습니다.
세 개의 테이블을 조합하여 위와 같은 합쳐진 테이블을 만들어내야 합니다.
위에서 언급한 두 테이블 중 한 테이블에 다른 테이블이 곁다리로 붙는 관계를 파악해야 좋다고 했는데 이것은 무슨 뜻일까요?
사진을 보시면 ACC 테이블의 왼쪽에 COMPANY 테이블이 곁다리로 껴있고 ACC_TYPE 테이블이 곁다리로 껴있습니다.
이러한 경우에는 ACC 테이블이 주인공입니다.
아우터 조인은 주인공을 향해 방향이 정해집니다.
예를들어 COMPANY 테이블을 와 ACC 테이블을 조인한다면 다음과 같습니다.
SELECT * FROM COMPANY
RIGHT OUTER JOIN ACC ON COMPANY.ID = ACC.COMPANY_ID
또는
SELECT * FROM ACC
LEFT OUTER JOIN COMPANY ON COMPANY.ID = ACC.COMPANY_ID
이러한 관계를 통해 위의 세 개의 테이블을 아우터 조인해보겠습니다.
우선 COMPANY 테이블과 ACC 테이블을 조인하는 쿼리문은 다음과 같습니다.
SELECT C.NAME 사업자명, A.NAME 숙소명, A.LOCATION 위치, A.REGDATE 등록일, A.PHONE 연락처
FROM ACC A
LEFT JOIN COMPANY C ON A.COMPANY_ID = C.ID;
ACC가 주인공이기 때문에 OUTER JOIN의 방향이 ACC로 향했습니다.(LEFT)
다음으로 ACC테이블과 ACC_TYPE을 조인하는 쿼리문은 다음과 같습니다.
SELECT A.NAME 숙소명, A.LOCATION 위치, A.REGDATE 등록일, A.PHONE 연락처, A_T.TYPE 업체종류
FROM ACC A
LEFT JOIN ACC_TYPE A_T ON A.ACC_TYPE_ID = A_T.ID;
ACC가 주인공이기 때문에 이것 또한 OUTER JOIN의 방향이 ACC로 향했습니다.(LEFT)
그런데 지금 세 개의 테이블을 합쳐야 하는데 주인공과 곁다리들이 각각 한 번씩 밖에 합치지 못했습니다.
조인은 두 개를 한 번에 조인할 수 있습니다. 쿼리문은 다음과 같습니다.
SELECT C.NAME 사업자명, A.NAME 숙소명, A.LOCATION 위치, A.REGDATE 등록일, A.PHONE 연락처, A_T.TYPE 업체종류
FROM ACC A
LEFT JOIN COMPANY C ON A.COMPANY_ID = C.ID
LEFT JOIN ACC_TYPE A_T ON A.ACC_TYPE_ID = A_T.ID;
페이지를 만들다 보면 리스트를 불러올 때 조인을 하는 경우가 많습니다.
그렇다면 페이지마다 조인을 반복적으로 해야하는 것일까요? 반복을 줄이는 방법은 없을까요?
다음 포스팅에서는 뷰(VIEW)를 통해 무의미한 반복을 줄이는 방법을 알아보겠습니다. 예시는 그대로 이어집니다.
'Programming > 데이터베이스' 카테고리의 다른 글
[MSSQL] sp_executesql을 활용한 동적쿼리 실행하기 (0) | 2021.07.18 |
---|---|
[MySQL] 제약조건을 무시하고 FOREIGN KEY 삭제하기 (0) | 2021.05.13 |
[오라클 데이터베이스] 이너 조인(INNER JOIN)이란? (ANSI) (0) | 2020.08.12 |
[오라클 데이터베이스] ROW_NUMBER()을 통해 ROWNUM을 추출해보자(Feat. 서브쿼리, 윈도우 함수, 순위 함수) (0) | 2020.08.12 |
[오라클 데이터베이스] - 트랜잭션 처리를 위한 COMMIT과 ROLLBACK (0) | 2019.10.30 |