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실기 드릴 · 단답형

서브쿼리의 결과에 특정 값이 포함되는지만 확인하며, 한 행만 찾아도 즉시 중단하는 연산자는?