TIL

👀Today I Learn

JOIN

Image

  • JOIN 연산은 두 테이블을 결합하는 연산
  • 예시 데이터
    • 테이블 1 : employees

      id name department_id
      1 Alice 1
      2 Bob 2
      3 Charlie NULL
      4 David 3
    • 테이블 2 : departments

      id department_name
      1 HR
      2 Engineering
      3 Marketing
      4 Sales

1. INNER JOIN

  • 두 테이블에서 일치하는 행만 반환
  • 일치 조건(ON 절)에 부합하는 데이터만 반환
  • 예시

      SELECT employees.name, departments.department_name
      FROM employees INNER JOIN departments ON employees.department_id = departments.id
    
  • 결과

    name department_name
    Alice HR
    Bob Engineering
    David Marketing
    • employees.department_iddepartments.id가 일치하는 행만 반환
    • Charliedepartment_idNULL이므로 반환되지 않음

2. LEFT JOIN (또는 LEFT OUTER JOIN)

  • 왼쪽 테이블의 모든 행과, 일치하는 오른쪽 테이블의 행을 반환
  • 오른쪽 테이블에 일치하는 행이 없으면 NULL로 채워짐
  • 예시

    SELECT employees.name, departments.department_name
    FROM employees LEFT JOIN departments ON employees.department_id = departments.id
    
  • 결과

    name department_name
    Alice HR
    Bob Engineering
    Charlie NULL
    David Marketing
    • employees 테이블의 모든 행이 반환되고, 일치하지 않는 department_id는 NULL로 채워짐
    • Charlie는 부서가 없기 때문에 department_nameNULL로 표시

3. RIGHT JOIN (또는 RIGHT OUTER JOIN)

  • 오른쪽 테이블의 모든 행과, 일치하는 왼쪽 테이블의 행을 반환
  • 왼쪽 테이블에 일치하는 행이 없으면 NULL로 채워짐
  • 예시

    SELECT employees.name, departments.department_name
    FROM employees RIGHT JOIN departments ON employees.department_id = departments.id
    
  • 결과

    name department_name
    Alice HR
    Bob Engineering
    David Marketing
    NULL Sales
    • departments 테이블의 모든 행이 반환
    • employees.department_id와 일치하지 않는 departments.id의 경우, employees.nameNULL로 표시
    • Sales 부서에는 직원이 없으므로 nameNULL

4. FULL JOIN (또는 FULL OUTER JOIN)

  • 두 테이블의 모든 행을 반환하며, 일치하지 않는 행은 NULL로 채워짐
  • MySQL은 FULL OUTER JOIN을 기본적으로 지원하지 않지만, UNION을 통해 구현할 수 있음
  • 예시

    SELECT employees.name, departments.department_name
    FROM employees LEFT JOIN departments ON employees.department_id = departments.id
    
    UNION
    
    SELECT employees.name, departments.department_name
    FROM employees RIGHT JOIN departments ON employees.department_id = departments.id
    
  • 결과

    name department_name
    Alice HR
    Bob Engineering
    Charlie NULL
    David Marketing
    NULL Sales
    • 두 테이블의 모든 데이터를 반환하며, 어느 한쪽에 데이터가 없는 경우 NULL로 표시
    • Charlie는 부서가 없고, Sales 부서에는 직원이 없기 때문에 각각 NULL 값이 포함

5. CROSS JOIN

  • 두 테이블의 행을 모두 조합한 결과를 반환
  • 카티션 곱(Cartesian Product)을 생성
  • 예시

    SELECT employees.name, departments.department_name
    FROM employees CROSS JOIN departments
    
  • 결과

    name department_name
    Alice HR
    Alice Engineering
    Alice Marketing
    Alice Sales
    Bob HR
    Bob Engineering
    Bob Marketing
    Bob Sales
    Charlie HR
    Charlie Engineering
    Charlie Marketing
    Charlie Sales
    David HR
    David Engineering
    David Marketing
    David Sales
    • employeesdepartments의 모든 행 조합이 반환
    • 이 경우 모든 직원과 모든 부서가 서로 연결

6. SELF JOIN

  • 테이블을 자기 자신과 조인
  • 동일 테이블의 데이터를 비교하거나 계층적 데이터를 처리할 때 유용
  • 예시

    SELECT A.name AS Employee, B.name AS Manager
    FROM employees A INNER JOIN employees B ON A.id = B.department_id
    
  • 결과

    Employee Manager
    David Bob
    • employees 테이블을 자기 자신과 조인하여, 직원과 그 직원의 부서 관리자를 연결
    • DavidBob이 관리하는 부서에 속해 있음

7. NATURAL JOIN

  • 동일한 이름의 열을 기준으로 두 테이블을 조인(ON 절을 명시할 필요가 없음)
  • 열 이름이 정확히 일치해야 함
  • 예시

    SELECT employees.name, departments.department_name
    FROM employees NATURAL JOIN departments
    
  • 결과

    name department_name
    Alice HR
    Bob Engineering
    David Marketing
    • 두 테이블에서 동일한 이름을 가진 열(id)을 기준으로 자동으로 조인
    • Charlie는 일치하는 부서가 없기 때문에 결과에 포함되지 않음


🪄 요약

JOIN 유형 설명 NULL 포함 여부
INNER JOIN 일치 조건을 만족하는 데이터만 반환 포함 안 함
LEFT JOIN 왼쪽 테이블의 모든 행과 일치하는 데이터, 없으면 NULL로 표시 왼쪽 테이블 기준 NULL 포함
RIGHT JOIN 오른쪽 테이블의 모든 행과 일치하는 데이터, 없으면 NULL로 표시 오른쪽 테이블 기준 NULL 포함
FULL JOIN 두 테이블의 모든 데이터를 반환, 없으면 NULL로 표시 양쪽 모두 NULL 포함
CROSS JOIN 두 테이블의 카티션 곱 반환 N/A
SELF JOIN 자기 자신과 조인 N/A
NATURAL JOIN 동일한 이름의 열을 기준으로 조인 N/A



💡Today I Thought

오늘의 체크리스트

  • 알고리즘 코드카타 266-270
  • SQL 코드카타 90-91
  • TIL 작성

댓글남기기