테마
SELECT 기본·정렬·그룹
SELECT는 테이블에서 원하는 행과 열을 골라 보여 주는 조회 문이다. 실기 시험은 짧은 테이블과 SQL을 주고 결과 값이나 결과 행 수를 쓰게 하거나, 조건에 맞는 SQL의 빈칸을 채우게 한다. 이 문서는 조건 검색, 정렬, 집계 함수(aggregate function), 그룹 조회를 다룬다.
예제 테이블
예제는 모두 아래 학생 테이블을 쓴다. 정새벽의 학과코드는 NULL, 즉 값이 없다는 표시이고 0이나 빈 문자열과 다르다.
| 학번 | 이름 | 학과코드 | 학년 | 점수 |
|---|---|---|---|---|
| 1001 | 김하늘 | CS | 3 | 85 |
| 1002 | 이바다 | CS | 2 | 70 |
| 1003 | 박구름 | EE | 3 | 90 |
| 1004 | 최들판 | EE | 1 | 60 |
| 1005 | 정새벽 | NULL | 2 | 75 |
기본 형식과 조건
절은 SELECT 열 FROM 테이블 WHERE 조건 GROUP BY 열 HAVING 조건 ORDER BY 열 순서로 쓰고, SELECT와 FROM 말고는 생략할 수 있다.
WHERE는 행 하나하나를 걸러 낸다. 비교 연산자는 =, <>(같지 않다), >, >=, <, <=이고, AND·OR·NOT으로 묶는다. 시험에 자주 나오는 조건 연산자는 다음과 같다.
| 연산자 | 뜻 |
|---|---|
BETWEEN a AND b | a 이상 b 이하, 양 끝 포함 |
IN (…) | 목록 중 하나와 같음 |
LIKE | 문자 패턴. % 0글자 이상, _ 딱 1글자 |
IS NULL | 값이 없는 행 |
NULL과 비교하면 참도 거짓도 아닌 '알 수 없음'이 되어 행이 걸러진다. 그래서 WHERE 학과코드 = NULL은 0행이고, NULL은 반드시 IS NULL로 찾는다. DISTINCT는 중복 행을 하나만 남긴다.
정렬
ORDER BY는 결과 순서를 정한다. 오름차순 ASC가 기본값이고 DESC는 내림차순이다. 열을 여러 개 쓰면 앞 열 값이 같은 행끼리만 뒤 열로 다시 정렬한다. ORDER BY 학년 DESC, 점수 ASC는 3학년부터 나오고, 같은 학년 안에서는 점수가 낮은 학생이 먼저다. ORDER BY가 없으면 행 순서는 보장되지 않는다.
집계 함수와 GROUP BY·HAVING
집계 함수는 여러 행을 값 하나로 줄인다. COUNT(개수), SUM(합), AVG(평균), MAX(최댓값), MIN(최솟값)이 기본이고, 시험에는 STDDEV(표준편차)·VARIANCE(분산)도 나온다. COUNT(*)는 행 자체를 세므로 5이지만, COUNT(학과코드)는 NULL을 빼고 세서 4다. SUM·AVG도 NULL을 빼고 계산한다.
GROUP BY는 같은 값을 가진 행끼리 묶어 그룹마다 집계 결과를 한 행씩 낸다. HAVING은 그렇게 만든 그룹에 조건을 거는 절이다. WHERE는 묶기 전의 행을 거르고, HAVING은 묶은 뒤의 그룹을 거른다. 그래서 집계 함수 조건(COUNT(*) >= 2)은 WHERE가 아니라 HAVING에 쓴다.
sql
SELECT 학과코드, COUNT(*) AS 인원
FROM 학생
GROUP BY 학과코드
HAVING COUNT(*) >= 2;결과는 CS 2, EE 2의 두 행이다. NULL도 하나의 그룹이 되지만 인원이 1이라 HAVING에서 빠진다. AS는 결과 열에 별칭(alias)을 붙인다.
시험 포인트
- 절 작성 순서: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY.
- 그룹에 조건 → HAVING, 행에 조건 → WHERE.
COUNT(*)는 NULL 행도 센다.COUNT(열)·SUM·AVG는 NULL을 뺀다.- NULL 검색은
= NULL이 아니라 IS NULL. - 정렬 기본값은 ASC. 결과 순서를 묻는 문제는
ORDER BY를 먼저 확인한다.
