[SQL] 조인(JOIN)
조인 개념
조인은 테이블간의 결합을 의미한다. 즉, 2개 이상의 테이블을 결합하여 데이터를 출력할 때 조인을 활용한다. 조인은 크게 오라클 조인과 안시조인(표준)이 있으며, 오라클 조인은 오라클DB에서만 사용가능하고 안시조인(표준)은 모든 벤더사 DB에서 사용가능하다.
조인 방법
조인에는 여러가지 방법이 있으며, 각 방법이 오라클 조인과 안시조인(표준)에서 어떻게 작성되는지 살펴보자. 방법의 종류는 다음과 같다.
- EQUI JOIN (등가조인)
- Non EQUI JOIN (비등가조인)
- INNER JOIN (내부조인)
- OUTER JOIN (외부조인)
- NATURAL JOIN
- CROSS JOIN
EQUI JOIN
EQUI JOIN(등가)은 두 개의 테이블 간에 컬럼 값들이 서로 정확하게 일치하는 경우에 사용되는 방법으로 대부분 PK <-> FK의 관계를 기반으로 한다. 그러나 일반적으로 테이블 설계 시에 나타난 PK <-> FK의 관계를 이용하는 것이지, 반드시 PK <-> FK의 관계로만 EQUI JOIN이 성립하는 것은 아니다. 이 기능은 계층형이나 망형 DB와 비교해서 관계형 DB의 큰 장점이다. JOIN의 조건은 WHERE절에 기술하게 되는데 “=” 연산자를 사용해서 표현한다.
사용법
- 오라클
1
2
3
4
-- WHERE절에 JOIN 조건을 기술한다.
SELECT 테이블1.컬럼명, 테이블2.컬럼명, ...
FROM 테이블1, 테이블2
WHERE 테이블2.컬럼명 = 테이블1.컬럼명;
- ANSI/ISO
1
2
3
4
-- ON절에 JOIN 조건을 기술한다.
SELECT 테이블1.컬럼명, 테이블2.컬럼명, ...
FROM 테이블1 INNER JOIN 테이블2
ON 테이블2.컬럼명 = 테이블1.컬럼명;
예제
예제에 사용되는 릴레이션은 아래와 같다.
- 쿼리
1
2
3
4
5
-- 오라클
SELECT A.ENAME AS ENAME
, B.DNAME AS DNAME
FROM EMP A, DEPT B
WHERE B.DEPTNO = A.DEPTNO;
1
2
3
4
5
6
-- ANSI/ISO
SELECT A.ENAME AS ENAME
, B.DNAME AS DNAME
FROM EMP A
INNER JOIN DEPT B
ON B.DEPTNO = A.DEPTNO;
- 결과
Non EQUI JOIN
Non EQUI JOIN(비등가)은 두개의 테이블 간에 논리적인 연관 관계를 갖고 있으나, 컬럼 값들이 서로 일치하지 않는 경우에 사용된다. Non EQUI JOIN의 경우에는 “=” 연산자가 아닌 다른 (Between, > ,>=, <, <= 등) 연산자들을 사용해 JOIN을 수행한다. 두개의 테이블이 PK-FK로 연관관계를 갖거나 논리적으로 같은 값이 존재하는 경우에는 “=” 연산자를 이용해 EQUI JOIN을 사용한다. 그러나 두 테이블 간에 컬럼 값들이 서로 정확하게 일치하지 않는 경우에는 EQUI JOIN을 사용할 수 없다. 이런 경우 Non EQUI JOIN을 시도할 수 있으나 데이터 모델에 따라서 Non EUQI JOIN이 불가능한 경우도 있다.
사용법
아래 BETWEEN JOIN 조건은 Non EQUI JOIN의 한 사례일 뿐이다.
1
2
3
SELECT 테이블1.컬럼명, 테이블2.컬럼명 ...
FROM 테이블1, 테이블2
WHERE 테이블1.컬럼명 BETWEEN 테이블2.컬럼명1 AND 테이블2.컬럼명2;
예제
예제에 사용되는 릴레이션은 아래와 같다.
- 쿼리
1
2
3
4
5
6
7
-- 오라클
SELECT A.ENAME
, A.JOB
, A.SAL
, B.GRADE
FROM EMP A, SALGRADE B
WHERE A.SAL BETWEEN B.LOSAL AND B.HISAL;
- 결과
OUTER JOIN
앞서 다룬 EQUI JOIN, Non EQUI JOIN은 모두 조인 조건의 결과가 참인 행들만 반환하는 INNER JOIN이다. OUTER JOIN은 조인 조건을 만족하지 않는 행들도 함께 반환할 때 사용한다.
사용법
1
2
3
4
-- 오라클
SELECT 테이블1.컬럼명, 테이블2.컬럼명, ...
FROM 테이블1, 테이블2
WHERE 테이블2.컬럼명(+) = 테이블1.컬럼명;
1
2
3
4
-- ANSI/ISO
SELECT 테이블1.컬럼명, 테이블2.컬럼명, ...
FROM 테이블1 LEFT OUTER JOIN 테이블2
ON 테이블2.컬럼명 = 테이블1.컬럼명;
예제
예제에 사용되는 릴레이션은 아래와 같다.
- 쿼리
1
2
3
4
-- 오라클
SELECT A.EMPNO, B.DEPTNO
FROM EMP A, DEPT B
WHERE A.DEPTNO = B.DEPTNO(+);
1
2
3
4
5
6
-- ANSI/ISO
SELECT A.EMPNO
, B.DEPTNO
FROM EMP A
LEFT OUTER JOIN DEPT B
ON A.DEPTNO = B.DEPTNO;
- 결과
읽어주셔서 감사합니다. 😊
Reference
SQL 전문가 가이드 - Kdata 한국데이터산업진흥원






