원하는 데이터만 골라 보는 조회의 기본
조회는 큰 장부에서 작은 표를 만드는 일입니다
데이터베이스에 들어 있는 테이블은 생각보다 큽니다. 고객 테이블에는 이름, 전화번호, 이메일, 주소, 가입일, 등급, 메모가 함께 들어 있을 수 있습니다. 주문 테이블에는 주문번호, 고객번호, 주문일, 결제금액, 배송상태, 결제수단 등이 들어갑니다.
하지만 업무를 할 때 항상 모든 항목이 필요한 것은 아닙니다. 마케팅 문자를 보낼 때는 고객 이름과 휴대전화 번호만 필요할 수 있습니다. 가입 고객 현황을 볼 때는 이름, 이메일, 가입일만 있으면 충분합니다. 매출 확인을 할 때는 주문일과 결제금액을 먼저 보게 됩니다.
SELECT 문은 큰 표에서 필요한 열을 골라 업무용 작은 결과표를 만드는 기본 도구입니다. 여기에 정렬을 붙이면 보고 싶은 순서로 정리할 수 있고, 개수 제한을 붙이면 일부 결과만 먼저 확인할 수 있습니다. 엑셀에서 필요한 열만 남기고, 보기 좋은 순서로 정렬한 뒤, 새 시트에 작은 표를 만드는 것과 비슷합니다.
단, "서울 고객만", "결제 완료 주문만"처럼 조건에 맞는 행만 고르는 방법은 다음 장에서 배울 WHERE가 담당합니다. 이번 장에서는 먼저 SELECT로 필요한 컬럼을 고르고, ORDER BY, LIMIT, DISTINCT로 조회 결과를 읽기 좋게 다루는 기본기를 익히겠습니다.
이번 장에서는 다음 네 가지를 익힙니다.
필요한 컬럼만 고르기
원하는 순서로 정렬하기
일부 결과만 미리 보기
중복 없는 목록 만들기
예시는 아래와 같은 테이블이 있다고 가정합니다.
| 테이블 | 용도 | 주요 컬럼 |
|---|---|---|
customers | 고객 명단 | customer_id, customer_name, email, city, joined_at |
orders | 주문 내역 | order_id, customer_id, order_date, total_amount, status |
products | 상품 목록 | product_id, product_name, category, price, stock_quantity |
AI 생성 이미지
필요한 컬럼만 선택하기
지난 장에서 SELECT *는 모든 컬럼을 보여 달라는 뜻이라고 배웠습니다. 처음 테이블을 살펴볼 때는 편리합니다. 하지만 실무에서는 필요한 컬럼만 선택하는 습관이 더 좋습니다.
컬럼을 적게 보면 결과가 읽기 쉽습니다. 실수로 민감한 정보를 볼 가능성도 줄어듭니다. 데이터가 많은 테이블에서는 불필요한 정보를 덜 가져오므로 작업도 더 가벼워집니다.
하려는 일: 고객 명단에서 고객 이름, 이메일, 가입일만 보고 싶습니다.
SELECT customer_name, email, joined_at
FROM customers;결과는 이런 작은 표처럼 나옵니다.
| customer_name | joined_at | |
|---|---|---|
| 김민지 | [email protected] | 2026-01-03 |
| 박준호 | [email protected] | 2026-01-10 |
| 이서연 | [email protected] | 2026-02-01 |
이 문장은 이렇게 읽으면 됩니다.
SELECT customer_name, email, joined_at: 이 세 컬럼을 보여 주세요.FROM customers:customers테이블에서 가져오세요.
컬럼을 여러 개 쓸 때는 쉼표로 구분합니다. 마지막 컬럼 뒤에는 쉼표를 붙이지 않습니다.
잘못된 예는 다음과 같습니다.
SELECT customer_name, email, joined_at,
FROM customers;joined_at 뒤의 쉼표 때문에 오류가 납니다. 초보자가 자주 만나는 오류입니다. SQL이 실행되지 않으면 먼저 쉼표 위치를 확인하세요.
컬럼 순서는 결과표의 순서입니다
SELECT에 쓴 컬럼 순서가 결과표의 열 순서가 됩니다. 테이블 안에 저장된 실제 컬럼 순서와 달라도 괜찮습니다.
하려는 일: 고객 명단을 볼 때 가입일을 먼저 보고, 그다음 고객 이름과 이메일을 보고 싶습니다.
SELECT joined_at, customer_name, email
FROM customers;결과는 가입일이 첫 번째 열로 표시됩니다.
| joined_at | customer_name | |
|---|---|---|
| 2026-01-03 | 김민지 | [email protected] |
| 2026-01-10 | 박준호 | [email protected] |
| 2026-02-01 | 이서연 | [email protected] |
이 기능은 단순하지만 유용합니다. 보고서를 만들 때 사람들이 먼저 봐야 하는 항목을 앞에 둘 수 있습니다. 예를 들어 주문 확인표라면 주문일, 주문번호, 결제금액 순서가 읽기 편할 수 있습니다.
하려는 일: 주문 내역에서 주문일, 주문번호, 결제금액만 보고 싶습니다.
SELECT order_date, order_id, total_amount
FROM orders;결과 해석은 간단합니다. 주문 테이블 전체에서 세 컬럼만 꺼내어 주문 확인용 작은 표를 만든 것입니다.
ORDER BY로 원하는 순서 만들기
테이블에 저장된 데이터는 우리가 보고 싶은 순서로 항상 나오지 않습니다. 고객 가입일순으로 보고 싶을 수도 있고, 최근 주문부터 보고 싶을 수도 있습니다. 금액이 큰 주문부터 확인해야 할 때도 있습니다.
이때 사용하는 문장이 ORDER BY입니다. ORDER BY는 조회 결과를 특정 컬럼 기준으로 정렬합니다.
정렬에는 두 방향이 있습니다.
| 표현 | 뜻 | 예시 |
|---|---|---|
ASC | 오름차순 | 오래된 날짜부터, 작은 금액부터, 가나다순 |
DESC | 내림차순 | 최신 날짜부터, 큰 금액부터, 가나다 역순 |
ASC는 기본값이라 생략할 수 있습니다. 하지만 처음 연습할 때는 뜻을 분명히 하기 위해 써 보는 것도 좋습니다.
하려는 일: 고객을 가입일이 오래된 순서부터 보고 싶습니다.
SELECT customer_name, email, joined_at
FROM customers
ORDER BY joined_at ASC;결과는 가입일이 빠른 고객부터 나옵니다.
| customer_name | joined_at | |
|---|---|---|
| 김민지 | [email protected] | 2026-01-03 |
| 박준호 | [email protected] | 2026-01-10 |
| 이서연 | [email protected] | 2026-02-01 |
하려는 일: 고객을 최근 가입한 순서부터 보고 싶습니다.
SELECT customer_name, email, joined_at
FROM customers
ORDER BY joined_at DESC;이번에는 가입일이 늦은 고객이 위에 나옵니다.
| customer_name | joined_at | |
|---|---|---|
| 이서연 | [email protected] | 2026-02-01 |
| 박준호 | [email protected] | 2026-01-10 |
| 김민지 | [email protected] | 2026-01-03 |
업무에서는 최신순 정렬을 자주 씁니다. 최근 주문, 최근 가입 고객, 최근 상담 내역을 먼저 확인하는 일이 많기 때문입니다.
정렬 기준이 같은 행이 여러 개 있을 때는 그 안에서의 순서가 매번 기대한 대로 보이지 않을 수 있습니다. 예를 들어 같은 날짜에 가입한 고객이 많다면, 그 고객들끼리는 이름순으로도 보일 수 있고 다른 순서로도 보일 수 있습니다. 이런 경우에는 뒤에서 보듯이 정렬 기준을 하나 더 붙이면 됩니다.
금액 높은순으로 주문 확인하기
정렬은 날짜뿐 아니라 숫자에도 사용할 수 있습니다. 예를 들어 결제금액이 큰 주문부터 확인하면 큰 거래를 먼저 점검할 수 있습니다.
하려는 일: 주문 내역에서 결제금액이 높은 주문부터 보고 싶습니다.
SELECT order_id, order_date, total_amount, status
FROM orders
ORDER BY total_amount DESC;결과는 결제금액이 큰 주문부터 표시됩니다.
| order_id | order_date | total_amount | status |
|---|---|---|---|
| 1004 | 2026-02-03 | 185000 | paid |
| 1002 | 2026-01-15 | 92000 | paid |
| 1001 | 2026-01-12 | 35000 | shipped |
ORDER BY total_amount DESC는 결제금액을 큰 값에서 작은 값으로 정렬하라는 뜻입니다.
반대로 낮은 금액부터 확인하려면 다음처럼 씁니다.
하려는 일: 결제금액이 낮은 주문부터 보고 싶습니다.
SELECT order_id, order_date, total_amount, status
FROM orders
ORDER BY total_amount ASC;ASC를 생략해도 결과는 같습니다.
SELECT order_id, order_date, total_amount, status
FROM orders
ORDER BY total_amount;처음에는 ASC와 DESC를 직접 써서 방향을 눈에 익히는 편이 좋습니다.
정렬 기준은 여러 개를 쓸 수도 있습니다. 예를 들어 결제금액이 큰 주문부터 보되, 금액이 같으면 최근 주문을 먼저 보고 싶다면 이렇게 씁니다.
SELECT order_id, order_date, total_amount, status
FROM orders
ORDER BY total_amount DESC, order_date DESC;쉼표 앞의 기준을 먼저 적용하고, 값이 같을 때 쉼표 뒤의 기준을 다시 적용한다고 이해하면 됩니다.
LIMIT로 일부만 미리 보기
실무 데이터는 수천 건, 수만 건이 될 수 있습니다. 처음부터 전체를 조회하면 화면이 복잡해지고, 도구가 느려질 수 있습니다. 그래서 새 테이블을 볼 때는 일부만 먼저 확인하는 습관이 중요합니다.
PostgreSQL에서는 LIMIT를 사용해 결과 개수를 제한할 수 있습니다.
하려는 일: 고객 테이블에서 10명만 미리 보고 싶습니다.
SELECT customer_id, customer_name, email, joined_at
FROM customers
LIMIT 10;이 문장은 customers 테이블에서 네 컬럼을 조회하되, 결과를 최대 10줄까지만 보여 달라는 뜻입니다.
다만 ORDER BY 없이 LIMIT만 쓰면 "어떤 기준으로 앞의 10줄인지"는 분명하지 않습니다. 처음 테이블의 모양을 대충 확인하는 용도라면 괜찮지만, "최근 10명", "금액 상위 10건"처럼 의미 있는 10건을 보고 싶을 때는 반드시 정렬 기준을 함께 써야 합니다.
LIMIT는 특히 처음 보는 테이블에서 유용합니다.
하려는 일: 상품 테이블의 구조와 값이 어떤 모습인지 5개만 확인하고 싶습니다.
SELECT product_id, product_name, category, price, stock_quantity
FROM products
LIMIT 5;결과를 보고 나면 이런 것을 빠르게 확인할 수 있습니다.
상품명이 어떤 형식으로 저장되어 있는지
카테고리 값이 한글인지 영어인지
가격 컬럼에 숫자가 제대로 들어 있는지
재고 수량이 어떤 단위로 관리되는지
LIMIT는 데이터를 바꾸지 않습니다. 조회 결과를 적게 보여 줄 뿐입니다. 그래서 부담 없이 사용할 수 있는 안전한 조회 도구입니다.
ORDER BY와 LIMIT를 함께 쓰기
LIMIT만 쓰면 어느 10개가 나오는지 명확하지 않을 수 있습니다. 그래서 실무에서는 ORDER BY와 함께 쓰는 경우가 많습니다.
하려는 일: 최근 가입한 고객 5명만 보고 싶습니다.
SELECT customer_name, email, joined_at
FROM customers
ORDER BY joined_at DESC
LIMIT 5;이 문장은 두 단계로 이해하면 쉽습니다.
joined_at DESC로 최근 가입 고객이 위로 오게 정렬합니다.그중에서 위의 5줄만 보여 줍니다.
결과는 최근 가입 고객 확인표가 됩니다.
하려는 일: 결제금액이 가장 큰 주문 3건만 보고 싶습니다.
SELECT order_id, order_date, total_amount, status
FROM orders
ORDER BY total_amount DESC
LIMIT 3;결과 해석은 명확합니다. 주문 내역 전체를 금액 높은순으로 정렬한 뒤, 상위 3건만 가져온 것입니다. 매출 관리자가 큰 주문을 먼저 확인할 때 쓸 수 있습니다.
여기서 중요한 점은 순서입니다. 사람의 말로는 "상위 3건을 보여 줘"라고 말하지만, SQL에서는 먼저 어떤 기준으로 상위인지 정해야 합니다. 그래서 ORDER BY가 먼저 나오고, 마지막에 LIMIT가 붙습니다.
FETCH로 일부만 가져오기
PostgreSQL에서는 LIMIT 대신 FETCH도 사용할 수 있습니다. 둘 다 결과 일부만 가져오는 용도입니다.
하려는 일: 최근 주문 5건만 보고 싶습니다.
SELECT order_id, order_date, total_amount, status
FROM orders
ORDER BY order_date DESC
FETCH FIRST 5 ROWS ONLY;이 문장은 최근 주문순으로 정렬한 뒤 첫 5줄만 보여 달라는 뜻입니다.
LIMIT 5로 쓰면 다음과 같습니다.
SELECT order_id, order_date, total_amount, status
FROM orders
ORDER BY order_date DESC
LIMIT 5;초보자에게는 LIMIT가 더 짧고 읽기 쉽습니다. 다만 다른 SQL 자료나 회사 내부 문서에서 FETCH FIRST ... ROWS ONLY를 볼 수 있으니, 같은 목적이라는 정도는 알아 두면 좋습니다.
DISTINCT로 중복 없는 목록 만들기
테이블에는 같은 값이 여러 번 나올 수 있습니다. 고객 테이블에는 서울에 사는 고객이 여러 명 있을 수 있고, 상품 테이블에는 같은 카테고리에 속한 상품이 여러 개 있을 수 있습니다.
업무에서는 "어떤 지역들이 있는지", "어떤 상품 카테고리가 있는지"처럼 중복을 제거한 목록이 필요할 때가 많습니다. 이때 DISTINCT를 사용합니다.
하려는 일: 고객 테이블에서 고객이 있는 도시 목록만 중복 없이 보고 싶습니다.
SELECT DISTINCT city
FROM customers;결과는 도시별로 한 번씩만 나옵니다.
| city |
|---|
| 서울 |
| 부산 |
| 대전 |
| 제주 |
고객이 서울에 100명 있어도 결과에는 서울이 한 번만 표시됩니다. 엑셀의 "중복 제거" 기능과 비슷하다고 생각하면 됩니다.
하려는 일: 상품 테이블에서 사용 중인 상품 카테고리 목록을 보고 싶습니다.
SELECT DISTINCT category
FROM products
ORDER BY category ASC;결과는 중복 없는 카테고리 목록이 가나다순 또는 알파벳순으로 정리됩니다.
| category |
|---|
| 가전 |
| 문구 |
| 생활용품 |
| 식품 |
DISTINCT와 ORDER BY를 함께 쓰면 목록을 더 보기 좋게 만들 수 있습니다. 카테고리 점검, 지역 목록 확인, 담당자 목록 만들기처럼 간단한 업무에 자주 사용됩니다.
DISTINCT는 행 전체를 기준으로 중복을 판단합니다
DISTINCT 뒤에 컬럼을 여러 개 쓰면, PostgreSQL은 그 컬럼들의 조합이 같은지를 봅니다.
하려는 일: 고객 테이블에서 도시와 가입일 조합을 중복 없이 보고 싶습니다.
SELECT DISTINCT city, joined_at
FROM customers
ORDER BY city ASC, joined_at ASC;이 경우 city만 중복 제거하는 것이 아닙니다. city와 joined_at이 모두 같은 행만 중복으로 봅니다.
예를 들어 서울 고객이 여러 명이어도 가입일이 다르면 여러 줄이 나올 수 있습니다.
| city | joined_at |
|---|---|
| 서울 | 2026-01-03 |
| 서울 | 2026-01-10 |
| 부산 | 2026-02-01 |
도시 목록만 필요하다면 SELECT DISTINCT city처럼 컬럼 하나만 선택해야 합니다. 초보자는 이 부분에서 결과가 예상보다 많이 나와 당황할 수 있습니다. DISTINCT는 "내가 선택한 컬럼 묶음"을 기준으로 중복을 제거한다고 기억하세요.
조회 SQL을 쓰는 기본 순서
이번 장에서 배운 문장들은 함께 사용할 수 있습니다. 기본 모양은 다음과 같습니다.
SELECT 보고_싶은_컬럼
FROM 테이블
ORDER BY 정렬할_컬럼 정렬방향
LIMIT 개수;예를 들어 최근 가입 고객 10명의 이름, 이메일, 가입일을 보고 싶다면 이렇게 씁니다.
하려는 일: 최근 가입 고객 10명의 이름, 이메일, 가입일을 보고 싶습니다.
SELECT customer_name, email, joined_at
FROM customers
ORDER BY joined_at DESC
LIMIT 10;이 문장을 한국어로 읽으면 다음과 같습니다.
customers테이블에서customer_name,email,joined_at컬럼을 가져오고joined_at기준으로 최신순 정렬한 뒤10줄만 보여 주세요.
이 정도만 익혀도 큰 테이블에서 업무에 필요한 작은 표를 만들 수 있습니다.
pgAdmin이나 DBeaver에서 연습하는 방법
화면 기반 도구에서는 SQL 편집기에 문장을 쓰고 실행 버튼을 누르면 아래쪽에 결과표가 나타납니다. 이때 처음부터 큰 테이블을 모두 조회하지 말고 다음 순서로 연습하세요.
SELECT * FROM 테이블명 LIMIT 5;로 모양을 봅니다.필요한 컬럼 이름을 고릅니다.
SELECT 컬럼1, 컬럼2 FROM 테이블명형태로 줄입니다.필요한 경우
ORDER BY로 정렬합니다.결과가 많으면
LIMIT로 개수를 제한합니다.
처음 보는 테이블이라면 다음 문장으로 시작해도 좋습니다.
하려는 일: 고객 테이블의 데이터 모양을 5줄만 미리 확인하고 싶습니다.
SELECT *
FROM customers
LIMIT 5;그다음 필요한 컬럼만 남깁니다.
하려는 일: 고객 이름, 이메일, 가입일만 최근 가입순으로 5줄 보고 싶습니다.
SELECT customer_name, email, joined_at
FROM customers
ORDER BY joined_at DESC
LIMIT 5;이렇게 단계적으로 줄이면 SQL을 더 안전하게 작성할 수 있습니다. 처음부터 긴 문장을 완벽하게 쓰려고 하지 않아도 됩니다.
이번 장의 핵심 정리
SELECT는 큰 표에서 필요한 컬럼을 골라 작은 결과표를 만드는 문장입니다. ORDER BY는 결과를 최신순, 오래된순, 금액 높은순처럼 업무에 맞는 순서로 정렬합니다. LIMIT와 FETCH는 결과 일부만 가져와 미리 볼 때 사용합니다. DISTINCT는 중복 없는 목록을 만들 때 유용합니다.
조회의 기본 습관은 간단합니다.
처음 보는 테이블은 일부만 봅니다.
필요한 컬럼만 선택합니다.
정렬 기준을 분명히 합니다.
의미 있는 상위 몇 건을 볼 때는
ORDER BY와LIMIT를 함께 씁니다.목록이 필요하면 중복을 제거합니다.
이 다섯 가지를 익히면 고객 명단, 주문 내역, 상품 목록 같은 큰 장부에서 필요한 정보만 빠르게 꺼낼 수 있습니다. 다음 장에서는 여기에 조건을 더해 "서울 고객만", "결제 완료 주문만", "재고가 부족한 상품만" 찾는 방법을 배웁니다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.