[DB] JOIN 알아보기

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의 차이점

  1. INNER JOIN은 어느 테이블을 먼저 읽어도 결과가 달라지지 않으므로
    옵티마이저가 JOIN의 순서를 조절해서 다양한 방법으로 최적화를 수행할 수 있다
    반면 OUTER JOIN반드시 OUTER가 되는 테이블을 먼저 읽어야 하기 때문에
    조인 순서를 옵티마이저가 선택할 수 없다
  2. 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';

'CS > DB' 카테고리의 다른 글

[DB] Connection & DB Session  (0) 2025.01.27
[DB] 정규화  (0) 2025.01.23
[DB] 인덱스 정의, 동작 방식, 종류 등 톺아보기(MySQL 기준)  (0) 2025.01.14
[DB] SQL 톺아보기  (0) 2025.01.09
[DB] 데이터베이스 기본 개념 톺아보기  (0) 2025.01.03