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 (모두보다 작은) = < MINANY 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인터랙티브 레슨 시작