Ch.9 데이터베이스 (필기 3과목)

SQL 심화 — JOIN·서브쿼리·집계 함수

INNER JOIN과 OUTER JOIN의 차이를 설명하고 구문을 작성할 수 있다집계 함수(COUNT, SUM, AVG, MAX, MIN)와 GROUP BY를 조합할 수 있다서브쿼리(단일행/다중행)의 위치와 연산자를 구분할 수 있다

두 테이블을 하나로 합쳐서 조회하는 마법의 키워드

학생 테이블과 수강 테이블을 합쳐 '이름 + 과목 + 성적'을 한 번에 보고 싶은 상황

테이블이 분리되어 있으면 한 번의 SELECT로는 정보를 합칠 수 없습니다

JOIN서브쿼리, 집계 함수는 SQL의 핵심이며 매회 3~4문제 출제됩니다


article

핵심 내용

-- INNER JOIN: 양쪽 모두에 있는 행만 결합
SELECT 학생.이름, 수강.과목명, 수강.성적
FROM 학생
INNER JOIN 수강 ON 학생.학번 = 수강.학번;

-- LEFT OUTER JOIN: 왼쪽 전부 + 오른쪽 매칭 (없으면 NULL)
SELECT 학생.이름, 수강.과목명
FROM 학생
LEFT JOIN 수강 ON 학생.학번 = 수강.학번;
-- → 수강 기록 없는 학생도 표시 (과목명 = NULL)
-- 집계 함수 5가지
SELECT COUNT(*)    -- 행 수
     , SUM(성적)   -- 합계
     , AVG(성적)   -- 평균
     , MAX(성적)   -- 최댓값
     , MIN(성적)   -- 최솟값
FROM 수강;

-- GROUP BY + HAVING
SELECT 학과, AVG(성적) AS 평균성적
FROM 학생 JOIN 수강 ON 학생.학번 = 수강.학번
GROUP BY 학과
HAVING AVG(성적) >= 80
ORDER BY 평균성적 DESC;

WHERE vs HAVING 구분 = 시험 매회 출제! WHERE = 개별 행 필터 (집계함수 불가), HAVING = 그룹 필터 (집계함수 가능)

-- 단일행 서브쿼리 (결과가 1행)
SELECT 이름
FROM 학생
WHERE 학번 = (SELECT 학번 FROM 수강
               WHERE 성적 = (SELECT MAX(성적) FROM 수강));

-- 다중행 서브쿼리 (결과가 여러 행) → IN, ANY, ALL 사용
SELECT 이름
FROM 학생
WHERE 학번 IN (SELECT 학번 FROM 수강 WHERE 과목 = '데이터베이스');

-- 다중행 연산자
-- > ANY (하나라도 큰)  = > MIN
-- > ALL (모두보다 큰)  = > MAX
-- < ANY (하나라도 작은) = < MAX
-- < ALL (모두보다 작은) = < MIN

ANY vs ALL 변환: > ANY = > MIN(서브쿼리), > ALL = > MAX(서브쿼리). 이 변환이 시험에 자주 나옵니다!

학생 테이블과 수강 테이블을 JOIN할 때, 수강 기록이 없는 학생도 표시하려면?

GROUP BY 이후 그룹 조건을 지정하는 절은?

서브쿼리 결과가 여러 행일 때 사용할 수 없는 연산자는?

compare_arrows

비교 정리

항목JOIN결과NULL 포함
INNER JOIN양쪽 모두 매칭되는 행만없음
LEFT OUTER JOIN왼쪽 전부 + 오른쪽 매칭오른쪽이 NULL
RIGHT OUTER JOIN오른쪽 전부 + 왼쪽 매칭왼쪽이 NULL
FULL OUTER JOIN양쪽 모두 전부양쪽 모두 NULL 가능
CROSS JOIN모든 행의 조합 (곱집합)없음
image

시각 자료

다이어그램: cc-mg013
check_circle

핵심 정리

  • 1INNER JOIN = 양쪽 매칭만, LEFT JOIN = 왼쪽 전부 + 오른쪽 NULL 가능
  • 2집계 함수: COUNT, SUM, AVG, MAX, MIN — NULL은 제외 (COUNT(*) 제외)
  • 3WHERE = 행 필터 (집계함수 불가), HAVING = 그룹 필터 (집계함수 가능)
  • 4서브쿼리: 단일행(=, >, <), 다중행(IN, ANY, ALL)
  • 5> ANY = > MIN, > ALL = > MAX 변환 공식 암기

퀴즈와 인터랙션으로 더 깊이 학습하세요

play_circle인터랙티브 레슨 시작