topic★★★★★난이도 · 약 35분
서브쿼리 & 집계
SELECT 안의 SELECT. GROUP BY와 집계 함수(COUNT/SUM/AVG/MAX/MIN).
#SQL#서브쿼리#GROUP BY#실기핵심
왜 배우는가
`EXISTS` / `NOT EXISTS` / `IN`의 차이, `COUNT(*)` vs `COUNT(컬럼)`의 NULL 처리 차이가 실기 단골.
서브쿼리는 다른 SQL 문 안에 중첩된 SELECT 구문이다. 단일행/다중행/다중열 세 종류로 나뉘고, 외부 쿼리를 참조하는지에 따라 와 비상관 서브쿼리로 구분한다.
sql
-- 단일행 서브쿼리: 평균보다 높은 점수
SELECT 이름, 점수
FROM 학생
WHERE 점수 > (SELECT AVG(점수) FROM 학생);
-- 다중행 서브쿼리: IN
SELECT 이름
FROM 학생
WHERE 학과 IN (
SELECT 이름 FROM 학과 WHERE 단과대 = '공과대'
);
-- 상관 서브쿼리: EXISTS
SELECT 이름
FROM 사원 e
WHERE EXISTS (
SELECT 1 FROM 프로젝트 p WHERE p.사원ID = e.id
);는 여러 행을 요약한다. WHERE 절은 그룹화 전 행을 필터링하고, HAVING 절은 그룹화 후 그룹을 필터링한다. GROUP BY는 관계와 깊이 연결된다 — SELECT 절에 그룹 컬럼 또는 집계 함수만 올 수 있다는 규칙이 그 증거다.
sql
-- 학과별 평균 점수 (10명 이상인 학과만, 평균 80 이상)
SELECT 학과, COUNT(*) AS 인원, AVG(점수) AS 평균
FROM 학생
WHERE 점수 IS NOT NULL -- 집계 전 필터
GROUP BY 학과
HAVING COUNT(*) >= 10
AND AVG(점수) >= 80 -- 집계 후 필터
ORDER BY 평균 DESC;COUNT(*) vs COUNT(컬럼) — `COUNT(*)`는 NULL 포함 전체 행 수, `COUNT(컬럼)`은 그 컬럼이 NULL이 아닌 행 수만. 이 차이가 단답형 함정.
EXISTS vs IN — EXISTS는 서브쿼리 결과의 존재 여부만 확인하므로 한 행만 찾으면 멈춘다. IN은 서브쿼리 결과 전체와 비교한다. 일반적으로 데이터가 많을 때 EXISTS가 유리.
실기 드릴 3문항
database실기 드릴 · SQL 작성
학과별 평균 점수가 80점 이상인 학과만 조회하는 SQL을 작성하시오.
edit실기 드릴 · 단답형
다음 두 결과가 서로 다른 이유를 한 줄로 설명하시오. `COUNT(*)` vs `COUNT(전화번호)`
edit실기 드릴 · 단답형
서브쿼리의 결과에 특정 값이 포함되는지만 확인하며, 한 행만 찾아도 즉시 중단하는 연산자는?