SQLD 자격증 대비: 조인과 서브쿼리 학습
SQLD 자격증 시험에서는 조인(Join)과 서브쿼리(Subquery)가 핵심 개념으로 출제됩니다.
이번 글에서는 샘플 테이블을 활용하여 조인의 다양한 유형(NATURAL JOIN 포함)과
서브쿼리(인라인 뷰, 스칼라 서브쿼리)의 특징, 장단점, 주의할 점을 다뤄보겠습니다.
1. 샘플 테이블
1-1. Employees 테이블
직원 정보를 저장한 테이블입니다.
EmployeeID | EmployeeName | DepartmentID | Salary |
1 | John | 101 | 5000 |
2 | Jane | 102 | 6000 |
3 | Alice | 101 | 5500 |
4 | Bob | 103 | 7000 |
5 | Tom | NULL | 4500 |
1-2. Departments 테이블
부서 정보를 저장한 테이블입니다.
DepartmentID | DepartmentName |
101 | Sales |
102 | Marketing |
103 | IT |
104 | HR |
2. 조인 (JOIN)
조인은 여러 개의 테이블을 연결하여 데이터를 조회하는 데 사용됩니다.
2-1. NATURAL JOIN (내추럴 조인)
NATURAL JOIN은 동일한 이름을 가진 칼럼을 자동으로 찾아 조인하는 방법입니다.
자동 매칭이 되므로 ON 절을 명시하지 않아도 됩니다.
(※ 하지만, 칼럼명이 다르면 오류 발생 가능)
SELECT EmployeeName, DepartmentName
FROM Employees
NATURAL JOIN Departments;
쿼리 실행 순서
- FROM Employees: Employees 테이블을 가져옵니다.
- NATURAL JOIN Departments: 동일한 칼럼명(DepartmentID)을 자동으로 찾아 조인합니다.
- SELECT: EmployeeName, DepartmentName 칼럼만 조회합니다.
출력 결과
EmployeeName | DepartmentName |
John | Sales |
Jane | Marketing |
Alice | Sales |
Bob | IT |
NATURAL JOIN의 주의사항
- 동일한 칼럼명이 없으면 오류 발생
- → 칼럼명이 일치하는지 확인 필요.
- → 칼럼명이 일치하는지 확인 필요.
- 자동 조인으로 인한 예측 불가능한 결과 발생 가능
- → 명시적 조인(ON 절 활용)이 더 안전할 수 있음.
3. 서브쿼리 (Subquery)
서브쿼리는 쿼리 내부에 포함된 또 다른 쿼리로,
특정 데이터를 조회하거나 필터링하는 데 사용됩니다.
3-1. 인라인 뷰 (Inline View)
인라인 뷰는 FROM 절에 포함된 서브쿼리로, 실행 시 임시 테이블처럼 동작합니다.
SELECT EmployeeName, Salary
FROM (
SELECT EmployeeName, Salary
FROM Employees
WHERE Salary > 5000
) AS HighSalaryEmployees;
인라인 뷰의 특징
- 실행 시 임시 테이블처럼 동작하여 서브쿼리 결과를 메인 쿼리에서 활용 가능.
- GROUP BY, ORDER BY와 함께 사용 가능하여 데이터를 정리한 후 처리할 수 있음.
장점
- 데이터 가공 및 정렬 후 활용 가능.
- 쿼리 가독성 향상 (복잡한 서브쿼리를 테이블처럼 활용 가능).
주의할 점
- 인덱스가 적용되지 않을 수도 있음
- → 성능 저하 가능.
- → 성능 저하 가능.
- 서브쿼리에서 ORDER BY 사용 시 메인 쿼리에 영향을 줄 수 있음.
출력 결과
EmployeeName | Salary |
Jane | 6000 |
Bob | 7000 |
3-2. 스칼라 서브쿼리 (Scalar Subquery)
스칼라 서브쿼리는 단일 값을 반환하며, SELECT문에서 칼럼처럼 사용할 수 있습니다.
SELECT EmployeeName,
(SELECT DepartmentName
FROM Departments
WHERE DepartmentID = E.DepartmentID) AS DepartmentName
FROM Employees E;
스칼라 서브쿼리의 특징
- SELECT문에서 칼럼처럼 사용 가능.
- 반환 값이 1개 여야 함 (여러 개의 값이 반환되면 오류 발생).
장점
- 별도의 조인 없이 특정 값을 가져올 수 있음.
- 데이터를 가독성 있게 표현 가능.
주의할 점
- WHERE 절에서 조인 형태로 사용 시 성능 저하 가능.
- NULL 값이 포함될 경우 오류 발생 가능.
출력 결과
EmployeeName | DepartmentName |
John | Sales |
Jane | Marketing |
Alice | Sales |
Bob | IT |
Tom | NULL |
Tom이 왜 출력되지?
위 쿼리는 Employees 테이블에서 EmployeeName을 가져오고,
각 직원의 DepartmentID에 해당하는 DepartmentName을 스칼라 서브쿼리로 조회합니다.
💡 TOM이 출력되는 이유
스칼라 서브쿼리는 NULL 값이 있어도
메인 쿼리에서 필터링되지 않기 때문입니다.
🔹 실행 순서
- 메인 쿼리 실행 (Employees 테이블 조회)
- Employees 테이블의 모든 행(EmployeeName, DepartmentID)을 가져옵니다.
- Tom도 포함되어 있음.
- Employees 테이블의 모든 행(EmployeeName, DepartmentID)을 가져옵니다.
- 스칼라 서브쿼리 실행
- Departments 테이블에서
- WHERE DepartmentID = E.DepartmentID 조건을 만족하는
- DepartmentName을 찾습니다.
- DepartmentName을 찾습니다.
- WHERE DepartmentID = E.DepartmentID 조건을 만족하는
- 하지만 Tom의 DepartmentID 값이 NULL이므로
- WHERE DepartmentID = NULL이 되어 일치하는 데이터가 없음.
- WHERE DepartmentID = NULL이 되어 일치하는 데이터가 없음.
- 따라서 DepartmentName은 NULL 반환.
- Departments 테이블에서
💡 해결 방법: TOM을 출력하지 않으려면?
방법 1️⃣: WHERE 조건 추가하여 NULL 값 제외
SELECT EmployeeName,
(SELECT DepartmentName FROM Departments
WHERE DepartmentID = E.DepartmentID) AS DepartmentName
FROM Employees E
WHERE E.DepartmentID IS NOT NULL;
✅ 출력 결과에서 TOM이 제외됨.
방법 2️⃣: INNER JOIN 사용하여 NULL 값 자동 제외
SELECT E.EmployeeName, D.DepartmentName
FROM Employees E
INNER JOIN Departments D
ON E.DepartmentID = D.DepartmentID;
✅ INNER JOIN은 일치하는 데이터만 조회하므로 NULL 값 자동 제외.
4. SQLD 자격증 대비 추가 학습 조인 및 쿼리
SQLD 자격증을 준비하면서 추가적으로 학습해야 할 조인 및 쿼리를 정리하면 다음과 같습니다.
4-1. SELF JOIN (자체 조인)
- 같은 테이블을 서로 조인하여 상하 관계(예: 조직도) 데이터를 조회할 때 사용.
SELECT E1.EmployeeName AS Manager, E2.EmployeeName AS Employee
FROM Employees E1
JOIN Employees E2
ON E1.EmployeeID = E2.DepartmentID;
4-2. CROSS JOIN (교차 조인)
- 모든 조합의 데이터를 조회
- 일반적으로 잘 사용되지 않지만, 필요한 경우 활용 가능.
SELECT E.EmployeeName, D.DepartmentName
FROM Employees E
CROSS JOIN Departments D;
4-3. INNER JOIN (동등 조인)
- 일치하는 행만 출력
- NULL 값이 있으면 해당 행 제외
SELECT E.EmployeeName, D.DepartmentName, E.Salary
FROM Employees E
INNER JOIN Departments D
ON E.DepartmentID = D.DepartmentID
WHERE E.Salary > 5000;
4-4. EXISTS 서브쿼리
- 특정 조건을 만족하는 데이터가 존재하는지 확인.
SELECT EmployeeName
FROM Employees E
WHERE EXISTS (
SELECT 1 FROM Departments D WHERE D.DepartmentID = E.DepartmentID
);
✔ 결론
✅ 조인(Join) → 데이터를 연결하여 확장된 정보를 얻음.
✅ 서브쿼리(Subquery) → 데이터를 계층적으로 조회하여 원하는 정보를 추출.
이번 글을 통해 샘플 테이블에 대한 각 쿼리 진행 순서와 결과를 바탕으로
자신이 원하는 결과를 출력하기 위해 조금이라도 도움이 되었길 바랍니다.
이 외 NOT EXISTS, IN, NOT IN, ANY, ALL의 활용은 다음 포스팅에서 정리해 보겠습니다.