본문 바로가기
전공과목/데이터베이스

[데이터베이스] SQL 고급 문법: 다양한 JOIN 종류와 GROUP BY, HAVING 절 완벽 정리

by 아임코딩 2026. 9. 5.
반응형

"여러 테이블에 분산된 데이터를 한 번에 가져오려면 어떤 JOIN을 사용해야 할까요?"

"그룹화된 통계 데이터에서 조건을 걸 때 WHERE 절을 써야 할까요, HAVING 절을 써야 할까요?"

관계형 데이터베이스(RDBMS)의 진가는 여러 테이블의 데이터를 하나로 결합하는 JOIN 연산집계 데이터를 그룹별로 추출하는 GROUP BY / HAVING 절을 활용할 때 드러납니다.

이번 글에서는 INNER JOIN, OUTER JOIN의 차이점WHERE 절 vs HAVING 절의 핵심 차이를 실무 및 시험 필수 포인트 위주로 완벽하게 정리해 드립니다!

1. SQL JOIN의 종류와 개념

JOIN은 둘 이상의 테이블을 연결하여 하나의 결과 집합으로 조회하는 연산입니다.

SQL JOIN의 유형별 벤다이어그램 구조. 출처: Piscine / Getty Images

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 등)를 적용할 때 사용합니다.

GROUP BY 그룹화 및 HAVING 필터링 동작 방식 (출처: w3resource). 출처: w3resource

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와 한 쌍으로 작동

📌 핵심 기출 포인트 체크

  1. OUTER JOIN의 NULL 처리: 매칭되는 데이터가 없는 경우 해당 공간에 NULL이 할당됩니다.
  2. HAVING 절의 조건 대상: WHERE COUNT(*) >= 5처럼 WHERE 절에 집계 함수를 쓰면 에러가 발생하므로, 반드시 HAVING 절에 작성해야 합니다.
  3. SQL 실행 순서: FROM $\rightarrow$ WHERE $\rightarrow$ GROUP BY $\rightarrow$ HAVING $\rightarrow$ SELECT $\rightarrow$ ORDER BY 순서를 정확하게 숙지하세요.
반응형