데이터를 넣었으면 꺼내야 한다. SQL에서 데이터를 조회할 때 쓰는 게 SELECT다. 단순히 전체를 가져오는 것부터 조건을 걸고 정렬하고 개수를 제한하는 것까지 — SELECT 하나에 옵션이 꽤 많다.
-- 모든 컬럼, 모든 행 조회
SELECT * FROM members;
*는 모든 컬럼을 뜻한다. 컬럼이 많을 때는 필요한 것만 명시하는 게 낫다.
SELECT member_name, email FROM members;
전체가 아니라 특정 조건에 맞는 행만 가져올 때 쓴다.
SELECT * FROM members WHERE member_id = 1;
| 연산자 | 의미 | 예시 |
|---|---|---|
= | 같다 | WHERE member_id = 1 |
!= / <> | 다르다 | WHERE member_id != 1 |
> / < | 크다 / 작다 | WHERE price > 10000 |
>= / <= | 크거나 같다 / 작거나 같다 | WHERE price >= 10000 |
조건을 여러 개 걸 때 쓴다.
-- 둘 다 만족하는 행
SELECT * FROM products WHERE price > 10000 AND stock > 0;
-- 하나라도 만족하는 행
SELECT * FROM members WHERE member_name = '김민수' OR member_name = '이지현';
범위 조건을 걸 때 쓴다. AND로 쓰는 것과 결과는 같지만 더 읽기 편하다.
-- 가격이 10000 이상 50000 이하인 상품
SELECT * FROM products WHERE price BETWEEN 10000 AND 50000;
여러 값 중 하나와 일치하는 행을 가져올 때 쓴다. OR를 여러 번 쓰는 것과 같다.
-- member_id가 1, 3, 5인 회원
SELECT * FROM members WHERE member_id IN (1, 3, 5);
문자열 패턴 매칭에 쓴다. %는 아무 문자 0개 이상, _는 아무 문자 정확히 1개를 뜻한다.
-- '김'으로 시작하는 이름
SELECT * FROM members WHERE member_name LIKE '김%';
-- 이메일이 '@gmail.com'으로 끝나는 회원
SELECT * FROM members WHERE email LIKE '%@gmail.com';
-- 이름이 정확히 3글자인 회원 ('_' 하나가 한 글자)
SELECT * FROM members WHERE member_name LIKE '___';
NULL은 =로 비교할 수 없다. NULL인지 확인할 때는 반드시 IS NULL을 써야 한다.
-- 전화번호가 없는 회원
SELECT * FROM members WHERE phone IS NULL;
-- 전화번호가 있는 회원
SELECT * FROM members WHERE phone IS NOT NULL;

조회 결과를 특정 컬럼 기준으로 정렬한다.
-- 가격 낮은 순 (오름차순, 기본값)
SELECT * FROM products ORDER BY price ASC;
-- 가격 높은 순 (내림차순)
SELECT * FROM products ORDER BY price DESC;
여러 컬럼으로 정렬할 수도 있다. 앞에 쓴 컬럼이 우선순위가 높다.
-- 가격 낮은 순으로 정렬하되, 가격이 같으면 이름 오름차순
SELECT * FROM products ORDER BY price ASC, product_name ASC;
결과 행의 수를 제한한다.
-- 가격 높은 순으로 상위 5개만
SELECT * FROM products ORDER BY price DESC LIMIT 5;
OFFSET을 함께 쓰면 몇 번째 행부터 가져올지 지정할 수 있다. 페이지 처리할 때 자주 쓰는 패턴이다.
-- 6번째 행부터 5개 (2페이지)
SELECT * FROM products ORDER BY price DESC LIMIT 5 OFFSET 5;
SELECT 쿼리를 쓸 때 절의 순서가 헷갈릴 수 있다. 작성 순서와 실제 실행 순서가 다르기 때문이다.
작성 순서
SELECT 컬럼
FROM 테이블
WHERE 조건
ORDER BY 컬럼
LIMIT 개수
실행 순서
1. FROM — 어느 테이블에서 가져올지
2. WHERE — 조건으로 행 필터링
3. SELECT — 가져올 컬럼 선택
4. ORDER BY — 정렬
5. LIMIT — 개수 제한
WHERE가 SELECT보다 먼저 실행되기 때문에, WHERE 절에서는 SELECT에서 붙인 별칭(alias)을 쓸 수 없다. 이 부분에서 처음에 한 번씩 막히는 경우가 있다.
| 절 | 역할 |
|---|---|
WHERE | 조건으로 행 필터링 |
BETWEEN | 범위 조건 |
IN | 여러 값 중 일치 |
LIKE | 문자열 패턴 매칭 |
IS NULL | NULL 여부 확인 |
ORDER BY | 정렬 |
LIMIT | 결과 개수 제한 |
SELECT는 옵션이 많아서 처음엔 복잡해 보이지만, 결국 "어디서(FROM), 뭘(SELECT), 어떤 조건으로(WHERE), 어떻게 정렬해서(ORDER BY), 몇 개(LIMIT)" 가져올지를 조합하는 것이다.