코딩 스쿨 SQL

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

SQL Left Join

SQL LEFT JOIN: 왼쪽 테이블의 모든 데이터를 반환하고, 일치하지 않는 데이터는 NULL로 처리

SQL LEFT JOIN(또는 LEFT OUTER JOIN)은 두 개의 테이블을 결합할 때, 왼쪽 테이블의 모든 행을 반환하고, 오른쪽 테이블에 일치하는 데이터가 없으면 NULL을 반환합니다. 즉, 왼쪽 테이블의 데이터를 모두 포함하되, 오른쪽 테이블에 일치하는 값이 없는 경우는 NULL 값을 사용해 결과를 반환합니다.

1. 기본 LEFT JOIN 문법

SELECT 열이름
FROM 테이블1
LEFT JOIN 테이블2 ON 테이블1.열 = 테이블2.열;

  • LEFT JOIN: 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 일치하는 행을 반환합니다. 일치하지 않는 경우 오른쪽 테이블의 데이터는 NULL로 표시됩니다.
  • ON: 두 테이블을 연결하는 기준을 설정합니다. 일반적으로 두 테이블 간의 외래 키와 기본 키를 비교합니다.

2. SQL LEFT JOIN 예제

2.1 기본 LEFT JOIN

다음은 employees 테이블과 departments 테이블을 LEFT JOIN으로 결합하여 모든 직원을 포함하고, 부서가 없는 직원은 NULL로 처리하는 예제입니다.

SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;

이 쿼리는 employees 테이블의 모든 행을 반환하며, 부서가 없는 직원의 경우 department_name은 NULL로 표시됩니다.

결과 예시:

name department_name
John Sales
Jane HR
Bob NULL

3. LEFT JOIN과 조건 사용

LEFT JOIN과 WHERE 절을 결합하여 추가 조건을 적용할 수 있습니다.

예제: 부서가 없는 직원 조회

다음은 부서가 없는 직원(즉, department_name이 NULL인 직원)을 조회하는 예제입니다.

SELECT employees.name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id
WHERE departments.department_name IS NULL;

이 쿼리는 부서에 속하지 않은 모든 직원을 반환합니다.

결과 예시:

name


Bob


Alice


4. LEFT JOIN과 집계 함수 결합

LEFT JOIN과 집계 함수를 결합하여 결합된 데이터에서 통계를 계산할 수 있습니다.

예제: 부서별 직원 수 계산 (부서가 없는 직원 포함)

SELECT departments.department_name, COUNT(employees.id) AS employee_count
FROM departments
LEFT JOIN employees ON departments.id = employees.department_id
GROUP BY departments.department_name;

이 쿼리는 각 부서의 직원 수를 계산하며, 부서에 직원이 없는 경우에도 해당 부서는 결과에 포함됩니다.

결과 예시:

department_name employee_count
Sales 3
HR 2
Marketing 0

5. LEFT JOIN과 여러 테이블 결합

LEFT JOIN을 사용하여 세 개 이상의 테이블을 결합할 수 있습니다. 이 경우 각 테이블 간의 결합 관계에 따라 다양한 방식으로 데이터를 조회할 수 있습니다.

예제: 세 개의 테이블 결합

다음은 employees, departments, 그리고 projects 테이블을 결합하여 모든 직원과 그들의 부서프로젝트 정보를 조회하는 예제입니다.

SELECT employees.name, departments.department_name, projects.project_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id
LEFT JOIN projects ON employees.project_id = projects.id;

이 쿼리는 모든 직원을 반환하며, 부서나 프로젝트가 없는 직원의 경우에는 NULL로 처리됩니다.

결과 예시:

name department_name project_name
John Sales Alpha
Jane HR NULL
Bob NULL Gamma

6. LEFT JOIN과 NULL 값 처리

LEFT JOIN은 오른쪽 테이블에 일치하는 값이 없을 때 NULL을 반환합니다. 이를 적절히 처리하지 않으면, 잘못된 결과가 나올 수 있습니다. IS NULL이나 COALESCE() 함수를 사용하여 NULL 값을 처리할 수 있습니다.

예제: NULL 값을 기본값으로 대체

다음은 부서가 없는 경우 **"No Department"**라는 기본값을 사용하여 조회하는 예제입니다.

SELECT employees.name, COALESCE(departments.department_name, 'No Department') AS department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;

이 쿼리는 부서가 없는 경우 **"No Department"**를 표시합니다.

결과 예시:

name department_name
John Sales
Jane HR
Bob No Department

7. LEFT JOIN과 대소문자 구분

SQL에서 LEFT JOIN은 기본적으로 대소문자를 구분하지 않습니다. 즉, 문자열 비교에서 Salessales를 같은 값으로 처리합니다. 대소문자를 구분해야 할 경우 데이터베이스 시스템에 따라 BINARY 같은 키워드를 사용할 수 있습니다.

8. 실전 예제

예제 1: 직원과 부서 정보 결합 (부서가 없는 직원 포함)

SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;

이 쿼리는 모든 직원을 반환하고, 부서가 없는 경우에는 NULL로 처리합니다.

예제 2: 프로젝트가 없는 직원 조회

SELECT e.name
FROM employees e
LEFT JOIN projects p ON e.project_id = p.id
WHERE p.project_name IS NULL;

이 쿼리는 프로젝트에 참여하지 않은 모든 직원을 반환합니다.

예제 3: 부서별 직원 수 계산 (직원이 없는 부서 포함)

SELECT d.department_name, COUNT(e.id) AS employee_count
FROM departments d
LEFT JOIN employees e ON d.id = e.department_id
GROUP BY d.department_name;

이 쿼리는 각 부서별로 직원 수를 반환하며, 직원이 없는 부서도 포함됩니다.

9. LEFT JOIN vs INNER JOIN

  • LEFT JOIN: 왼쪽 테이블의 모든 행을 반환하고, 오른쪽 테이블에서 일치하지 않는 데이터는 NULL로 반환합니다.
  • INNER JOIN: 두 테이블에서 일치하는 행만 반환합니다. 일치하지 않는 데이터는 결과에서 제외됩니다.

요약

SQL LEFT JOIN은 왼쪽 테이블의 모든 행을 반환하고, 오른쪽 테이블에서 일치하지 않는 데이터는 NULL로 처리하는 방식의 JOIN입니다. 이를 통해 일치하지 않는 데이터도 포함하여 조회할 수 있으며, WHERE 절을 결합해 추가 필터링을 할 수 있습니다. 또한, COALESCE() 함수를 사용하여 NULL 값을 적절히 처리할 수 있습니다. LEFT JOIN은 특히 데이터가 누락되었거나, 부분적으로 관련된 데이터를 조회할 때 유용하게 사용됩니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com