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)을 보여 달라."

SQL
SELECT title, price FROM books;

SELECT title, price보고 싶은 열을, FROM books꺼내 올 테이블을 정합니다. 모든 열을 보려면 *(별표):

SQL
SELECT * FROM books;
*는 편하지만 절제해서. *는 탐색할 땐 편하지만, 실제 쿼리에선 필요한 열만 명시하는 게 좋습니다. 테이블에 열이 많으면 불필요한 데이터를 끌어와 느려지고, 나중에 열이 추가되면 결과 형태가 예고 없이 바뀝니다. "지금 무슨 칸이 있나 둘러볼 때만 *"로 기억하세요.

4.2 WHERE: 조건으로 거르기

WHERE는 "조건에 맞는 행만" 골라 줍니다. SQL에서 가장 많이 쓰는 절(clause)입니다.

SQL
SELECT title, price FROM books WHERE price <= 12000 ORDER BY price;

출력:

CODE
title       price
----------  -----
노인과 바다   9000
이방인       10000
1984        11000
데미안       12000

쓸 수 있는 비교 연산자:

연산자
=같다WHERE author = '조지 오웰'
<> 또는 !=같지 않다WHERE stock <> 0
< <= > >=대소 비교WHERE price > 10000
등호가 하나(=)임에 주의하세요. 여러 프로그래밍 언어는 비교에 ==를 쓰지만, SQL의 비교는 = 하나입니다.

여러 조건 묶기: AND · OR

SQL
-- 12000원 미만이면서(AND) 재고가 있는 책
SELECT title, price, stock FROM books WHERE price < 12000 AND stock > 0;

출력:

CODE
title       price  stock
----------  -----  -----
노인과 바다   9000   7
이방인       10000  5

AND는 "둘 다 참", OR는 "하나라도 참"입니다. 둘을 섞을 땐 괄호로 의도를 분명히 하세요. ANDOR보다 먼저 묶이는 우선순위가 있어, 괄호 없이 섞으면 예상과 달라질 수 있습니다.

SQL
-- 괄호로 의도를 명확히: (조지 오웰 또는 카뮈) 이면서 가격 11000 이상
SELECT title, author, price FROM books
WHERE (author = '조지 오웰' OR author = '알베르 카뮈') AND price >= 11000;

4.3 ORDER BY: 정렬하기

결과 순서를 정합니다. ASC는 오름차순(작은→큰, 기본값), DESC는 내림차순(큰→작은).

SQL
-- 비싼 순으로
SELECT title, price FROM books ORDER BY price DESC;

여러 기준으로도 정렬됩니다. 앞 기준이 같을 때 뒤 기준으로 갈립니다.

SQL
-- 재고 많은 순, 같으면 가격 싼 순
SELECT title, stock, price FROM books ORDER BY stock DESC, price ASC;

글자(TEXT)는 사전 순으로, 날짜('2026-01-03' 형식)는 시간 순으로 정렬됩니다. 그 형식으로 날짜를 저장하는 이유가 여기 있습니다.

4.4 LIMIT: 개수 제한

상위 몇 개만 보고 싶을 때. "가장 비싼 책 3권"은 ORDER BY + LIMIT 조합입니다.

SQL
SELECT title, price FROM books ORDER BY price DESC LIMIT 3;

출력:

CODE
title       price
----------  -----
고서 필사본   50000
모비딕       15000
데미안       12000

LIMIT 3 OFFSET 3처럼 OFFSET을 붙이면 "앞 3개를 건너뛰고 다음 3개"가 되어, 페이지 넘기듯 데이터를 나눠 볼 수 있습니다(페이지네이션).

SQL
SELECT title, price FROM books ORDER BY price DESC LIMIT 3 OFFSET 3;  -- 4~6위

4.5 별칭(alias)과 계산

열에 계산하기

SELECT 자리엔 칸 이름뿐 아니라 계산식도 올 수 있습니다. 10% 할인가를 즉석에서 만들어 봅니다.

SQL
SELECT title, price, price * 0.9 AS sale_price FROM books WHERE price >= 12000;

출력:

CODE
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에서 진가를 발휘합니다.

SQL
SELECT b.title, b.price FROM books AS b WHERE b.price > 10000;

books AS bbooksb라 부르기로 하고, b.title처럼 짧게 씁니다. 한 테이블만 쓸 땐 군더더기지만, 여러 테이블을 합칠 땐 필수가 됩니다.

문자열·날짜 다루기 (맛보기)

SQLite는 여러 내장 함수를 제공합니다. 자주 쓰는 몇 가지:

SQL
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이 실제로 실행되는 순서라는 중요한 비밀을 다룹니다.

직접 해 보기

  1. 재고(stock)가 5권 이상인 책의 제목과 재고를, 재고 많은 순으로 보세요.
  2. 가격이 9000원 이상 13000원 이하인 책을 AND로 골라 보세요.
  3. 모든 책에 대해 제목과 "정가 대비 20% 할인가"를 AS discounted로 함께 보여 주세요.
  4. 가장 싼 책 2권을 ORDER BY + LIMIT으로 찾아보세요.
  5. (생각해 보기) SELECT * FROM booksSELECT title, price FROM books는 결과가 어떻게 다른가요? 실무에선 왜 후자를 권할까요?
← 3부 INSERT·UPDATE·DELETE · 목차 · 다음: 필터링 심화 →