SQL SELECT 완전 정복 - WHERE, ORDER BY, GROUP BY, 집계함수
요약
SQL SELECT 문의 WHERE, IN, LIKE, ORDER BY, DISTINCT, 집계함수(COUNT, SUM, AVG, MIN, MAX), GROUP BY, HAVING, UNION을 정보처리기사 실기 기출문제와 함께 학습합니다.
SELECT 핵심 정리
SELECT는 DML(데이터 조작어)에 속하는 명령어로, 테이블1에서 데이터를 조회할 때 사용합니다.
아래 표는 SQL 작성 순서 기준입니다. 실행 순서는 이와 다릅니다(아래 "SQL 실행 순서" 참고).
SQL 실행 순서
SQL문은 작성 순서와 실행 순서가 다릅니다.
시험에서 실행 결과를 구할 때, 이 순서대로 단계별로 풀면 됩니다.
SELECT 기본 구문
모든 컬럼을 조회하려면 *(와일드카드7)를 사용합니다.
WHERE - 조건으로 행 필터링
비교 연산자
| 연산자 | 의미 | 예시 |
|---|---|---|
| = | 같다 | WHERE DEPT = '개발' |
!= 또는 <> | 같지 않다 | WHERE DEPT != '영업' |
>, < | 크다, 작다 | WHERE SAL > 3000 |
>=, <= | 크거나 같다, 작거나 같다 | WHERE SAL >= 3000 |
IN - 여러 값 중 하나와 일치
컬럼명 = 값1 OR 컬럼명 = 값2 OR 컬럼명 = 값3과 같은 의미입니다.
예시:
LIKE - 패턴 매칭
| 와일드카드 | 의미 | 예시 |
|---|---|---|
% | 0개 이상의 임의 문자 | '개%' → 개, 개발, 개발팀 모두 일치 (0개도 포함) |
_ | 정확히 1개의 임의 문자 | '_감자' → 아무 글자 1개 + 감자 (총 3글자) |
LIKE 패턴 예시:
| 패턴 | 의미 | 일치하는 값 |
|---|---|---|
'S%' | S로 시작 | SMITH, SCOTT |
'%T%' | T를 포함 | SMITH, SCOTT |
'_미%' | 두번째 글자가 미 | 김미정, 이미란 |
BETWEEN - 범위 조건
값1 이상 값2 이하와 같은 의미입니다 (양 끝값 포함).
예시:
AND / OR 우선순위
위 조건은 AND가 먼저 평가되어 아래와 같이 해석됩니다.
각 행별 조건 평가 예시:
| EMPNO | SAL | EMPNO > 100 AND SAL > 3000 | EMPNO = 200 | 최종 (OR) |
|---|---|---|---|---|
| 100 | 1000 | FALSE | FALSE | FALSE |
| 200 | 3000 | FALSE | TRUE | TRUE |
| 300 | 1500 | FALSE | FALSE | FALSE |
EMPNO=200 행에서 SAL=3000이지만 조건은 SAL > 3000(초과)이므로 FALSE입니다. 3000은 3000보다 크지 않습니다. EMPNO > 100 AND SAL > 3000이 FALSE이더라도 EMPNO = 200이 TRUE이면 OR로 최종 TRUE가 됩니다.
ORDER BY - 정렬
| 옵션 | 의미 |
|---|---|
| ASC | 오름차순 (기본값, 생략 가능) |
| DESC | 내림차순 |
여러 컬럼으로 정렬할 때는 쉼표로 구분합니다. 앞에 쓴 컬럼이 먼저 정렬되고, 앞 컬럼 값이 같은 행끼리는 다음 컬럼으로 정렬합니다.
정렬 전/후 비교:
정렬 전 원본 데이터:
| 부서위치 | 부서명 |
|---|---|
| 서울 | 개발 |
| 부산 | 영업 |
| 서울 | 기획 |
| 부산 | 총무 |
ORDER BY 부서위치 DESC, 부서명 DESC 적용 후:
| 부서위치 | 부서명 |
|---|---|
| 서울 | 기획 |
| 서울 | 개발 |
| 부산 | 총무 |
| 부산 | 영업 |
부서위치를 내림차순(서울 → 부산)으로 먼저 정렬하고, 부서위치가 같은 "서울" 행끼리는 부서명을 내림차순(기획 → 개발)으로 정렬합니다.
DISTINCT - 중복 제거
조회 결과에서 중복된 값을 제거합니다.
예시:
감자(GAMJA) 테이블에 알감자 10개, 왕감자 30개, 돼지감자 50개가 있을 때:
집계 함수
| 함수 | 설명 |
|---|---|
COUNT(*) | 모든 행의 개수 (NULL8 포함) |
COUNT(컬럼명) | NULL이 아닌 값의 개수 |
SUM(컬럼명) | 합계 |
AVG(컬럼명) | 평균 |
MIN(컬럼명) | 최솟값 |
MAX(컬럼명) | 최댓값 |
예시:
| C1 | C2 |
|---|---|
| 2 | NULL |
| 3 | 6 |
| 2 | 3 |
| NULL | 5 |
| 4 | 5 |
GROUP BY + HAVING
GROUP BY - 그룹화
지정한 컬럼의 값이 같은 행끼리 묶어서 그룹별로 집계합니다.
HAVING - 그룹 조건 필터링
GROUP BY로 만든 그룹에 조건을 걸어 필터링합니다.
예시 (단계별):
원본 데이터(회사 테이블):
| 부서명 | 부서인원 |
|---|---|
| 개발 | 5 |
| 영업 | 8 |
| 개발 | 7 |
| 총무 | 3 |
| 영업 | 4 |
단계별 처리 과정:
1단계 GROUP BY 부서명 후 집계:
| 부서명 | SUM(부서인원) |
|---|---|
| 개발 | 12 |
| 영업 | 12 |
| 총무 | 3 |
2단계 HAVING SUM(부서인원) >= 10 필터링 후 최종 결과:
| 부서명 | 부서인원합계 |
|---|---|
| 개발 | 12 |
| 영업 | 12 |
별칭 (AS)
조회 결과의 컬럼명에 임시 이름(별칭)을 지정합니다. AS는 생략 가능합니다. 별칭은 출력 화면에만 적용되며, 같은 쿼리의 WHERE/HAVING 절에서는 사용할 수 없습니다.
UNION - 집합 연산
두 개의 SELECT 결과를 합칩니다. JOIN은 두 테이블을 좌우(컬럼 방향)로 합치지만, UNION은 두 쿼리의 결과를 위아래(행 방향)로 합칩니다.
UNION은 중복을 제거합니다. 위 쿼리에서 T1과 T2에 같은 값이 있으면 한 번만 나타납니다.
주의: 두 SELECT문의 컬럼 수와 데이터 타입이 일치해야 합니다. 일치하지 않으면 오류가 발생합니다.
INTERSECT / EXCEPT 예시:
정보처리기사 실기 대비 문제
Footnotes
-
테이블(Table): 행과 열로 구성된 데이터 저장 구조. 관계형 DB에서 릴레이션(Relation)이라고도 합니다. ↩
-
컬럼(Column): 테이블에서 세로 방향의 데이터 항목. 속성(Attribute)이라고도 합니다. 예: 이름, 나이, 부서명. ↩
-
집계함수: COUNT, SUM, AVG, MIN, MAX처럼 여러 행의 값을 하나의 결과로 계산하는 함수. ↩
-
별칭(Alias): 조회 결과 컬럼명에 임시로 붙이는 이름.
AS키워드로 지정하며 AS는 생략 가능합니다. ↩ -
행(Row): 테이블에서 가로 방향의 데이터 한 건. 튜플(Tuple)이라고도 합니다. 예: 홍길동/25/개발팀. ↩
-
그룹화: 특정 컬럼의 값이 같은 행끼리 묶어 집계 계산을 적용하는 것. ↩
-
와일드카드(Wildcard): "모두"를 의미하는 특수 기호.
SELECT *에서*는 "모든 컬럼"을 뜻합니다. ↩ -
NULL: 값이 없음(미입력)을 의미하는 특수 값. 0이나 공백('')과는 다릅니다. ↩
-
합집합: A와 B 둘 다를 합친 결과. UNION은 중복을 자동 제거합니다. ↩
-
교집합: A와 B 모두에 속하는 결과만 반환합니다. ↩
-
차집합: A에는 있지만 B에는 없는 결과만 반환합니다. Oracle에서는 EXCEPT 대신 MINUS를 사용합니다. ↩