2개이상의 테이블들을 연결고리로 관계를 맺고 데이터를 추출하는것.
Inner join
의 상대개념이 Outer join
이다.
Cross join
은 ANSI SQL을 사용한것이며, Catasian join
은 일반 SQL을 사용한것이다.
예시에 사용될 테이블은 아래와 같다.
where절에서 등호 연산자 =
를 사용해서 2개 이상의 테이블이나 뷰를 연결하는 방법.
두 테이블에서 공통된 값을 가진 컬럼을 등호 연산자 =
로 연결해서 조인 조건을 일치 시킨다.
SELECT a.employee_id, a.emp_name, a.department_id, b.department_name
FROM employees a, departments b
WHERE a.department_id = b.department_id;
공통적으로 갖고있는 department_id 컬럼을 등호연산자
=
를 사용해서 조회 조건에 명시했다.
기존의 문법과는 다른 ANSI SQL 문법
을 사용한 조인을 의미.
ANSI 조인에서는 join 조건이 FROM 절에 들어간다.
SELECT a.employee_id, a.emp_name, a.department_id, b.department_name
FROM employees a, departments b
WHERE a.department_id = b.department_id; // join 조건
SELECT a.employee_id, a.emp_name, a.department_id, b.department_name
FROM employees a
INNER JOIN departments b
ON (a.department_id = b.department_id); // join 조건
서브 쿼리를 사용해서 서브 쿼리에 존재하는 데이터를
메인 쿼리에서 IN
, EXISTS
연산자를 사용하여 추출하는 방법.
예를 들어 서브 쿼리에 있는 테이블을 B, 메인 쿼리에 사용된 테이블을 A라고 가정한다면
세미 조인은 서브쿼리 B테이블에 존재하는 메인 쿼리 A테이블의 데이터를 추출하는 것이다.
세미 조인은 서브 쿼리에 존재하는 메인 쿼리 데이터가 중복해서 존재하더라도 최종 반환되는 데이터에는 중복되는 건이 없다. (일반 조인의 경우에는 중복 데이터가 반환된다)
EXISTS
연산자를 사용한 Semi join 예시SELECT department_id, department_name
FROM departments a
WHERE EXISTS(SELECT *
FROM employees b
WHERE a.department_id = b.department_id
AND b.salary > 3000)
ORDER BY a.department_name;
서브 쿼리에 있는 employees 테이블에 존재하는 departments의 데이터를 추출한다.
IN
연산자를 사용한 Semi join 예시SELECT department_id, department_name
FROM departments a
WHERE a.department_id IN(SELECT b.department_id
FROM employees b
WHERE b.salary > 3000)
ORDER BY department_name;
서브 쿼리에 속하는 테이블 B에는 없고 메인 쿼리에만 존재하는 테이블 A의 데이터만 추출하는 방법.
(세미 조인의 반대 개념이다)
한쪽 테이블에만 있는 데이터를 추출하는 것이므로 NOT IN
, NOT EXISTS
연산자를 사용한다.
NOT IN
연산자를 사용한 Anti join 예시SELECT a.employee_id, a.emp_name, a.department_id, b.department_name
FROM employees a, departments b
WHERE a.department_id = b.department_id
AND a.department_id NOT IN (SELECT department_id
FROM departments
WHERE manager_id IS NULL);
NOT EXISTS
연산자를 사용한 Anti join 예시SELECT count(*) FROM employees a
WHERE NOT EXISTS (SELECT 1
FROM departments c
WHERE a.department_id = c.department_id
AND manager_id IS NULL);
출처
- 오라클 SQL과 PL/SQL을 다루는 기술 (책)