4부 · 묻기의 기본 (1) SELECT 기초
← 3부 INSERT·UPDATE·DELETE · 목차 · 다음: 필터링 심화 →
여기서부터가 SQL의 진짜 재미입니다. 쌓아 둔 데이터에 질문을 던지고 답을 받습니다. 모든 질문의 출발점은 단 하나의 명령, SELECT입니다. 이 챕터에서 SELECT·FROM·WHERE·ORDER BY·LIMIT과 별칭·연산을 익히면, 한 테이블에 대한 웬만한 질문은 다 할 수 있게 됩니다.
flowchart LR
A[테이블 구조] --> C[행 추가]
C --> E["묻기 · 고르기 · 거르기<br/>SELECT · WHERE · ORDER BY"]
classDef here fill:#d5f2e0,stroke:#27ae60,color:#000,stroke-width:3px
classDef dim fill:#eee,stroke:#bbb,color:#888
class E here
class A,C dim
이 부의 모든 예제는 3부 3.1에서 채운 공용 데이터(고객 4·책 6·주문 8)를 씁니다. 데이터가 없다면 먼저 채우세요. 출력은 실제 실행 결과 그대로입니다.
4.1 SELECT · FROM: 무엇을 어디서
가장 기본형: "어느 테이블(FROM)에서 어떤 칸(SELECT)을 보여 달라."
SELECT title, price FROM books;
SELECT title, price는 보고 싶은 열을, FROM books는 꺼내 올 테이블을 정합니다. 모든 열을 보려면 *(별표):
SELECT * FROM books;
*는 편하지만 절제해서.*는 탐색할 땐 편하지만, 실제 쿼리에선 필요한 열만 명시하는 게 좋습니다. 테이블에 열이 많으면 불필요한 데이터를 끌어와 느려지고, 나중에 열이 추가되면 결과 형태가 예고 없이 바뀝니다. "지금 무슨 칸이 있나 둘러볼 때만*"로 기억하세요.
4.2 WHERE: 조건으로 거르기
WHERE는 "조건에 맞는 행만" 골라 줍니다. SQL에서 가장 많이 쓰는 절(clause)입니다.
SELECT title, price FROM books WHERE price <= 12000 ORDER BY price;
출력:
title price ---------- ----- 노인과 바다 9000 이방인 10000 1984 11000 데미안 12000
쓸 수 있는 비교 연산자:
| 연산자 | 뜻 | 예 |
|---|---|---|
= | 같다 | WHERE author = '조지 오웰' |
<> 또는 != | 같지 않다 | WHERE stock <> 0 |
< <= > >= | 대소 비교 | WHERE price > 10000 |
등호가 하나(=)임에 주의하세요. 여러 프로그래밍 언어는 비교에==를 쓰지만, SQL의 비교는=하나입니다.
여러 조건 묶기: AND · OR
-- 12000원 미만이면서(AND) 재고가 있는 책 SELECT title, price, stock FROM books WHERE price < 12000 AND stock > 0;
출력:
title price stock ---------- ----- ----- 노인과 바다 9000 7 이방인 10000 5
AND는 "둘 다 참", OR는 "하나라도 참"입니다. 둘을 섞을 땐 괄호로 의도를 분명히 하세요. AND가 OR보다 먼저 묶이는 우선순위가 있어, 괄호 없이 섞으면 예상과 달라질 수 있습니다.
-- 괄호로 의도를 명확히: (조지 오웰 또는 카뮈) 이면서 가격 11000 이상 SELECT title, author, price FROM books WHERE (author = '조지 오웰' OR author = '알베르 카뮈') AND price >= 11000;
4.3 ORDER BY: 정렬하기
결과 순서를 정합니다. ASC는 오름차순(작은→큰, 기본값), DESC는 내림차순(큰→작은).
-- 비싼 순으로 SELECT title, price FROM books ORDER BY price DESC;
여러 기준으로도 정렬됩니다. 앞 기준이 같을 때 뒤 기준으로 갈립니다.
-- 재고 많은 순, 같으면 가격 싼 순 SELECT title, stock, price FROM books ORDER BY stock DESC, price ASC;
글자(TEXT)는 사전 순으로, 날짜('2026-01-03' 형식)는 시간 순으로 정렬됩니다. 그 형식으로 날짜를 저장하는 이유가 여기 있습니다.
4.4 LIMIT: 개수 제한
상위 몇 개만 보고 싶을 때. "가장 비싼 책 3권"은 ORDER BY + LIMIT 조합입니다.
SELECT title, price FROM books ORDER BY price DESC LIMIT 3;
출력:
title price ---------- ----- 고서 필사본 50000 모비딕 15000 데미안 12000
LIMIT 3 OFFSET 3처럼 OFFSET을 붙이면 "앞 3개를 건너뛰고 다음 3개"가 되어, 페이지 넘기듯 데이터를 나눠 볼 수 있습니다(페이지네이션).
SELECT title, price FROM books ORDER BY price DESC LIMIT 3 OFFSET 3; -- 4~6위
4.5 별칭(alias)과 계산
열에 계산하기
SELECT 자리엔 칸 이름뿐 아니라 계산식도 올 수 있습니다. 10% 할인가를 즉석에서 만들어 봅니다.
SELECT title, price, price * 0.9 AS sale_price FROM books WHERE price >= 12000;
출력:
title price sale_price ---------- ----- ---------- 모비딕 15000 13500.0 데미안 12000 10800.0 고서 필사본 50000 45000.0
price * 0.9라는 계산 결과 열에 AS sale_price로 별칭(alias) 을 붙였습니다. 별칭이 없으면 열 이름이 price * 0.9라는 식 그대로 나와 보기 흉합니다. 별칭은 결과를 읽기 좋게 하고, 나중에 다른 도구로 넘길 때도 깔끔한 이름을 줍니다.
테이블에도 별칭
테이블에도 짧은 별명을 줄 수 있는데, 이건 5부의 JOIN에서 진가를 발휘합니다.
SELECT b.title, b.price FROM books AS b WHERE b.price > 10000;
books AS b로 books를 b라 부르기로 하고, b.title처럼 짧게 씁니다. 한 테이블만 쓸 땐 군더더기지만, 여러 테이블을 합칠 땐 필수가 됩니다.
문자열·날짜 다루기 (맛보기)
SQLite는 여러 내장 함수를 제공합니다. 자주 쓰는 몇 가지:
SELECT upper(author) AS author_upper, length(title) AS title_len FROM books; -- upper: 영문 대문자로, length: 글자 수 SELECT title, published, strftime('%Y', published) AS year FROM books WHERE published IS NOT NULL; -- strftime('%Y', ...): 날짜에서 연도만 추출
함수는 종류가 많으니 지금 다 외울 필요는 없습니다. "이런 게 가능하다"만 알아 두고, 필요할 때 부록이나 공식 문서를 찾으면 됩니다.
4.6 정리
- 모든 질문은
SELECT 칸 FROM 테이블에서 출발한다. 둘러볼 땐*, 실제 쿼리는 필요한 열만. WHERE로 조건에 맞는 행만 거른다. 비교는=,<>,<,>=등. 여러 조건은AND/OR로 묶되 괄호로 의도를 분명히.ORDER BY로 정렬(ASC/DESC), 여러 기준 가능.LIMIT(+OFFSET)으로 개수를 제한한다.SELECT에 계산식을 넣고AS로 별칭을 붙여 읽기 좋게 만든다. 테이블 별칭은JOIN에서 빛난다.upper·length·strftime같은 내장 함수로 값을 가공할 수 있다.
다음 챕터에서 WHERE를 더 깊게 팝니다. 패턴 검색(LIKE), 목록·범위(IN·BETWEEN), NULL 다루기, 조건 분기(CASE), 중복 제거(DISTINCT), 그리고 SQL이 실제로 실행되는 순서라는 중요한 비밀을 다룹니다.
직접 해 보기
- 재고(
stock)가 5권 이상인 책의 제목과 재고를, 재고 많은 순으로 보세요. - 가격이 9000원 이상 13000원 이하인 책을
AND로 골라 보세요. - 모든 책에 대해 제목과 "정가 대비 20% 할인가"를
AS discounted로 함께 보여 주세요. - 가장 싼 책 2권을
ORDER BY+LIMIT으로 찾아보세요. - (생각해 보기)
SELECT * FROM books와SELECT title, price FROM books는 결과가 어떻게 다른가요? 실무에선 왜 후자를 권할까요?
← 3부 INSERT·UPDATE·DELETE · 목차 · 다음: 필터링 심화 →