2 분 소요

JOIN

조인은 여러 개의 릴레이션을 사용해서 새로운 릴레이션을 만드는 과정이다.

교집합 조인

두 개의 테이블 간에 일치하는 것을 조인한다.

교집합 조인에는 크게 ‘EQUI, INNER’ 두 가지 방법이 있다.

결과 값은 같으나 사용 방식에서 차이가 난다.

innerjoin

EQUI(등가) 조인

EQUI 조인은 비교할 테이블에서 공통된 칼럼을 이용하여 같은 것을 조인한다.

SELECT * FROM 테이블1,테이블2 Where 테이블1.칼럼 = 테이블2.칼럼;

SELECT * FROM 테이블1,테이블2 Where 테이블1.칼럼 = 테이블2.칼럼 AND 추가 조건;

INNER JOIN 과의 차이점은 실행 계획으로 알 수 있다.

EQUI JOIN은 테이블 전체를 읽은 다음 해시 함수를 사용해서 두 개의 테이블을 연결하는 방식이다.

해시 함수란 테이블을 해시 메모리에 적재한 후에 해시 함수로써 연결하는 방법이다.

해시 조인

  • 해시 조인은 선행 테이블을 결정하고 선행 테이블에서 주어진 조건에 해당하는 행을 선택한다
  • 행이 선택되면 조인 키를 기준으로 해시 함수를 사용해서 해시 테이블을 메인 메모리에 생성한다.
  • 후행 테이블에서 주어진 조건에 만족하는 행을 찾는다.
  • 후행 테이블의 조인 키를 사용해서 해시 함수를 적용하여 해당 버킷을 검색한다.

INNER JOIN

실제 SQL에서 가장 많은 비중으로 사용되는 조인이다.

EQUI와의 차이로는 WHERE 가 아닌 ON을 사용한다는 점이 있다.

SELECT * FROM 테이블1 INNER JOIN 테이블2 ON 테이블1.칼럼 = 테이블2.칼럼;

SELECT * FROM 테이블1 INNER JOIN 테이블2 ON 테이블1.칼럼 = 테이블2.칼럼 AND 추가 조건;

INTERSECT 연산

INTERSECT 연산은 교집합을 사용해서 데이터를 조회하는 것이 아닌 교집합만을 조회한다.

두 개의 테이블에서 공통된 값만을 찾는 것이다.

SELECT 칼럼a FROM 테이블1
INTERSECT
SELECT 칼럼b FROM 테이블2;

Non-EQUI (비등가) 조인

비등가 조인은 두 개의 테이블 간에 조인하는 경우 ‘=’가 아닌 다른 비교 연산자를 사용하는 것이다.

즉 비등가조인은 정확하게 일치하지 않는 것을 조인하는 것이다.

OUTER JOIN

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

왼쪽 테이블에만 있는 행도 포함시키면 LEFT OUTER JOIN ,

오른쪽 테이블에만 있는 행도 포함시면 RIGHT OUTER JOIN이다.

ORACLE DB에선 ‘(+)’ 기호를 사용해서 할 수 있다.

leftjoin

차집합 부분의 행의 경우 NULL 값이 나온다.

SELECT * FROM 테이블 1 LEFT OUTER JOIN 테이블2 ON 테이블1.칼럼= 테이블2.칼럼;

CROSS JOIN

CROSS JOIN은 조인 조건구 없이 2개의 테이블을 하나로 조인한다.

카테시안 곱이 발생한다.

SELECT * FROM 테이블1 CROSS JOIN 테이블2; 

crossjoin

UNION

UNION 연산은 두 개의 테이블을 하나로 만드는 연산이다.

즉 2개의 테이블을 하나로 합치는 것이다.

주의사항은 두 개의 테이블의 칼럼 수, 칼럼의 데이터 형식 모두가 일치해야 한다.

UNION 연산은 두 개의 테이블을 하나로합치면서 중복된 데이터를 제거한다.

그래서 UNION은 정렬 과정을 발생시킨다.

union

SELECT 칼럼명 FROM 테이블1 
UNION
SELECT 칼럼명 FROM 테이블2;

UNION ALL

UNION ALL은 중복이나 정렬을 하지 않고 모든 데이터를 합치는 것이다.

SELECT 칼럼명 FROM 테이블1 
UNION ALL
SELECT 칼럼명 FROM 테이블2;

MINUS

MINUS 연산은 두 개의 테이블에서 차집합을 조회한다.

먼저 쓴 SELECT문에는 있고 뒤에 쓴 SELECT문에는 없는 집합을 조회한다.

MS-SQL 에선 EXCEPT 라는 연산이 동일하게 작동한다.

minus

SELECT 칼럼명 FROM 테이블1 
MINUS
SELECT 칼럼명 FROM 테이블2;

댓글남기기