ex) 고객 정보와 주문 정보가 각각 다른 테이블에 저장되어 있는 경우, 두 테이블의 정보를 결합하여 해당 고객의 주문 내역을 조회하는 경우에 사용
SELECT *
FROM 고객정보
INNER JOIN 주문정보 ON 고객정보.고객ID = 주문정보.고객ID
WHERE 고객정보.고객ID = '고객ID값';
LEFT OUTER JOIN = LEFT JOIN
왼쪽 테이블의 모든 행을 포함하며, 오른쪽 테이블과 일치하는 행이 없는 경우 null 값을 반환
ex) 부서 정보와 사원 정보가 각각 다른 테이블에 저장되어 있는 경우, 모든 부서의 정보와 해당 부서의 사원 정보를 함께 조회하는 경우에 사용. 이때, 해당 부서에 속한 사원이 없는 경우에도 부서 정보는 출력된다.
SELECT 부서.부서명, 사원.사원명
FROM 부서
LEFT OUTER JOIN 사원 ON 부서.부서ID = 사원.부서ID;
RIGHT OUTER JOIN
오른쪽 테이블의 모든 행과 왼쪽 테이블에서 일치하는 행을 반환하며, 왼쪽 테이블에서 일치하는 행이 없으면 null 값을 반환
ex) LEFT JOIN 과 반대로 사원 정보가 부서 정보와 함께 저장되어 있으며, RIGHT JOIN 을 사용하여 모든 사원의 정보와 해당 사원이 속한 부서 정보를 함께 조회하는 경우에 사용. 이때, 해당 부서에 사원이 없는 경우에도 사원 정보는 출력된다.
SELECT *
FROM 사원정보
RIGHT OUTER JOIN 부서정보 ON 사원정보.부서ID = 부서정보.부서ID;
FULL OUTER JOIN
왼쪽과 오른쪽 테이블 모두에서 일치하는 행과 일치하지 않는 행을 모두 반환 = 합집합
만약 일치하는 행이 없으면 Null 값 반환
ex) LEFT JOIN 과 RIGHT JOIN 을 합친 것으로, 모든 부서 정보와 사원 정보를 함께 조회하는 경우에 사용. 이때, 부서 정보와 사원 정보가 서로 매칭되지 않는 경우에도 모든 정보가 출력된다.
SELECT *
FROM 부서정보
FULL OUTER JOIN 사원정보 ON 부서정보.부서ID = 사원정보.부서ID;
// RDBMS 에서 FULL OUTER JOIN 을 지원하지 않는 경우
SELECT *
FROM 부서정보
LEFT JOIN 사원정보 ON 부서정보.부서ID = 사원정보.부서ID
UNION
SELECT *
FROM 부서정보
RIGHT JOIN 사원정보 ON 부서정보.부서ID = 사원정보.부서ID;
CROSS JOIN
두 개 이상의 테이블에서 모든 조합(경우의 수)을 반환. 즉, 첫 번째 테이블의 모든 행과 두 번째 테이블의 모든 행을 반환
대용량 DB 에서는 사용을 피해야 한다.
ex) 온라인 쇼핑몰에서 상품과 쿠폰을 조합하여 새로운 할인 상품을 만드는 경우. 상품 테이블은 각 상품의 ID, 이름, 가격 등의 정보를 포함하고, 쿠폰 테이블은 각 쿠폰의 ID, 할인율, 유효기간 등의 정보를 포함한다. 이 경우, 두 테이블을 CROSS JOIN 하여 가능한 모든 조합을 만들고, 각 조합에 대해 새로운 할인 가격을 계산하여 새로운 테이블을 생성할 수 있으며, 이를 통해 새로운 할인 상품을 제공할 수 있다.
SELECT
상품.상품ID,
상품.이름,
상품.가격,
쿠폰.쿠폰ID,
쿠폰.할인율,
(상품.가격 * (1 - 쿠폰.할인율)) AS 할인가격
INTO
새로운할인상품
FROM
상품
CROSS JOIN
쿠폰;
SELF JOIN
동일한 테이블 내에서 조인을 수행하는 것으로, 테이블을 자기 자신과 결합
이를 통해 조직 구조나 계층 구조와 같은 데이터에서 부모-자식 관계를 나타내기 위해 사용
ex) employees 테이블이 employee_id, name, position, manager_id 컬럼을 가지고 있다고 할 때, manager_id 컬럼은 해당 징원의 상위 관리자를 나타내는 다른 직원의 employee_id 와 관련된다. 즉, 자식 직원들과 그들의 상위 관리자를 찾기 위해 self join 을 사용할 수 있다.
SELECT
e.employee_id,
e.name AS employee_name,
m.employee_id AS manager_id,
m.name AS manager_name
FROM
employees e
JOIN
employees m ON e.manager_id = m.employee_id;
차집합
FULL OUTER JOIN 과 Null을 사용하여 구현할 수 있다.
SELECT *
FROM 테이블1
FULL OUTER JOIN 테이블2
ON 테이블1.열 = 테이블2.열
WHERE 테이블1.열 IS NULL OR 테이블2.열 IS NULL;