이번 포스팅은 SQL 조인의 두번째로 Inner 조인과 Outer 조인에 대해 어떻게 다른지 알아보도록 하겠습니다. Inner 조인은 쉬운데 Outer 조인은 어려워하는 경우가 많습니다. 이번에 Outer 조인을 어떻게 외우면 Oracle에서 확실히 기억할 수 있는지 그 방법을 공개 하겠습니다.
Inner Join
Inner Join은 번역하면 내부 조인이라고 하는데요. 이는 지정된 조인 조건을 기준으로 두 테이블 모두에서 일치하는 행만 아래와 같이 결과가 나오는 조인을 말합니다. 이전 포스팅에서 배웠던 Equi-Join이나 Non equi-Join이 Inner Join에 해당합니다.
SQL> SELECT A.no, B.no, B.col FROM emp A, dept B WHERE A.no = B.no ; |
Outer Join
Outer Join은 Left Outer Join, Right Outer Join, Full Outer Join으로 나뉩니다. 세가지 모두 개념만 알아두면 쉽습니다. 요약하면, Left는 왼쪽이 기준, Right는 오른쪽이 기준, Full은 왼쪽, 오른쪽 모두를 기준으로 수행합니다.
1. Left Outer Join
- 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환. 일치하는 항목이 없으면 오른쪽 테이블의 열에 대해 NULL 값이 반환
2. Right Outer Join
- Left Outer Join과 유사하나 기준 테이블만 오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행을 반환. 일치항목이 없으면 NULL 값이 반환
3. Full Outer Join
- 왼쪽 또는 오른쪽 테이블에 일치하는 항목이 있는 경우 모든 행을 반환. 일치하는 항목이 없으면 일치 항목이 없는 테이블의 열에 대해 NULL 값이 반환
SQL> SELECT A.no, B.no, B.col FROM emp A, dept B WHERE A.no = B.no(+) ; |
오라클에서는 Outer 조인에 대한 기호를 (+) 로 표시합니다. 그런데 (+)가 붙지 않는 테이블이 기준 테이블이죠. 이 부분에서 많이 헷갈려 하는데요. 외울때 'B테이블에 NULL을 +(더해서)라도 집합을 만들어라'라고 외우면 기준 테이블이 반대 테이블이라는 것을 알 수 있습니다. 그럼에서 emp 테이블의 파란색은 Join이 되지 않기 때문에 Inner 조인에서는 누락이 되지만 Outer Join을 하면 그 부분을 집합으로 만듭니다. 그리고 dept테이블에는 매칭되는 것이 없기 때문에 null로 채우게 되지요.
Outer Join시 주의사항
Outer Join을 사용할 때 가끔 Inner Join처럼 결과가 나와 버리는 경우가 발생합니다. 예를 들어, 아래와 같은 SQL 구문일 때 입니다.
Inner Join 수행 SQL> SELECT A.no, B.no, B.col FROM emp A, dept B WHERE A.no = B.no(+) AND B.col = '20' ; |
Outer Join 수행 SQL> SELECT A.no, B.no, B.col FROM emp A, dept B WHERE A.no = B.no(+) AND B.col(+) = '20' ; |
왼쪽과 같이 dept 테이블의 조인에서 하나의 컬럼이라도 (+)가 없으면 그냥 Inner 조인을 수행하게 됩니다. 만약 Outer Join을 하고 싶으면, 오른쪽 처럼 B.col(+)로 dept 테이블 모든 조인 컬럼에 표시해줘야 합니다. 수행 결과는 두 테이블이 no로 같으면서 col이 20인 데이터 외에는 B 테이블의 정보는 null이 입력됩니다.
ANSI(표준) SQL에서 조인(JOIN)
오라클에서는 from 절 뒤에 테이블을 콤마(,)로 구분하여 리스트를 만들고 주로 where 조건에서 한꺼번에 조인을 처리합니다. 하지만 ANSI 표준에서는 아래와 같은 방식으로 Join을 수행합니다. 프로젝트를 많이 하다보면 다양한 dbms가 만나게 됩니다. ANSI 표준 SQL은 dbms 종류와 상관없이 동일한 구문을 사용합니다. 이런 효율성 때문에 많은 개발자 들이 ANSI 표준으로 SQL을 작성합니다.
1. INNER JOIN
우선 INNER JOIN은 아래와 같이 두개 테이블 사이에 inner join 이라는 구문을 넣어 리스트를 만듭니다. 그리고 조인 조건은 ON 절에 넣어 줍니다. 추가적인 필터 조건이 있을 경우 where절에 기술합니다.
2. LEFT OUTER JOIN
Left Outer Join은 왼쪽 테이블 temp1을 기준으로 하기 때문에 temp2의 조인 안된 데이터들은 null로 채워졌습니다.
3. RIGHT OUTER JOIN
Right Outer Join은 왼쪽 테이블 temp2을 기준으로 하기 때문에 역시 temp1의 조인 안된 데이터들은 null로 채워졌습니다.
'데이터베이스' 카테고리의 다른 글
[SQLD] 데이터베이스 인덱스(Index) 왜 사용할까? (1) | 2023.11.24 |
---|---|
[SQLD] 조인(Join) 종류(3) - Full Outer, Natural, Cross 조인 (1) | 2023.11.23 |
[SQLD] 조인(Join) 종류(1) - Equi, Non-Equi, 카테시안곱 (1) | 2023.11.22 |
[SQLD] 함수의 종류 및 활용(문자함수, 숫자함수, 날짜함수, 분석함수, ALL, ANY) (2) | 2023.11.20 |
[SQLD] 데이터베이스 제약조건 및 형변환 (46) | 2023.11.17 |