반응형
"여러 테이블에 분산된 데이터를 한 번에 가져오려면 어떤 JOIN을 사용해야 할까요?"
"그룹화된 통계 데이터에서 조건을 걸 때 WHERE 절을 써야 할까요, HAVING 절을 써야 할까요?"
관계형 데이터베이스(RDBMS)의 진가는 여러 테이블의 데이터를 하나로 결합하는 JOIN 연산과 집계 데이터를 그룹별로 추출하는 GROUP BY / HAVING 절을 활용할 때 드러납니다.
이번 글에서는 INNER JOIN, OUTER JOIN의 차이점과 WHERE 절 vs HAVING 절의 핵심 차이를 실무 및 시험 필수 포인트 위주로 완벽하게 정리해 드립니다!
1. SQL JOIN의 종류와 개념
JOIN은 둘 이상의 테이블을 연결하여 하나의 결과 집합으로 조회하는 연산입니다.

1.1. INNER JOIN (내부 조인):
- 개념: 두 테이블 간에 **조인 조건에 일치하는 공통 데이터(교집합)**만 조회합니다.
- 특징: 양쪽 테이블에 모두 존재하는 행만 결과로 출력됩니다.
- 예시: SELECT * FROM 사원 A INNER JOIN 부서 B ON A.부서코드 = B.부서코드;
2.2. LEFT OUTER JOIN (왼쪽 외부 조인):
- 개념: 왼쪽 테이블의 모든 데이터와 오른쪽 테이블 중 조건이 일치하는 데이터를 가져옵니다.
- 특징: 오른쪽 테이블에 매칭되는 데이터가 없으면 NULL로 채워집니다.
- 예시: SELECT * FROM 사원 A LEFT JOIN 부서 B ON A.부서코드 = B.부서코드;
3.3. RIGHT OUTER JOIN (오른쪽 외부 조인):
- 개념: 오른쪽 테이블의 모든 데이터와 왼쪽 테이블 중 조건이 일치하는 데이터를 가져옵니다.
- 특징: 왼쪽 테이블에 매칭되는 데이터가 없으면 NULL로 채워집니다.
- 예시: SELECT * FROM 사원 A RIGHT JOIN 부서 B ON A.부서코드 = B.부서코드;
4.4. FULL OUTER JOIN (완전 외부 조인):
- 개념: 양쪽 테이블의 **모든 데이터(합집합)**를 가져옵니다.
- 특징: 어느 한쪽에만 존재하는 데이터도 모두 포함하며, 일치하지 않는 매핑 영역은 NULL로 처리됩니다.
- 예시: SELECT * FROM 사원 A FULL OUTER JOIN 부서 B ON A.부서코드 = B.부서코드;
2. GROUP BY 절과 HAVING 절
데이터를 특정 기준 컬럼으로 그룹화한 후 집계 함수(COUNT, SUM, AVG, MAX, MIN 등)를 적용할 때 사용합니다.

WHERE 절 vs HAVING 절 차이점 분석
가장 자주 헷갈리는 포인트는 조건 필터링 위치입니다.
[ SQL 구문 실행 순서 (Evaluation Order) ]
1. FROM ---> 데이터베이스 테이블 참조
2. WHERE ---> 그룹화 전 개별 행(Row) 조건 필터링
3. GROUP BY ---> 지정한 컬럼 기준 데이터 그룹화
4. HAVING ---> 그룹화 후 집계(Aggregate) 결과 조건 필터링
5. SELECT ---> 최종 조회 대상 컬럼 추출
6. ORDER BY ---> 결과 데이터 정렬
| 구분 | WHERE 절 | HAVING 절 |
| 적용 시점 | GROUP BY 수행 전 (개별 행 단위 필터링) | GROUP BY 수행 후 (그룹화된 결과 필터링) |
| 집계 함수 사용 | 불가능 (SUM, AVG, COUNT 사용 불가) | 가능 (SUM, AVG, COUNT 조건 설정) |
| 주요 역할 | 전체 대상 중 불필요한 행을 미리 제거 | 그룹화된 통계 결과 중 조건에 맞는 그룹 추출 |
💡 한눈에 보는 SQL 구문 예시 (시험 및 실무 필수!)
SQL
-- 학과별 평균 평점이 3.5 이상인 학생 그룹 조회 예시
SELECT 학과, COUNT(*) AS 학생수, AVG(평점) AS 평균평점
FROM 학생
WHERE 학년 >= 2 -- 1. 2학년 이상인 학생만 필터링 (WHERE)
GROUP BY 학과 -- 2. 학과별로 그룹화 (GROUP BY)
HAVING AVG(평점) >= 3.5 -- 3. 학과별 평균 평점이 3.5 이상인 학과만 필터링 (HAVING)
ORDER BY 평균평점 DESC; -- 4. 평균 평점 내림차순 정렬 (ORDER BY)
| 연산자 / 구문 | 핵심 키워드 | 비고 |
| INNER JOIN | 교집합, 공통 데이터 | 가장 기본적인 조인 형태 |
| OUTER JOIN | 합집합/부분집합, NULL 보완 | 누락 데이터 조회가 필요할 때 사용 |
| WHERE | 개별 행 조건, 집계함수 불가 | 테이블 원본 데이터 필터링 |
| HAVING | 그룹 조건, 집계함수 가능 | GROUP BY와 한 쌍으로 작동 |
📌 핵심 기출 포인트 체크
- OUTER JOIN의 NULL 처리: 매칭되는 데이터가 없는 경우 해당 공간에 NULL이 할당됩니다.
- HAVING 절의 조건 대상: WHERE COUNT(*) >= 5처럼 WHERE 절에 집계 함수를 쓰면 에러가 발생하므로, 반드시 HAVING 절에 작성해야 합니다.
- SQL 실행 순서: FROM $\rightarrow$ WHERE $\rightarrow$ GROUP BY $\rightarrow$ HAVING $\rightarrow$ SELECT $\rightarrow$ ORDER BY 순서를 정확하게 숙지하세요.
반응형
'전공과목 > 데이터베이스' 카테고리의 다른 글
| [데이터베이스] 회복 기법(Recovery): 장애의 종류, 로그 기반 회복 및 검사점 기법 완벽 정리 (0) | 2026.09.06 |
|---|---|
| [데이터베이스] 트랜잭션(Transaction)의 개념, ACID 성질 및 동시성 제어 완벽 정리 (0) | 2026.09.05 |
| [데이터베이스] SQL 기초 및 핵심 문법: DDL, DML, DCL/TCL 완벽 정리 (0) | 2026.09.05 |
| [데이터베이스] 정규화(Normalization) 2: BCNF, 4NF, 5NF 및 역정규화(De-normalization) 완벽 정리 (0) | 2026.09.04 |
| [데이터베이스] 정규화(Normalization) 1: 정규화의 필요성과 이상 현상, 1NF·2NF·3NF 단계별 분해 완벽 정리 (0) | 2026.09.04 |