들어가기 전에
이 포스팅은 오라클로 배우는 데이터베이스 입문(이지훈 저)을 읽으면서 기억하고자 하는 내용 및 추가적으로 알아본 내용을 담았습니다. 책 전체 내용을 보시고 싶으신 분은 책을 구매하시어 읽어보시길 바랍니다.
조인(join)
조인과 집합 연산자 차이
조인은 두 개 이상의 테이블을 연결하여 하나의 테이블처럼 출력할 때 사용합니다. 앞서 배웠던 집합 연산자 역시, 두 개 이상의 테이블을 연결해서 출력한다는 점에서 조인과 집합 연산자는 비슷합니다.
다만, 집합 연산자를 사용한 결과는 두 개 이상의 SELECT
문을 통해 결과 값을 세로로 연결한 것이라면 조인은 두 개 이상의 테이블 데이터를 가로로 연결했다는 점이 서로 다릅니다.
데카르트 곱(카세디안 곱, Cartesian product)
각 집합을 이루는 모든 원소의 순서쌍을 데카르트 곱이라고 합니다. 여러 테이블을 연결할 때에, 제대로 조건을 걸지 않으면 서로 연관되지 않은 레코드가 연결되어 불필요한 데이터까지 출력되게 됩니다.
- 위 출력 예시를 보면
EMPNO
가7369
인SMITH
의DEPTNO
는20
인데, 연결된DEPT
테이블의DEPTNO
가20
이 아닌 항목들도 존재합니다. - 실제로 사원별로 각각 하나의 레코드만 나오면 되는데 불필요한 레코드들까지 모두 조회되었습니다.
등가 조인(equi join) = 내부 조인(inner join) = 단순 조인(simple join)
등가 조인은 테이블을 연결한 후에 출력 행을 각 테이블의 특정 열에 일치한 데이터를 기준으로 선정하는 방식입니다. 일반적으로 가장 많이 사용되는 조인 방식입니다. 등가 조인은 내부 조인이라고도 불리며, 내부 조인이란 조인 조건에 해당하는 데이터가 존재할 경우에만 출력하는 조인을 의미합니다.
조인 테이블 개수와 조건식 개수의 관계
조인 조건을 제대로 지정하지 않으면 데카르트 곱 때문에 정확히 연결되지 않아 불필요한 데이터까지 출력될 수 있습니다. 기본적으로, 데카르트 곱 현상이 일어나지 않기 위해서 필요한 조건식의 최소 개수는 조인 테이블 개수에서 하나를 뺀 값입니다.
예를 들어, A
와 B
, C
테이블을 조인할 경우 최소 2개의 조건식이 필요하며 이는 A
와 B
를 연결해줄 열 하나와 A
와 B
가 연결된 상태에서 C를 연결해 줄 열 하나가 더 필요합니다.
비등가 조인(non-equi join)
비등가 조인은 등가 조인 방식 외의 방식을 의미합니다.
예를 들어, 아래와 같이 사원 정보가 들어있는 EMP 테이블과 급여 등급이 들어있는 SALGRADE 테이블이 있다면, 이 두 테이블은 사용하는 열의 일치 여부를 기준으로 조인(등가 조인)할 수 없습니다.
- 사원의 급여는
SALGRADE
테이블의 특정 등급의LOW
~HIGH
사이에 들어오는지 여부를 이용해 결합해야 합니다.
자체 조인 = 내부 조인(inner join)
자체 조인은 하나의 테이블을 여러 개의 테이블처럼 활용하는 조인 방식을 의미합니다. 자체 조인은 하나의 테이블을 여러 번 연결해야 할 때 사용하면 되며, 각 테이블의 별칭을 서로 다르게 지정하여 사용하면 됩니다. 자체 조인 역시, 조인 조건에 해당하는 데이터가 존재할 경우에만 출력하기 때문에 내부 조인이라고도 합니다.
예를 들어, 사원의 사번과 이름 그리고 사원의 상사의 사번과 이름을 하나의 레코드로 출력하고자 한다고 가정합니다. 이 때, 사원 테이블인 EMP
테이블은 아래와 같은 구조이기 때문에 EMP
테이블을 조인해야 합니다.
WHERE 절
에서E1.MGR = E2.EMPNO
이라는 조건을 사용하였기 때문에E1.MGR
이NULL
인 경우(E1.ENAME
이KING
인 경우) 결과에서 제외되었습니다(NULL
은 동등 비교가 불가능함).- 이렇게 한쪽의 데이터가
NULL
인 경우에도 출력을 하고자 한다면 외부 조인을 해야 합니다.
- 이렇게 한쪽의 데이터가
외부 조인(outer join)
앞서 자체 조인의 예시에서 사원 이름이 KING인 경우 상사가 존재하지 않아(NULL
) 결과에 출력되지 않았습니다. 이러한 레코드 역시 출력하기 위해서는, 두 테이블 간 조인 수행에서 조인 기준 열의 어느 한쪽이 NULL
이어도 강제로 출력해야 하며, 이러한 조인 방식을 외부 조인이라고 합니다. 외부 조인은 조인 기준 열의 NULL
을 처리하는 것을 목적으로 자주 사용되는 조인 방식입니다.
외부 조인은 좌우를 따로 나누어 지정하며, WHERE 절
에 조인 기준 열 중 한쪽에 (+
) 기호를 붙여 어느쪽 외부 조인인지 지정합니다.
왼쪽 외부 조인(left outer join) | WHERE TABLE1.COL1 = TABLE2.COL1(+) |
---|---|
오른쪽 외부 조인(right outer join) | WHERE TABLE1.COL1(+) = TABLE2.COL1 |
- 왼쪽 외부 조인(
left outer join
): 왼쪽 열을 기준으로 오른쪽 열의 데이터 존재 여부에 상관 없이 출력- 왼쪽 열을 기준으로 오른쪽 열 데이터 유무 상관없이 출력되는 것이므로, E1의 레코드로 KING이 들어왔을 때, KING의 상관이 존재하지 않아도 9열에 출력되었습니다.
- 오른쪽 외부 조인(
right outer join
): 오른쪽 열을 기준으로 왼쪽 열의 데이터 존재 여부에 상관 없이 출력- 오른쪽 열을 기준으로 왼쪽 열 데이터 유무 상관없이 출력하는 것이므로, 상관으로서 존재하지 않는 사원들에 대해 14행부터 출력되었습니다.
앞서 배운 조인들과 기능은 같지만, SQL-99 표준 문법이 나옴에 따라 문법을 다르게 사용할 수 있는 경우가 있어 그러한 조인들에 대해 알아보도록 하겠습니다.
NATURAL JOIN(등가 조인 대신 사용 가능)
FROM TABLE1 NATURAL JOIN TABLE2
NATURAL JOIN
은 위에서 배운 등가 조인을 대신해 사용할 수 있는 조인 방식으로, 조인 대상이 되는 두 테이블의 이름과 자료형이 같은 열을 찾은 후 그 열을 기준으로 등가 조인을 해 줍니다.
- 앞서 보았던 등가 조인은
WHERE 절
에 조건을 작성하여 조인을 하였다면,NATURAL JOIN
은FROM 절
에 조인 키워드를 넣어 사용합니다. EMP
테이블과DEPT
테이블 모두 동일한 자료형와 이름을 가진DEPTNO
컬럼이 있어 해당 컬럼을 기준으로 등가 조인이 이루어집니다.NATURAL JOIN
에서는, 기존 등가 조인과 다르게 기준이 되는DEPTNO
컬럼에 대해 테이블 이름을 붙이면 안됩니다.
JOIN ~ USING(등가 조인 대신 사용 가능)
FROM TABLE1 JOIN TABLE2 USING ([조인에 사용할 기준열])
NATURAL JOIN
과 마찬가지로 JOIN ~ USING
키워드를 사용한 조인 역시 등가 조인을 대신하는 조인 방식입니다.
NATURAL JOIN
과 마찬가지로JOIN ~ USING
키워드 조인 역시FROM 절
에 조인 키워드를 넣어 사용합니다.JOIN ~ USING
키워드를 이용한 조인은NATURAL JOIN
과 달리, 조인에 사용할 기준열을 명시해주어야 합니다.JOIN ~ USING
키워드를 이용한 조인은NATURAL JOIN
과 마찬가지로 기준이 되는 컬럼에 대해 테이블 이름을 붙이면 안됩니다.
JOIN ~ ON
FROM TABLE1 JOIN TABLE2 ON ([조인 조건식])
JOIN ~ ON
키워드를 통한 조인은 가장 범용성 있는 조인으로, 기존에 WHERE 절
에 작성하였던 조인용 조건을 FROM 절
의 ON
키워드에 명시합니다.
JOIN ~ ON
키워드를 통한 조인은 기존에WHERE 절
에 작성하였던 조인용 조건을FROM 절
의ON
키워드 옆에 작성하기 때문에, 기준이 되는 컬럼을 명시할 때에 어떤 테이블의 컬럼인지 작성해주어야 합니다.DEPTNO
컬럼의 경우EMP
테이블과DEPT
테이블 모두에 존재하여 어느 테이블의 컬럼인지 명시해주어야 합니다.
OUTER JOIN
OUTER JOIN
키워드는 외부 조인에 사용합니다. 기존 외부 조인은 WHERE 절
에 조인 조건을 작성했지만, OUTER JOIN
키워드는 FROM 절
에 외부 조인을 선언합니다.
왼쪽 외부 조인(left outer join) | 기존 | WHERE TABLE1.COL1 = TABLE2.COL1(+) |
SQL-99 | FROM TABLE1 LEFT OUTER JOIN TABLE2 ON ([조인 조건식]) | |
오른쪽 외부 조인 (right outer join) | 기존 | WHERE TABLE1.COL1(+) = TABLE2.COL1 |
SQL-99 | FROM TABLE1 RIGHT OUTER JOIN TABLE2 ON ([조인 조건식]) | |
전체 외부 조인 (full outer join) | 기존 | 기본 문법은 없으며, UNION 집합 연산자로 사용 가능 |
SQL-99 | FROM TABLE1 FULL OUTER JOIN TABLE2 ON ([조인 조건식]) |
SQL-99 방식에서 세 개 이상의 테이블에 조인 작성하는 방법(FROM 절에 세 개 이상의 테이블 조인 방법)
FROM TABLE1 JOIN TABLE2 ON ([조건식1])
JOIN TABLE3 ON ([조건식2])
FROM 절
에 세 개 이상의 테이블 조인은 위와 같이 앞선 조인 구문 옆으로JOIN
을 바로 적어서 다음 조인 구문을 작성하면 됩니다.
참고 자료
- 오라클로 배우는 데이터베이스 입문(이지훈 저)
'DB > Oracle' 카테고리의 다른 글
[Oracle, macOS] 오라클 튜닝 에센셜 실습 환경 구성하기 (0) | 2022.05.22 |
---|---|
[Oracle] 데이터를 추가/수정/삭제하는 데이터 조작어(DML) (0) | 2022.05.09 |
[Oracle] Oracle Function(오라클 함수) - GROUP BY절, HAVING절, 기타 그룹화 관련 함수 (0) | 2022.05.08 |
[Oracle] Oracle Function(오라클 함수) - 다중행 함수(집계 함수) (0) | 2022.05.08 |
[Oracle] Oracle Function(오라클 함수) - DECODE 함수와 CASE문 (0) | 2022.05.08 |