조인 (Join)
- 데이터베이스에서 두 개 이상의 테이블을 연결하여 하나의 결과 집합으로 결합하는 연산
- 테이블 간의 관계를 활용하여 데이터를 효과적으로 검색하고 조작하는 데 사용된다.
INNER JOIN
- 두 테이블 간의 일치하는 행만 반환 = 교집합
- 그냥 JOIN 을 하면 INNER JOIN 과 같은 결과가 나온다.
- 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;
'Computer Science > Database' 카테고리의 다른 글
[Database] 정규화 (Normalization) (0) | 2023.07.07 |
---|---|
[Database] 인덱스 (Index) (0) | 2023.06.30 |
[Database] 이상 현상 (Anomaly) (0) | 2023.06.30 |
[Database] SQL vs. NoSQL (0) | 2023.06.23 |
[Database] SQL Injection (0) | 2023.06.23 |