본문 바로가기

프로그래밍/SQL

[SQL 요약 정리] 1-6. JOIN

6. JOIN


1) JOIN이란?

- 하나 이상의 테이블로부터 연관 데이터를 검색하는 방법

- 일반적으로 행들은 PK와 FK 값의 연관에 의해 JOIN 성립(예외 존재->논리값 간의 연관성)

- 정규화: 데이터 중복 제거를 위해 테이블을 분리

- JOIN은 정규화된 데이터를 다시 결합하는 과정

- JOIN방법

EQUIJOIN: 칼럼간의 값들이 정확히 일치하는 경우에 사용 (일반적으로 PK, FK 관계에 의함)

NON-EQUIJOIN: 칼럼간의 값들이 정확히 일치하지 않는 경우에 사용

OUTER JOIN: JOIN조건에 만족하지 않지만 모든 행 출력을 위해 사용

SELF JOIN: 같은 테이블에 있는 행들을 JOIN하고자하는 경우에 사용

*Cartesian product: 조건 생략 혹은 실수로 인해 테이블의 모든 행들이 JOIN되는 경우


2) EQUIJOIN

- 칼럼값들이 = 연산자를 사용해서 정확하는 일치하는 경우에 JOIN하는 방법

- 만약 하나 이상의 테이블에서 같은 컬럼이 나타나면 반드시 테이블명을 적어준다.

- JOIN을 위한 테이블이 N개라면 조건은 최소 N-1개 이상 필수

- 예시

SELECT 테이블.칼럼명, 테이블명.칼럼명 ,... // 데이터의 출처

FROM 테이블1, 테이블2

WHERE 테이블1.칼럼1 = 테이블2.칼럼2; // 논리적인 연결이 되는 두 칼럼 간의 조건 기술


3) 칼럼과 테이블의 ALIAS 사용

- 테이블명에 ALIAS를 지정해서 간편하게 사용

- 예시

SELECT e.name 사원명, e.dept_id, d.name 부서명

FROM s_emp e, s_dept d

WHERE e.dept_id = d.id;


4) NON-EQUIJOIN

- 칼럼값이 일치하지 않는 경우 =가 아닌 다른 연산자를 이용해서 JOIN하는 방법

                                                                                                                                                                                                                                                                    - 예시

SELECT e.name, e.salary, g.grade 급여동급

FROM s_emp e, salgrade g

WHERE e.salary BETWEEN g.losal AND g.hisal;


5) OUTER JOIN

- JOIN조건에 만족하지 않지만 모든 행 출력을 위해 사용( (+) 연산자 사용)

- (+) 의 위치는 WHERE절에서 = 연산자 좌우 중 JOIN할 데이터가 부족한 쪽(IN, OR 불가)

- 예시

SELECT e.name 사원명, e.id, c.name 고객명

FROM s_emp e, s_customer c

WHERE e.id (+) = c.sales_rep_id

ORDER BY 2;


6) SELF JOIN

- 하나의 테이블을 여러개처럼 사용 가능(횟수제한 없음)

- 칼럼명 앞에 테이블 ALIAS 지정 필수(ALIAS명 각각 다르게)

- 예시

SELECT w.id 사번, w.name 사원명, m.id 부서장사번, m.name 부서장명

FROM s_emp w, s_emp m

WHERE w.manager_id = m.id;


7) SET 연산자

- 두 SELECT 구문의 칼럼 개수와 타입 일치 필수(FROM절 이후로는 무관)

- 칼럼의 HEADING은 첫 번째 SELECT 구문의 컬럼명 출력

- ORDER BY절은 마지막에 한 번만 기술

- 종류

UNION: 각 QUERY 결과의 합집합 - 교집합

UNION ALL: 각 QUERY 결과의 합집합 + 교집합

INTERSECT: 각 QUERY 결과의 교집합

MINUS: 첫 번째 QUERY결과와 두 번째 QUERY결과의 차집합

- 문형

SELECT 칼럼1, 칼럼2...

FROM 테이블1 ...

SET연산자

SELECT 칼럼1', 칼럼2'...

FROM 테이블2...

ORDER BY;

- 예시

SELECT name, dept_id, title

FROM s_emp

WHERE dept_id = 110

UNION

SELECT name, dept_id, title

FROM s_emp

WHERE dept_id = 113

ORDER BY 1;