JOIN
- 두 개 이상의 테이블을 연결하여 하나의 결과 집합으로 만드는 연산
- 조인의 처리에서 어느 테이블을 먼저 읽을지를 결정하는 것은 상당히 중요하며, 그에 따라 처리할 작업량이 상당히 달라진다
- INNER JOIN: 교집합 => 두 테이블이 모두 가지고 있는 데이터만 검색됨
- OUTER JOIN: FULL OUTER JOIN의 경우 빼고는 특정 테이블을 기준으로 데이터를 보여준다
- LEFT OUTER JOIN: 왼쪽 테이블을 기준으로, 왼쪽 테이블의 모든 데이터와 왼쪽*오른쪽 테이블의 중복데이터들을 보여줌
- RIGHT OUTER JOIN: 오른쪽 테이블을 기준으로, 오른쪽 테이블의 모든 데이터와 왼쪽*오른쪽 테이블의 중복데이터들을 보여줌
- FULL OUTER JOIN: 왼쪽 테이블과 오른쪽 테이블의 합집합을 얻음
=> 만약 왼쪽에는 데이터가 있지만 오른쪽에 데이터가 없으면 오른쪽부분은 null이 되고, 반대의 경우에는 왼쪽부분이 null이 된다.
SELECT
employees.emp_id,
employees.name,
departments.dept_name
FROM
employees
INNER JOIN (or LEFT OUTER JOIN or RIGHT OUTER JOIN)
departments
ON
employees.dept_id = departments.dept_id;
INNER JOIN과 OUTER JOIN의 차이점
- INNER JOIN은 어느 테이블을 먼저 읽어도 결과가 달라지지 않으므로
옵티마이저가 JOIN의 순서를 조절해서 다양한 방법으로 최적화를 수행할 수 있다
반면 OUTER JOIN은 반드시 OUTER가 되는 테이블을 먼저 읽어야 하기 때문에
조인 순서를 옵티마이저가 선택할 수 없다
- INNER JOIN는 일치하지 않는 레코드는 표시하지 않지만,
OUTER JOIN는 일치하지 않더라도 NULL로 채워서 결과를 응답함
CROSS JOIN
- 두 테이블의 모든 행을 조합하여 Cartesian Product (카테시안 또는 데카르트 곱)를 생성
=> 두 테이블 간의 가능한 모든 조합을 만듦
- 두 테이블 간의 관계가 없어도 사용할 수 있으며, 행의 개수는 왼쪽 테이블 행 개수 × 오른쪽 테이블 행 개수 이다
- ON 조건이 필요하지 않음
조건을 걸려면 일반적으로 WHERE 절을 추가함
SELECT
products.product_name,
categories.category_name
FROM
products
CROSS JOIN
categories
WHERE
categories.category_name = 'Electronics';