이 글은 SQLD를 공부하며 조인(JOIN
)에 대해 정리한 글이다.
등가 조인(EQUI JOIN)
EQUI JOIN
- 조인은 여러 개의 릴레이션을 사용해서 새로운 릴레이션을 만드는 과정
- 조인의 가장 기본은 교집합을 만드는 것
- 두 개의 테이블 간에 일치하는 것을 조인
- EQUI JOIN은 STUDENT 테이블과 DEPT 테이블에서 DEPTNO 칼럼을 사용하여 같은 것을 조인함
SELECT * FROM STUDENT, DEPT
WHERE STUDENT.DEPTNO = DEPT.DEPTNO;
- EQUI JOIN은
=
을 사용해서 두 개의 테이블을 연결 - 조인문에 추가 조건 및 정렬을 할 수 있음 (
AND
,LIKE
,ORDER BY
사용)
INNER JOIN
- EQUI JOIN과 마찬가지로, ISO 표준 SQL로 INNER JOIN도 있음
INNER JOIN
은ON
문을 사용해서 테이블을 연결
SELECT * FROM STUDENT INNER JOIN DEPT
ON STUDENT.DEPTNO = DEPT.DEPTNO;
✔️ 해시 조인(HASH JOIN)
해시 조인은 EQUI JOIN만 사용 가능한 방법
1. 먼저 선행 테이블을 결정하고 선행 테이블에서 주어진 조건(WHERE구)에 해당하는 행을 선택
2. 행이 선택되면 조인 키(Join key)를 기준으로 해시 함수를 사용해서 해시 테이블을 메인 메모리에 생성하고 후행 테이블에서 주어진 조건에 만족하는 행을 찾음
3. 후행 테이블의 조인 키를 사용해서 해시 함수를 적용하여 해당 버킷을 검색
INTERSECT 연산
INTERSECT
연산은 두 개의 테이블에서 교집합을 조회- 두 개의 테이블에서 공통된 값을 조회하는 연산
SELECT DEPTNO FROM STUDENT
INTERSECT
SELECT DEPTNO FROM DEPT;
- (위 형태의 쿼리는 MySQL에서 지원하지 않음)
비등가 조인(Non-EQUI JOIN)
- Non-EQUI JOIN은 두 개의 테이블 간의 조인하는 경우,
=
을 사용하지 않고<
.<=
,>
,>=
등을 사용 - 정확하게 일치하지 않는 것을 조인하는 것
OUTER JOIN
- OUTER JOIN은 두 개의 테이블 간에 교집합을 조회하고, 한쪽 테이블에만 있는 데이터도 포함시켜 조회함
- 왼쪽 테이블에만 있는 행도 포함하면 LEFT OUTER JOIN이라고 하며, 오른쪽 테이블의 행만 포함시키면 RIGHT OUTER JOIN이라고 함
- FULL OUTER JOIN은 LEFT OUTER JOIN과 RIGHT OUTER JOIN 모두 하는 것을 의미
- Oracle 데이터베이스에서는
(+)
기호를 사용해서 OUTER JOIN을 할 수 있음
SELECT * FROM DEPT, STUDENT
WHERE STUDENT.DEPTNO (+)= DEPT.DEPTNO;
- (위 쿼리는 Oracle 데이터베이스에서만 동작)
LEFT OUTER JOIN 쿼리
SELECT * FROM DEPT LEFT OUTER JOIN STUDENT
ON STUDENT.DEPTNO = DEPT.DEPTNO;
RIGHT OUTER JOIN 쿼리
SELECT * FROM DEPT RIGHT OUTER JOIN STUDENT
ON STUDENT.DEPTNO = DEPT.DEPTNO;
CROSS JOIN
- CROSS JOIN은 조인 조건구 없이 2개의 테이블을 하나로 조인함
- 조인구가 없기 때문에 카테시안 곱이 발생
- CROSS JOIN은
FROM
절에CROSS JOIN
구를 사용하면 됨
SELECT * FROM STUDENT CROSS JOIN DEPT;
- STUDENT 테이블은 총 5개의 행을 가지고 있고, DEPT 테이블은 4개의 행을 가지고 있기 때문에
CROSS JOIN
을 하면 총 20개의 행이 조회됨
✔️ 카테시안 곱(Cartesian product, 데카르트 곱, 곱집합)
- 집합론에서 카테시안 곱은 각 집합의 원소를 각 성분으로 하는 튜플들의 집합을 의미
- 14개의 행이 있는 테이블과 4개의 행이 있는 테이블을 CROSS JOIN하면 56개의 행이 조회됨
UNION을 이용한 합집합
UNION
UNION
연산은 두 개의 테이블을 하나로 만드는 연산- 두 개의 테이블의 칼럼 수, 칼럼의 데이터 형식 모두가 일치해야
UNION
연산이 가능- 만약
UNION
연산을 하는데 칼럼 수 혹은 데이터 형식이 다르면 오류가 발생함
- 만약
- 두 개의 테이블을 하나로 합치면서 중복된 데이터를 제거함
UNION
연산은 정렬 과정을 발생시킴
UNION ALL
UNION ALL
연산은 두 개의 테이블을 하나로 만드는 연산- 단,
UNION
연산과 달리 중복을 제거하거나 정렬을 유발하지 않음
MINUS를 이용한 차집합
MINUS
연산은 두 개의 테이블에서 차집합을 조회함- 먼저 쓴
SELECT
문에는 있고, 뒤에 쓰는SELECT
문에는 없는 집합을 조회하는 것 - MS-SQL에서는
EXCEPT
연산이MINUS
연산과 동일한 동작을 함
- 먼저 쓴
SELECT DEPTNO FROM DEPT
MINUS
SELECT DEPTNO FROM STUDENT;
- (MySQL에서는 지원하지 않는 쿼리 형식)
Reference
1. 2024 이기적 SQL 개발자 이론서 + 기출문제 / https://product.kyobobook.co.kr/detail/S000212055970
2024 이기적 SQL 개발자 이론서+기출문제 | 임호진 - 교보문고
2024 이기적 SQL 개발자 이론서+기출문제 | 본 도서는 SQL 개발자 시험 경향을 분석하여 수험생들이 혼자서도 학습할 수 있도록 한 완벽 대비서로서, 시행처인 한국데이터산업진흥원에서 공개한 202
product.kyobobook.co.kr
'Data Science > SQL' 카테고리의 다른 글
SQLD | SQL 활용 - 그룹 함수(Group Function) (0) | 2024.03.03 |
---|---|
SQLD | SQL 활용 - 서브쿼리(Subquery) (0) | 2024.03.02 |
SQLD | SQL 기본 - DECODE문, CASE문, 그리고 WITH구문 (0) | 2024.03.02 |
SQLD | SQL 기본 - GROUP 연산과 SELECT문 실행 순서 (0) | 2024.03.02 |
SQLD | SQL 기본 - NULL의 특징과 NULL 값 조회 (2) | 2024.03.01 |