이제까지 배운 걸 다 합쳐서 SELECT, WHERE, ORDER BY를 조합해서 간단하지만 쓸모 있는 쿼리를 만들어보자. 이 스킬은 유저 리스트 뽑기부터 간단한 리포트 만들기까지 여러 상황에서 진짜 유용하게 써먹을 수 있어.
시작하기 전에, 기본 SQL 쿼리 구조가 어떻게 생겼는지 다시 한 번 짚고 가자:
SELECT 컬럼1, 컬럼2, 컬럼3
FROM 테이블
WHERE 조건
ORDER BY 컬럼 ASC
LIMIT 행_개수
OFFSET 행_개수;
만약 SQL이 문학작품이라면 SELECT는 챕터 제목, FROM은 그 내용, WHERE는 스토리 설명 같은 거야. 그리고 ORDER BY는 읽기 쉽게 순서를 정리해주는 역할이지!
연산자 순서는 꼭 지켜야 해. 몇 개는 생략할 수 있지만, 순서를 바꾸면 안 돼.
예제 1: 성적이 좋은 학생 이름 뽑기
students라는 테이블이 있다고 가정해보자. 구조랑 데이터는 이래:
| id | name | age | grade |
|---|---|---|---|
| 1 | Otto | 21 | A |
| 2 | Maria | 22 | B |
| 3 | Alex | 20 | A |
| 4 | Nat | 23 | C |
| 5 | Dan | 25 | B |
성적이 A인 학생들만 이름순으로 뽑고 싶어. 이렇게 하면 돼:
SELECT name
FROM students
WHERE grade = 'A'
ORDER BY name ASC;
결과:
| name |
|---|
| Alex |
| Otto |
설명:
SELECT name— 이름만 뽑아. 필요 없는 데이터까지 굳이 가져올 필요 없어.WHERE grade = 'A'— 성적이 A인 애들만 필터링.ORDER BY name ASC— 이름을 알파벳순으로 정렬.
예제 2: 가격으로 상품 찾기
이번엔 products라는 테이블이 있다고 해보자. 상품 정보가 들어있어:
| id | product_name | category | price |
|---|---|---|---|
| 1 | 스마트폰 | Electronics | 30000 |
| 2 | 텔레비전 | Electronics | 45000 |
| 3 | 냉장고 | Appliances | 50000 |
| 4 | 청소기 | Appliances | 15000 |
| 5 | 전구 | Lighting | 500 |
우리 목표는 "Electronics" 카테고리 상품만 가격 내림차순으로 뽑는 거야. 쿼리는 이렇게:
SELECT product_name, price
FROM products
WHERE category = 'Electronics'
ORDER BY price DESC;
결과:
| product_name | price |
|---|---|
| 텔레비전 | 45000 |
| 스마트폰 | 30000 |
설명:
SELECT product_name, price— 상품 이름이랑 가격만 뽑아.WHERE category = 'Electronics'— "Electronics" 카테고리만 필터링.ORDER BY price DESC— 가격 높은 순서대로 정렬 (가장 비싼 게 먼저 나와).
예제 3: 논리 연산자 조합해서 복잡한 필터 만들기
students 테이블을 다시 써보자. 21살 넘고, 성적이 B 또는 C인 학생을 나이순으로 뽑고 싶어. 조건이 여러 개라 이렇게 조합해야 해:
SELECT name, age, grade
FROM students
WHERE age > 21 AND (grade = 'B' OR grade = 'C')
ORDER BY age ASC;
결과:
| name | age | grade |
|---|---|---|
| Maria | 22 | B |
| Nat | 23 | C |
| Dan | 25 | B |
설명:
WHERE age > 21— 21살 넘는 학생만 뽑아.AND (grade = 'B' OR grade = 'C')— 성적이 B 또는 C인 애들만 필터링. 괄호로 조건을 묶어줘야 해.ORDER BY age ASC— 나이순(어린 순)으로 정렬.
예제 4: 정렬과 필터링 조합하기
products 테이블로 돌아가자. 50,000보다 싼 상품만 뽑고, 카테고리별로 정렬, 그리고 같은 카테고리 안에서는 가격순(오름차순)으로 정렬하고 싶어.
SELECT product_name, category, price
FROM products
WHERE price < 50000
ORDER BY category ASC, price ASC;
결과:
| product_name | category | price |
|---|---|---|
| 청소기 | Appliances | 15000 |
| 스마트폰 | Electronics | 30000 |
| 텔레비전 | Electronics | 45000 |
| 전구 | Lighting | 500 |
설명:
WHERE price < 50000— 먼저 50,000보다 싼 상품만 남겨.ORDER BY category ASC, price ASC— 카테고리별로(알파벳순), 같은 카테고리 안에서는 가격 오름차순으로 정렬.
예제 5: 자주 하는 실수 — 조건 괄호 빼먹기
이제 뭔가 잘못될 수도 있는 상황을 보자. 논리 연산자 쓸 때 괄호를 빼먹으면 어떻게 될까?
잘못된 쿼리:
SELECT name, age, grade
FROM students
WHERE age > 21 AND grade = 'B' OR grade = 'C'
ORDER BY age ASC;
여기서 OR grade = 'C'는 AND age > 21이랑 상관없이 실행돼서, 성적이 C인 학생은 나이 상관없이 다 나와버려.
그래서 항상 괄호를 써서 조건을 명확하게 해줘야 해:
WHERE age > 21 AND (grade = 'B' OR grade = 'C')
GO TO FULL VERSION