이번 포스팅에서는 SQL의 핵심적인 문법이라고 할 수 있는 JOIN에 대해 다뤄보고자 한다.
조인이란 무엇일까?

JOIN
- DB에서 2개 이상의 테이블을 연결하여 하나의 테이블로 합치는 것
- 데이터를 효율적으로 검색하고 처리하는데 도움을 줌
- 여러 종류의 JOIN 존재
- 등가 조인,비등가 조인, 자체 조인, 외부 조인 등
등가 조인
- 테이블을 연결한 후에 출력 행을 각 테이블의 특정 열과 일치한 데이터를 기준으로 선정하는 방식
- 내부 조인(inner join) 또는 단순 조인으로 불리기도 함
- 가장 많이 사용되는 조인 방식으로, 코드 작성시 join만 쓰면 자동으로 등가조인으로 인식함
- 등가 조인을 할 수 있는 여러 가지 방식 존재 → 아래 예제들로 다루어 볼 것이다.
예)
EMP 테이블과 DEPT 테이블은 DEPTNO 열이 같은 조건으로 조인을 할 수 있다.
주의) 조인을 한 후에 가져올 열을 작성할 때, DEPTNO의 경우는 EMP 테이블과 DEPT 테이블에 모두 존재를 하므로 →
어느 테이블의 DEPTNO열을 가지고 올 것인지 명시를 해주어야 오류가 나지 않는다.
왼쪽의 코드는 등가 조인을 사용한 예시이다.
맨 윗 줄의 select를 보면, 열을 추출할 때 어떤 테이블에서 추출하는지 반드시 명시를 해주어야 한다.
맨 아랫 줄의 정렬은
dept 테이블의 deptno를 기준으로 정렬한 후,
emp 테이블의 empno를 기준으로 정렬한다는 뜻으로, deptno가 같을 때, empno기준으로 정렬된다.
왼쪽의 사진은 등가 조인을 하는 또 다른 방법을 사용한 것이다.
위의 예시와 달리,
inner join을 명시적으로 작성하고
on에 join 조건을 작성하는 방법이다.
(이때, inner는 생략이 가능하다.)
where에는 join 조건이 아닌
일반 조건을 작성해야된다는 것에 주의할 것!
위의 예시는 이름이 ‘FORD’인 사원의 이름과 부서명 조회하는 질의를 작성한 코드이다.
inner join을 사용하였는데, inner join의 조건이 두 테이블의 공통 컬럼일 경우에는 USING절을 사용할 수 있다.
USING절을 사용하면, 조인 조건을 따로 안적어도 되므로 코드가 간결해지는 장점이 있다.
SELECT~ FROM~JOIN~ USING(칼럼명)~WHERE~
여기서, USING절에 컬럼명을 작성할 때 반드시 괄호를 써주어야 된다.
예시2)
CLASS_REQUEST 테이블이 STUDENT테이블과 CLASS테이블과 조인
→ JOIN을 그냥 두번 쓰면 된다.
from 테이블1 join 테이블 2 ~ join 테이블3 → 여기서 테이블3은 테이블1과 조인됨
비등가 조인
- 등가 조인 방식 외의 모든 조인 방식
- 조건에 =가 없다!
- 조건으로는 보통 between을 사용하여 범위를 만족하는 조건을 적용한다.
비등가 조인 예시
셀프 조인
- 자신의 테이블을 조인하는 방식
- 동일 테이블 사이의 조인을 수행하면 테이블과 칼럼 이름이 모두 동일하므로 식별을 위해 별칭 필수 사용
- 거의 사용되지X
자신의 테이블을 조인하는데
자신 테이블의 별칭을 e1, e2로 따로 지정하였다.
각 사원의 이름과 해당 사원의 매니저를 출력
외부 조인(OUTER JOIN)
- 테이블 조인 조건 데이터 중, 어느 한쪽의 데이터가 없어도(NULL) 결과를 출력할 때 포함시켜 출력하는 방식
- 만약 왼쪽 열의 데이터 중 일부가 null이어도 왼쪽열 모두 다 출력 → LEFT OUTER JOIN
- 만약 오른쪽 열의 데이터 중 일부가 null이어도 오른쪽 열 모두 다 출력 → RIGHT OUTER JOIN
- 만약 양쪽 열의 데이터 중 일부가 null이어도 양쪽 모두 다 출력 → FULL OUTER JOIN
왼쪽은 RIGHT OUTER JOIN을 사용한 예시이다.
emp e를 RIGHT OUTER JOIN을 걸었기 때문에
13행을 보면, e.ename의 값이 없는데도 출력된 것을 알 수 있다.
테이블1 LEFT OUTER JOIN 테이블2 ~
테이블2 RIGHT OUTER JOIN 테이블1 ~
위 아래 결과 같음
LEFT OUTER JOIN은 왼쪽에 있는 테이블1이 싹 다 나오는 것이고, RIGHT OUTER JOIN은 오른쪽에 있는 테이블1이 싹 다 나오는 것이므로 동일한 출력이 나오게 된다.
LEFT OUTER JOIN ~ UNION RIGHT OUTER JOIN~ → FULL OUTER JOIN
NATURAL 조인
- 등가 조인을 대신해 사용할 수 있는 조인 방식
- 두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 등가 조인을 수행
- (조인 대상이 되는 두 테이블에 이름과 자료형이 같은 열을 찾은 후, 그 열을 기준으로 등가 조인)
- ON 조건절, USING조건절, WHERE 조건절에서 JOIN 조건 정의 불가능
예시)
- EMP와 DEPT 테이블 모두 DEPTNO 컬럼을 가지고 있으므로, NATURAL JOIN을 하면 자동으로 DEPTNO 열을 기준으로 등가 조인 수행
- 테이블 별칭 지정 불가능
- 기존 등가 조인과 다르게 조인 기준 열인 DEPTNO를 SELECT 절에 명시할 때, 테이블 이름을 붙이면 안 됨
CROSS JOIN
- JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합을 조회
- INNER JOIN과 마찬가지로 앞에 CROSS를 생략할 수 있음
그럼 어떻게 INNER JOIN인지 CROSS JOIN인지 알 수 있을까?
INNER JOIN시. 반드시 ON절이나 USING절을 통해서 조인 조건을 작성하거나 조건을 작성하지 않을 경우는 NATURAL 조인이라고 써있다.(공통칼럼이 있다는 전제하에)
그렇기 때문에, 만약 아무것도 써있지 않다면 => CROSS JOIN으로 인식!
참고
'SQL기초' 카테고리의 다른 글
SQL기초7 - 그룹 함수 & 윈도우 함수 (0) | 2022.07.20 |
---|---|
SQL기초6 - 서브쿼리 (0) | 2022.07.20 |
SQL 기초4- 집합연산 (0) | 2022.07.07 |
SQL 기초3- 기본 함수 (0) | 2022.07.05 |
SQL 기초2- 기본 문법 (0) | 2022.07.05 |