JOIN
JOIN
조인은 여러 개의 릴레이션을 사용해서 새로운 릴레이션을 만드는 과정이다.
교집합 조인
두 개의 테이블 간에 일치하는 것을 조인한다.
교집합 조인에는 크게 ‘EQUI, INNER’ 두 가지 방법이 있다.
결과 값은 같으나 사용 방식에서 차이가 난다.
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에선 ‘(+)’ 기호를 사용해서 할 수 있다.
차집합 부분의 행의 경우 NULL 값이 나온다.
SELECT * FROM 테이블 1 LEFT OUTER JOIN 테이블2 ON 테이블1.칼럼= 테이블2.칼럼;
CROSS JOIN
CROSS JOIN은 조인 조건구 없이 2개의 테이블을 하나로 조인한다.
카테시안 곱이 발생한다.
SELECT * FROM 테이블1 CROSS JOIN 테이블2;
UNION
UNION 연산은 두 개의 테이블을 하나로 만드는 연산이다.
즉 2개의 테이블을 하나로 합치는 것이다.
주의사항은 두 개의 테이블의 칼럼 수, 칼럼의 데이터 형식 모두가 일치해야 한다.
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 라는 연산이 동일하게 작동한다.
SELECT 칼럼명 FROM 테이블1
MINUS
SELECT 칼럼명 FROM 테이블2;
댓글남기기