SQL Joins
SQL JOINS: 여러 테이블을 결합하여 데이터 조회
SQL JOIN 연산자는 여러 테이블의 데이터를 결합하여 관련 정보를 함께 조회할 때 사용됩니다. 데이터베이스에서 정보는 종종 여러 테이블에 나누어 저장되며, JOIN을 통해 이 데이터를 한 쿼리에서 조회할 수 있습니다. JOIN은 특정 조건을 기준으로 두 개 이상의 테이블을 연결하여 데이터를 결합하는 매우 중요한 SQL 기능입니다.
1. 주요 JOIN 유형
SQL에는 여러 가지 JOIN 유형이 있으며, 각각의 JOIN은 다른 방식으로 테이블을 결합합니다.
- INNER JOIN: 두 테이블에서 일치하는 데이터만 반환.
- LEFT JOIN (또는 LEFT OUTER JOIN): 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 일치하는 데이터를 반환 (일치하지 않는 경우 NULL).
- RIGHT JOIN (또는 RIGHT OUTER JOIN): 오른쪽 테이블의 모든 행과 왼쪽 테이블에서 일치하는 데이터를 반환 (일치하지 않는 경우 NULL).
- FULL JOIN (또는 FULL OUTER JOIN): 두 테이블의 모든 행을 반환하고, 일치하지 않는 경우에는 NULL을 반환.
- CROSS JOIN: 두 테이블의 모든 행을 곱셈하여 조합.
2. SQL JOIN 문법
JOIN을 사용하여 데이터를 결합하는 기본 문법은 다음과 같습니다:
SELECT 열이름
FROM 테이블1
[JOIN 유형] 테이블2 ON 테이블1.열 = 테이블2.열;
- JOIN 유형: JOIN의 종류를 선택합니다 (INNER, LEFT, RIGHT, FULL, CROSS).
- ON: 어떤 조건으로 두 테이블을 연결할지를 지정합니다. 일반적으로 외래 키와 기본 키를 기반으로 테이블을 연결합니다.
3. INNER JOIN
INNER JOIN은 두 테이블에서 일치하는 데이터만 반환합니다. 일치하지 않는 데이터는 무시됩니다.
예제: 직원과 부서 정보를 결합
SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;
이 쿼리는 employees
테이블과 departments
테이블을 department_id를 기준으로 결합하여
일치하는 행만 반환합니다.
결과 예시:
name | department_name |
---|---|
John | Sales |
Jane | HR |
Bob | Engineering |
4. LEFT JOIN (LEFT OUTER JOIN)
LEFT JOIN은 왼쪽 테이블의 모든 데이터를 반환하고, 오른쪽 테이블에서 일치하는 데이터가 없는 경우에는 NULL을 반환합니다.
예제: 직원과 부서 정보를 결합 (일치하지 않는 부서 포함)
SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;
이 쿼리는 employees
테이블의 모든 행을 반환하며, 부서가 없는 직원도 포함됩니다. 만약 일치하는 부서가 없다면
NULL이 반환됩니다.
결과 예시:
name | department_name |
---|---|
John | Sales |
Jane | HR |
Bob | NULL |
5. RIGHT JOIN (RIGHT OUTER JOIN)
RIGHT JOIN은 오른쪽 테이블의 모든 데이터를 반환하고, 왼쪽 테이블에서 일치하는 데이터가 없는 경우에는 NULL을 반환합니다.
예제: 모든 부서를 포함하여 직원과 부서 정보를 결합
SELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.id;
이 쿼리는 departments
테이블의 모든 행을 반환하며, 직원이 없는 부서도 포함됩니다. 만약 일치하는 직원이 없다면
NULL이 반환됩니다.
결과 예시:
name | department_name |
---|---|
John | Sales |
Jane | HR |
NULL | Marketing |
6. FULL JOIN (FULL OUTER JOIN)
FULL JOIN은 두 테이블의 모든 행을 반환하며, 한쪽 테이블에 일치하는 데이터가 없으면 NULL이 반환됩니다. 왼쪽과 오른쪽 테이블의 모든 데이터가 출력되므로, 양쪽에서 일치하지 않는 데이터도 포함됩니다.
예제: 모든 직원과 모든 부서 정보를 결합
SELECT employees.name, departments.department_name
FROM employees
FULL JOIN departments ON employees.department_id = departments.id;
이 쿼리는 모든 직원과 모든 부서 정보를 반환하며, 일치하지 않는 경우에는 NULL을 반환합니다.
결과 예시:
name | department_name |
---|---|
John | Sales |
Jane | HR |
NULL | Marketing |
Bob | NULL |
7. CROSS JOIN
CROSS JOIN은 두 테이블의 모든 행을 곱셈하여 조합합니다. 이 JOIN은 일치 조건이 없으며, 모든 가능한 조합을 반환합니다.
예제: 모든 직원과 모든 부서의 조합
SELECT employees.name, departments.department_name
FROM employees
CROSS JOIN departments;
이 쿼리는 employees
테이블의 모든 직원과 departments
테이블의 모든 부서를 조합한 결과를 반환합니다.
결과 예시:
name | department_name |
---|---|
John | Sales |
John | HR |
John | Engineering |
Jane | Sales |
Jane | HR |
Jane | Engineering |
8. SELF JOIN
SELF JOIN은 같은 테이블을 자기 자신과 조인할 때 사용됩니다. 이를 통해 테이블 내에서 연관된 데이터를 비교할 수 있습니다.
예제: 직원 간의 상사-부하 관계 조회
SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.id;
이 쿼리는 employees
테이블에서 **상사(manager)**와 부하(employee) 관계를 조회합니다.
결과 예시:
employee | manager |
---|---|
John | Jane |
Bob | John |
Jane | NULL |
9. JOIN을 사용할 때의 주의 사항
- JOIN 조건 설정: 각 JOIN에서 ON 절을 통해 적절한 조건을 설정해야 합니다. 일반적으로 외래 키와 기본 키를 기준으로 연결합니다.
- 데이터 양 주의: JOIN을 사용할 때 테이블이 크면 성능에 영향을 줄 수 있으므로, 필요한 데이터만 조회하도록 WHERE 조건을 추가하는 것이 좋습니다.
- NULL 값 처리: LEFT JOIN, RIGHT JOIN, FULL JOIN은 일치하지 않는 값에 대해 NULL을 반환하므로, NULL 값을 적절히 처리해야 합니다.
10. 실전 예제
예제 1: 직원과 부서 정보 결합 (INNER JOIN)
SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
예제 2: 모든 직원과 부서 정보 결합 (LEFT JOIN)
SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
예제 3: 모든 부서와 그 부서에 속한 직원 수 (RIGHT JOIN)
SELECT d.department_name, COUNT(e.id) AS employee_count
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.id
GROUP BY d.department_name;
11. 요약
- INNER JOIN: 일치하는 데이터만 반환.
- LEFT JOIN: 왼쪽 테이블의 모든 데이터를 반환하고, 일치하지 않는 경우 오른쪽 테이블에서 NULL을 반환.
- RIGHT JOIN: 오른쪽 테이블의 모든 데이터를 반환하고, 일치하지 않는 경우 왼쪽 테이블에서 NULL을 반환.
- FULL JOIN: 두 테이블의 모든 데이터를 반환하고, 일치하지 않는 경우 NULL을 반환.
- CROSS JOIN: 두 테이블의 모든 가능한 조합을 반환.
- SELF JOIN: 동일한 테이블 내에서 데이터를 비교할 때 사용.
SQL JOIN 연산자는 데이터베이스 내 여러 테이블을 결합하여 데이터 간의 관계를 기반으로 유용한 정보를 추출하는 데 필수적입니다. 각 JOIN 유형을 적절히 사용하여 데이터를 효과적으로 조회하고 분석할 수 있습니다.