본문으로 건너뛰기

SELECT 기본: 조건과 정렬

정보처리기사 목차SQL 기본레슨 90 / 233

목차

SELECT 문은 표에서 원하는 행과 열을 골라 봅니다. WHERE 절이 조건에 맞는 행만 남기고, ORDER BY 절이 남은 행의 차례를 정합니다.

학생 표 전체가 아니라 '3학년 학생'이나 '이름이 김으로 시작하는 학생'만 보고 싶을 때가 많습니다. 행을 거르는 일은 WHERE 절이 맡습니다. 조건은 비교 연산자와 BETWEEN·IN·LIKE·IS NULL로 씁니다. 결과를 학년 차례로 보고 싶으면 ORDER BY 절을 붙입니다. 실기는 요구를 읽고 SELECT 문을 쓰게 하거나, 주어진 SELECT 문의 결과를 쓰게 합니다.

9단계 중 1단계. FROM 학생이 학생 표의 7행을 가져옵니다.

그림은 절을 하나씩 더해 가며, 단계마다 학생 7행에서 다시 시작합니다.

1WHERE로 행 거르기

FROM 학생이 학생 표의 7행을 가져옵니다. WHERE 학년 = 3은 학년이 3인 행만 남깁니다. WHERE는 조건이 참인 행만 남깁니다. 비교 연산자에는 =·<>(같지 않다)·>·>=·<·<=가 있습니다. AND는 두 조건이 모두 참일 때, OR는 하나라도 참일 때 행을 남깁니다.

2BETWEEN·IN·LIKE

BETWEEN 2 AND 3은 2 이상 3 이하입니다. 양 끝값을 포함해서 5행이 남습니다. IN ('EE', 'BA')는 목록의 값 가운데 하나와 같으면 참입니다. BA 학과에는 학생이 없어 EE 학생 3행만 남습니다. LIKE는 글자 틀(패턴)에 맞는지 봅니다. %는 0자 이상 아무 글자라서, '김%'는 김으로 시작하는 이름입니다. _는 정확히 한 글자입니다. '_민%'는 둘째 글자가 민인 이름이라 김민수와 최민준이 남습니다. 김지민은 민이 셋째 글자라 빠집니다.

학생 이름에 패턴을 대 보면 다음과 같습니다.

패턴뜻맞는 이름
'김%'김으로 시작김민수 · 김지민
'%민'민으로 끝남김지민
'%민%'민이 들어 있음김민수 · 김지민 · 최민준
'_민%'둘째 글자가 민김민수 · 최민준

3NULL은 비교로 걸러지지 않는다

학과코드가 NULL인 강도현을 학과코드 = NULL로 찾으면 한 행도 나오지 않습니다. NULL과 견준 결과는 참이 되지 않기 때문입니다. NULL은 IS NULL로 찾습니다.

4ORDER BY와 DISTINCT

ORDER BY 학년 DESC, 이름은 행을 거르지 않고 차례만 바꿉니다. 학년이 높은 차례(DESC, 내림차순)로 세우고, 학년이 같으면 이름 차례(ASC, 오름차순)로 세웁니다. ASC는 기본값이라 생략합니다. SELECT DISTINCT 학년은 같은 값을 하나만 남겨 1, 2, 3 세 행을 냅니다.

예제

절은 다음 차례로 씁니다. 대괄호는 생략할 수 있는 부분입니다.

SELECT [DISTINCT] 열, …
FROM 표
[WHERE 조건]
[ORDER BY 열 [ASC | DESC]];

WHERE와 IN

SELECT 학번,
  학과코드
FROM 학생
WHERE 학과코드 IN ('EE', 'BA')
ORDER BY 학번;
학번학과코드
104EE
105EE
106EE

IN ('EE', 'BA')는 학과코드 = 'EE' OR 학과코드 = 'BA'⁠와 같습니다.

LIKE

SELECT 학번,
  이름
FROM 학생
WHERE 이름 LIKE '_민%'
ORDER BY 학번;
학번이름
101김민수
105최민준

NULL 찾기

다음 쿼리는 한 행도 돌려주지 않습니다. 강도현의 학과코드도 NULL이지만, NULL과 =로 견준 결과는 참이 아니기 때문입니다.

SELECT 학번,
  이름
FROM 학생
WHERE 학과코드 = NULL;

IS NULL로 쓰면 강도현이 나옵니다. NULL이 아닌 행은 IS NOT NULL로 찾습니다.

SELECT 학번,
  이름
FROM 학생
WHERE 학과코드 IS NULL;
학번이름
107강도현

ORDER BY

SELECT 학번,
  이름,
  학년
FROM 학생
ORDER BY 학년 DESC, 이름;
학번이름학년
101김민수3
106정하윤3
105최민준3
103김지민2
102이서준2
107강도현1
104박서연1

DISTINCT

SELECT DISTINCT 학년
FROM 학생
ORDER BY 학년;
학년
1
2
3

시험 포인트

  • 필기: LIKE의 %는 0자 이상, _는 정확히 한 글자입니다. NULL은 =나 <>로 견주면 참이 되지 않아 빠지고, IS NULL로 찾습니다. BETWEEN은 양 끝값을 포함합니다. 결과 행 수를 묻는 문제에서는 NULL인 행과 DISTINCT를 먼저 봅니다.
  • 실기: 요구를 SELECT 문으로 씁니다 — 조건은 WHERE, 패턴은 LIKE와 %·_, NULL은 IS NULL, 정렬은 ORDER BY와 DESC, 중복 제거는 DISTINCT. 주어진 SELECT 문의 결과를 행 차례대로 씁니다.

확인 문제

1. 수강 표의 점수 열에는 12개의 값(85·75·80·70·60·65·55·75·95·100·90·50)이 들어 있습니다. WHERE 점수 BETWEEN 70 AND 85⁠에 맞는 행 수로 알맞은 것을 고르세요.

  • ① 3행
  • ② 4행
  • ③ 5행
  • ④ 8행
정답

③입니다. BETWEEN은 양 끝값을 포함해 70 이상 85 이하를 남깁니다. 85·75·80·70·75 다섯 행입니다.

  • ① 양 끝값 둘을 모두 빼고 셌습니다. 70 초과 85 미만이면 75·80·75 세 행입니다.
  • ② 한쪽 끝값만 포함한다고 봤습니다. 70을 빼면 85·75·80·75 네 행입니다.
  • ④ 아래쪽 끝값만 보고 70 이상을 모두 셌습니다. 위쪽 끝값 85까지 함께 걸러야 합니다.

2. 과목 표(과목코드·과목명·학점·선수과목)와 수강 표를 조회합니다. (가)~(라)에 맞는 조건이나 문장을 SQL 키워드로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

  • (가) 과목명이 '자'로 시작하는 과목만 남기는 조건
  • (나) 과목명의 둘째 글자가 '료'인 과목만 남기는 조건
  • (다) 선수과목을 적지 않은 과목만 남기는 조건
  • (라) 수강 표에 있는 과목코드를 겹치지 않게 한 번씩, 코드의 거꾸로 차례로 보이는 SELECT 문 전체
정답

받는 답: (가) WHERE 과목명 LIKE '자%' · (나) WHERE 과목명 LIKE '_료%' · (다) WHERE 선수과목 IS NULL · (라) 아래 블록

(가)는 뒤에 몇 글자가 오든 좋으니 %를, (나)는 앞이 정확히 한 글자이니 _를 씁니다. (다)는 값이 비어 있음을 =로 견줄 수 없어 IS NULL을 씁니다.

SELECT DISTINCT 과목코드
FROM 수강
ORDER BY 과목코드 DESC;
과목코드
OS
NW
DS
  • 틀리는 꼴 (가) LIKE '자_': _는 정확히 한 글자라 네 글자인 자료구조가 맞지 않습니다. 글자 수를 정하지 않을 때는 %입니다.
  • 틀리는 꼴 (다) 선수과목 = NULL: NULL과 =로 견준 결과는 참이 되지 않아 한 행도 나오지 않습니다.
  • 틀리는 꼴 (라) DISTINCT 없이 쓴 꼴: 수강 표에는 같은 과목코드가 여러 행 있어 12행이 그대로 나옵니다. 거꾸로 차례는 DESC로 밝힙니다.

3. 과목 표와 수강 표를 조회합니다. (1)~(3)을 차례로 풀어 보세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

(1) 다음 쿼리는 선수과목이 비어 있는 자료구조를 찾지 못합니다. 자료구조까지 함께 나오게 ①에 들어갈 조건을 쓰세요. 괄호는 빈칸 표시입니다.

SELECT 과목명
FROM 과목
WHERE 선수과목 <> 'OS'
  OR ( ① );

(2) (1)의 결과를 과목명 차례로 세우려면 어떤 절을 한 줄 더 붙일까요?

(3) 수강 표에서 점수가 70점과 85점 사이(양 끝값 포함)인 행의 학번과 점수를, 점수가 높은 차례로, 점수가 같으면 학번 차례로 조회하는 SELECT 문을 쓰세요.

정답

받는 답: (1) 선수과목 IS NULL · (2) ORDER BY 과목명 · (3) 아래 둘째 블록

(1)·(2)를 더하면 운영체제와 자료구조가 나옵니다. 네트워크는 선수과목이 OS라 빠집니다.

SELECT 과목명
FROM 과목
WHERE 선수과목 <> 'OS'
  OR 선수과목 IS NULL
ORDER BY 과목명;
과목명
운영체제
자료구조

(3)은 다음과 같습니다. 75점이 두 행이라 학번을 둘째 기준으로 두어야 차례가 정해집니다.

SELECT 학번,
  점수
FROM 수강
WHERE 점수
    BETWEEN 70 AND 85
ORDER BY 점수 DESC, 학번;
학번점수
10185
10180
10175
10475
10270
  • 틀리는 꼴 (1) 선수과목 = NULL: 빈 값을 =로 찾았습니다. 한 행도 더해지지 않아 운영체제만 나옵니다.
  • 틀리는 꼴 (3) 점수 > 70 AND 점수 < 85: 양 끝값을 뺀 조건입니다. 70점과 85점이 빠져 3행이 됩니다.
  • 틀리는 꼴 (3) ORDER BY를 점수 하나로만 쓴 꼴: 같은 75점 두 행의 차례가 정해지지 않습니다.

더 자세히: SQLD의 WHERE 절 · ORDER BY 절

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

정보처리기사 목차로