정보처리기사 실기 SQL SELECT·WHERE·ORDER BY 결과 읽기

2026. 9. 30. 21:12ㆍWORK/커리어

저녁 열차 창가에 앉아 작은 복습 카드를 살펴보는 수험생

이 글은 LIFE ARCHITECTURE의 WORK 카테고리 ‘일하며 공부하는 구조’ 기록입니다. 퇴근 후 짧은 시간에 자격증 공부를 이어가려면 의지보다 ‘한 번에 끝낼 수 있는 작은 단위’로 공부를 쪼개는 구조가 필요합니다. 이번에는 정보처리기사 실기 SQL을 예로, 문제 하나를 세 가지 질문으로 나눠 읽는 방법을 정리했습니다.

퇴근길에 SQL 문제를 다시 펼친다. SELECT와 WHERE의 뜻은 기억나는데, 마지막 결과 표를 쓰려니 손이 멈춘다. 어떤 사람을 남겨야 하는지, 어떤 열을 적어야 하는지, 같은 점수는 어떻게 정렬해야 하는지가 한꺼번에 섞이기 때문이다.

SQL 결과를 읽을 때는 세 가지 질문을 나누면 된다. 어떤 행이 남는가, 어떤 열이 출력되는가, 어떤 순서로 놓이는가이다. 오늘은 작은 공부 기록 표 하나로 SELECT·WHERE·ORDER BY의 결과를 끝까지 따라간다. 아래 표는 결과를 한 줄씩 따라가 보기 위해 직접 만든 예제다.

1. 먼저 표의 한 행이 무엇을 뜻하는지 정한다

다음 study 표에서 한 행은 한 사람의 공부 기록이다. id는 중복되지 않는 기록 번호이고, minutes는 공부 시간이다. score는 확인 문제의 점수이며 NULL은 점수가 기록되지 않았다는 뜻이다. NULL을 0점으로 바꾸어 읽지 않는다.

id name subject minutes score
1 민수 SQL 40 80
2 지연 Python 30 90
3 도윤 SQL 20 80
4 서연 SQL 35 NULL
5 하준 C 50 70
6 수빈 SQL 30 90

열 이름부터 확인하는 이유가 있다. 공부 시간이 긴 사람을 찾는 조건과 점수가 높은 사람을 찾는 조건은 다르다. 숫자만 보면 비슷해 보이지만 비교할 열이 달라지면 결과도 달라진다.

풀이를 시작하기 전에 표 옆에 ‘행은 기록, minutes는 시간, score는 점수’라고 짧게 적는다. 문제의 데이터를 자기 말로 설명할 수 있으면 SQL 문장을 읽을 기준이 생긴다.

2. 작성 순서와 결과를 해석하는 순서를 구분한다

SQL은 보통 다음 순서로 작성한다.

SELECT name, minutes
FROM study
WHERE subject = 'SQL' AND minutes >= 30
ORDER BY minutes DESC, id ASC;

그러나 이 간단한 조회문을 손으로 풀 때는 FROM으로 원본 표를 확인하고, WHERE로 남길 행을 고른 다음, SELECT로 출력할 열을 정하고, ORDER BY로 최종 순서를 판단한다. 복잡한 집계나 윈도 함수가 없는 이번 예제의 논리적 풀이 순서이다. 데이터베이스가 실제로 내부 작업을 수행하는 물리적 실행 순서를 고정한다는 뜻은 아니다.

구문 풀이할 때 묻는 질문
FROM study 어느 표의 기록인가
WHERE 어떤 기록이 조건을 만족하는가
SELECT name, minutes 결과에 어떤 열을 어떤 순서로 적는가
ORDER BY 남은 기록을 어떤 기준으로 정렬하는가

처음부터 완성된 결과를 머릿속으로 만들려 하지 않는다. 중간에 남는 id만 적어도 풀이가 한결 가벼워진다.

3. WHERE는 조건이 참인 행만 남긴다

첫 예제의 조건은 SQL을 공부했고, 공부 시간이 30분 이상인 기록이다. AND는 두 조건을 모두 만족해야 한다는 뜻이다.

id subject = 'SQL' minutes >= 30 남기는가
1 참 참 남긴다
2 거짓 참 제외한다
3 참 거짓 제외한다
4 참 참 남긴다
5 거짓 참 제외한다
6 참 참 남긴다

남는 기록은 id 1, 4, 6이다. 아직 이름만 적거나 정렬할 필요는 없다. 필터 단계에서는 누가 살아남는지만 확인한다.

>= 30은 30을 포함한다. 수빈의 30분 기록은 남는다. 조건을 > 30으로 바꾸면 수빈은 제외된다. 작은 등호 하나가 결과 행 수를 바꾼다.

문자열 값인 SQL은 작은따옴표로 감싼다. 이 글에서는 'SQL'처럼 문자열을 쓰고, 열 이름인 subject에는 작은따옴표를 붙이지 않는다.

4. SELECT는 남은 행에서 필요한 열을 꺼낸다

필터를 통과한 기록에서 SELECT가 요구한 name, minutes만 출력한다. id와 subject는 조건 판단에 사용했지만 최종 표에 쓰라는 요청은 없다.

SELECT name, minutes와 SELECT minutes, name은 출력 열의 순서가 다르다. 결과값을 맞혔더라도 열 위치를 뒤바꾸면 요청한 표와 달라진다.

SELECT가 일반적으로 중복값을 자동 제거하지 않는다는 점도 기억한다. 두 사람이 같은 점수를 받아도 서로 다른 기록은 그대로 남는다. 중복 제거는 DISTINCT처럼 별도 지정이 필요하다. 오늘은 행 필터와 열 선택을 익히기 위해 DISTINCT를 사용하지 않는다.

이 단계의 작은 행동은 출력할 열 제목부터 쓰는 것이다. 값보다 먼저 name | minutes를 적어 두면 풀이 도중 열을 추가하거나 빠뜨릴 가능성이 줄어든다.

5. ORDER BY는 첫 기준이 같을 때 다음 기준을 사용한다

첫 예제는 ORDER BY minutes DESC, id ASC이다. minutes가 큰 기록부터 놓고, minutes가 같을 때만 id가 작은 기록을 먼저 놓는다. 결과는 다음과 같다.

name minutes
민수 40
서연 35
수빈 30

이번에는 점수 조건으로 바꾸어 동점을 읽어 본다.

SELECT name, score
FROM study
WHERE subject = 'SQL' AND score >= 80
ORDER BY score DESC, id ASC;

남는 기록은 id 1, 3, 6이다. 점수 90인 수빈이 먼저 나오고, 80점인 민수와 도윤은 id 1과 3의 순서로 놓인다.

name score
수빈 90
민수 80
도윤 80

ORDER BY score DESC, id에서 id의 방향을 생략하면 기본값인 ASC이다. DESC 하나가 뒤의 모든 열에 적용되는 것은 아니다.

동점인데 두 번째 정렬 기준이 없다면 그 안의 순서를 단정할 수 없다. ORDER BY 자체가 없는 경우에도 삽입 순서나 원본 표에 적힌 순서가 보장된다고 생각하지 않는다. 이번 예제는 고유한 id를 마지막 기준으로 사용해 결과 순서를 분명하게 만들었다.

6. AND와 OR가 섞이면 괄호가 검색 범위를 바꾼다

다음 조건은 얼핏 ‘SQL 또는 Python을 35분 이상 공부한 사람’처럼 보인다.

SELECT id
FROM study
WHERE subject = 'SQL' OR subject = 'Python' AND minutes >= 35
ORDER BY id ASC;

그러나 AND가 OR보다 우선한다. 이 조건은 다음처럼 읽는다.

WHERE subject = 'SQL'
   OR (subject = 'Python' AND minutes >= 35)

따라서 SQL 기록은 시간에 관계없이 남는다. Python 기록은 35분 이상일 때만 남는데, 지연은 30분이므로 제외된다. 결과 id는 1, 3, 4, 6이다.

원래 의도가 두 과목 모두에 35분 기준을 적용하는 것이라면 괄호를 바꾼다.

SELECT id
FROM study
WHERE (subject = 'SQL' OR subject = 'Python') AND minutes >= 35
ORDER BY id ASC;

이때는 id 1, 4만 남는다. 괄호가 정리하는 것은 보기 좋은 모양만이 아니다. 어떤 기록에 조건을 적용할지를 정한다.

조건이 길어지면 먼저 한국어로 읽어 본다. ‘SQL 전체 또는 35분 이상 Python’과 ‘SQL·Python 중 35분 이상’은 다른 요구이다. 실제 업무에서 조회 조건을 작성할 때도 이 차이는 그대로 중요하다.

7. NULL은 0이나 빈 문자열처럼 비교하지 않는다

서연의 score는 NULL이다. score >= 80은 참이 아니므로 앞의 점수 조회에서는 제외된다. SQL의 WHERE는 조건 결과가 참인 행만 남기며, 거짓이나 알 수 없음은 남기지 않는다.

점수가 기록되지 않은 SQL 공부 기록을 찾으려면 다음처럼 쓴다.

SELECT name, score
FROM study
WHERE subject = 'SQL' AND score IS NULL
ORDER BY id ASC;
name score
서연 NULL

score = NULL을 사용하지 않는다. 일반적인 SQL 비교에서 NULL과의 등호 비교는 참이 되지 않는다. NULL 여부는 IS NULL 또는 IS NOT NULL로 확인한다.

NULL이 정렬에서 기본적으로 앞에 오는지 뒤에 오는지는 DBMS에 따라 다를 수 있다. PostgreSQL은 ASC에서 기본적으로 NULL을 뒤에, DESC에서 앞에 놓는다. 다른 DBMS에도 그대로 적용되는 규칙으로 외우지 않는다. 문제에 DBMS나 NULL 정렬 조건이 주어졌다면 그 조건부터 확인한다. 앞의 점수 예제는 WHERE에서 NULL이 제외되므로 이런 차이가 결과에 영향을 주지 않는다.

8. 짧은 문제 하나를 결과 표까지 직접 완성한다

같은 study 표로 다음 SQL의 결과를 구한다. 먼저 WHERE를 통과하는 id를 적고, name과 minutes를 꺼낸 뒤 정렬해 본다.

SELECT name, minutes
FROM study
WHERE subject = 'SQL' AND minutes BETWEEN 20 AND 35
ORDER BY minutes ASC, id DESC;

BETWEEN 20 AND 35는 양 끝값인 20과 35를 포함한다. SQL 기록 중 해당 구간에 들어오는 id는 3, 4, 6이다. 시간을 작은 값부터 정렬하면 20, 30, 35가 된다. 이 데이터에는 시간 동점이 없으므로 두 번째 기준인 id DESC가 최종 순서를 바꾸지는 않는다.

name minutes
도윤 20
수빈 30
서연 35

답이 다르다면 틀린 종류를 나누어 적는다. 서연을 빼먹었다면 경계값을 확인하고, 민수를 넣었다면 필터를 확인한다. 열이 다르다면 SELECT를, 순서가 반대라면 ASC와 DESC를 확인한다.

SQL 문제를 다시 푸는 목적은 정답을 기억하는 데 그치지 않는다. 어느 단계에서 판단이 달라졌는지를 발견하는 데 있다.

9. 오늘의 복습은 한 문장을 설명하는 데서 마친다

지금 할 수 있는 복습은 길지 않다. 첫 예제의 SQL을 보고 ‘SQL을 30분 이상 공부한 기록에서 이름과 시간을 보여 주고, 긴 시간부터 정렬한다’라고 설명한다. 그 문장과 결과 표가 서로 맞는지 확인한다.

Q-Net의 정보처리기사 안내에서 실기는 정보처리 실무, 필답형 2시간 30분으로 안내된다. 2026년 적용 출제기준은 2026년 1월 1일부터 12월 31일까지의 자료가 별도로 등록되어 있다. 시험을 준비할 때는 자신의 응시 회차 안내와 수험표를 기준으로 일정을 확인한다.

공부 시간이 충분하지 않은 저녁에도 한 문제의 결과를 끝까지 설명할 수 있다면 남는 것이 있다. 오늘은 범위를 넓히기보다, 어떤 행을 남겼고 왜 그 순서가 되었는지 한 번 더 말해 본다.

정답 표 뒤에는 설명할 수 있는 판단이 있어야 한다.

참고 자료 · 2026년 9월 30일 확인

함께 읽으면 좋은 글
일주일 시간 사용 기록으로 반복 지출 시간을 찾는 법 — 공부할 시간을 만드는 첫 단계
생산적인 하루를 설계하는 방법 — 퇴근 후 공부를 하루 구조에 넣는 법

반응형