본문 바로가기
Database & Bigdata/SQLD

[SQLD] SQL 활용 - JOIN(조인)

by jionee 2020. 8. 21.
SMALL

 

 

<EQUI(등가) 조인(교집합)>

1. EQUI(등가) 조인

- 조인 : 여러 개의 릴레이션을 사용해 새로운 릴레이션을 만드는 과정

- 조인의 가장 기본은 교집합을 만드는 것 (두개의 테이블 간에 일치하는 것을 조인)

 

SELECT *
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO // '='로 두개의 테이블을 연결
	AND EMP.ENAME LIKE '임%'; // 조인문에 추가 조건 사용 가능

WHERE 테이블명1.컬럼명 = 테이블명2.컬럼명 ;

 

 

 

2. INNER JOIN

- ON문을 이용해 테이블을 연결

- 테이블 전체를 읽은 다음 해시 함수를 사용해 두 개의 테이블을 연결 (테이블을 해시 메모리에 적재한 후 해시 함수로써 연결하는 방법)

- 해시 조인은 EQUI 조인만 사용 가능

 

* 해시조인

1. 선행 테이블 결정 -> 주어진 조건(Where 구)에 해당하는 행 선택

2. 행이 선택되면 조인 키를 기준으로 해시 함수를 사용해 해시 테이블을 메인 메모리에 생성하고 후행 테이블에서 주어진 조건에 만족하는 행을 찾음

3. 후행 테이블의 조인 키를 사용해 해시 함수를 적용해 해당 버킷 검색

SELECT *
FROM EMP INNER JOIN DEPT  // 조인구로 테이블 정의
ON EMP.DEPTNO = DEPT.DEPTNO  // ON 구를 사용해서 조인 조건 넣기
AND EMP.ENAME LIKE '임%'; // 조인문에 추가 조건 사용 가능

FROM 테이블명1 INNER JOIN 테이블명2 ON 테이블명1.컬렴명 = 테이블명2.컬럼명;

 

 

 

3. INTERSECT(교집합) 연산

- 두개의 테이블에서 교집합을 조회

- 두개의 테이블에서 공통된 값을 조회 

SELECT DEPTNO FROM EMP 
INTERSECT
SELECT DEPTNO FROM DEPT;

SELECT 컬럼명 FROM 테이블명1

INTERSECT

SELECT 컬럼명 FROM 테이블명2;

 

 

 

< Non-EQUI(비등가) 조인 >

- 두 개의 테이블간에 조인하는 경우 '='을 사용하지 않고 '>', '<', '>=', '<=' 등을 사용한다

- Non-EQUI 조인은 정확하게 일치하지 않는 것을 조인하는 것

 

 

 

< OUTER JOIN >

- 두 개의 테이블간에 교집합을 조회하고 한쪽 테이블에만 있는 데이터도 포함시켜서 조회

- LEFT OUTER JOIN : 왼쪽 테이블에만 있는 행도 포함

- RIGHT OUTER JOIN : 오른쪽 테이블에만 있는 행도 포함

- FULL OUTER JOIN : LEFT OUTER JOIN과 RIGHT OUTER JOIN 모두를 하는 것

- Oracle 데이터베이스에서는 OUTER JOIN을 할 때 '+' 기호를 사용해서 할 수 있음 ( 대상 테이블에 (+) 붙이기)

 

SELECT *
FROM DEPT,EMP
WHERE EMP.DEPTNO (+)= DEPT.DEPTNO; // Oracle 데이터베이스 OUTER JOIN 방법

SELECT 컬럼명

FROM 테이블명1, 테이블명2

WHERE 테이블명1.컬럼명 (+) = 테이블명2.컬럼명;

 

* LEFT OUTER JOIN : 오른쪽에 (+) 기호 붙이기

* RIGHT OUTER JOIN : 왼쪽에 (+) 기호 붙이기

 

 

LEFT OUTER JOIN

- 두 개의 테이블에서 같은 것을 조회하고, 왼쪽 테이블에만 있는 것을 포함해서 조회

SELECT *
FROM DEPT LEFT OUTER JOIN EMP
ON EMP.DEPTNO = DEPT.DEPTNO // ANSI 표준 LEFT OUTER JOIN

SELECT 컬럼명

FROM 테이블명1 LEFT OUTER JOIN 테이블명2

ON 테이블명1.컬럼명 = 테이블명2.컬럼명

 

 

RIGHT OUTER JOIN

- 두 개의 테이블에서 같은 것을 조회하고, 오른쪽 테이블에만 있는 것을 포함해서 조회

SELECT *
FROM DEPT RIGHT OUTER JOIN EMP
ON EMP.DEPTNO = DEPT.DEPTNO // ANSI 표준 RIGHT OUTER JOIN

SELECT 컬럼명

FROM 테이블명1 RIGHT OUTER JOIN 테이블명2

ON 테이블명1.컬럼명 = 테이블명2.컬럼명

 

 

 

< CROSS JOIN >

- 조인 조건구 없이 2개의 테이블을 하나로 조인

- 조인구가 없기 때문에 카테시안 곱이 발생

ex) 10개 행 테이블과 6개 행 테이블을 조인하면 60개의 행이 조회됨

SELECT * FROM EMP CROSS JOIN DEPT;

SELECT 컬럼명

FROM 테이블명1 CROSS JOIN 테이블명2;

 

 

< UNION을 사용한 합집합 구현 >

1. UNION

- 두 개의 테이블을 하나로 만드는 연산

- 두 개의 테이블의 칼럼 수, 칼럼의 데이터 형식 모두가 일치해야함 ( 다르면 오류 발생)

- 두개의 테이블을 하나로 합치면서 중복된 데이터를 제거 (정렬 과정을 발생시킴)

SELECT DEPTNO FROM EMP
UNION
SELECT DEPTNO FROM EMP;

SELECT 컬럼명1 FROM 테이블명1

UNION

SELECT 컬럼명2 FROM 테이블명2;

 

 

2. UNION ALL

- 두개의 테이블을 하나로 합치는 것

- UNION 처럼 중복을 제거하거나 정렬을 유발하지 않음 (단순하게 테이블을 합치는 것)

SELECT DEPTNO FROM EMP
UNION ALL
SELECT DEPTNO FROM EMP;

SELECT 컬럼명1 FROM 테이블명1

UNION ALL

SELECT 컬럼명2 FROM 테이블명2;

 

 

< 차집합을 만드는 MINUS >

- 두개의 테이블에서 차집합을 조회

- 먼저 쓴 SELECT문에는 있고 뒤에쓰는 SELECT문에는 없는 집합을 조회 (SELECT 1 - SELECT2)

- MS-SQL에서는 MINUS와 동일한 연산이 EXCEPT(차집합)이다.

SELECT DEPTNO FROM DEPT
MINUS
SELECT DEPTNO FROM EMP;

SELECT 컬럼명1 FROM 테이블명1

MINUS

SELECT 컬럼명2 FROM 테이블명2;

 

 

댓글