티스토리 뷰
📌 SQL ORDER BY 설명
ORDER BY는 쿼리 결과를 특정 열을 기준으로 정렬할 때 사용됩니다.
기본적으로 오름차순(ASC) 정렬을 사용하며, 내림차순 정렬을 위해서는 DESC 키워드를 사용합니다.
데이터를 정렬하여 보기 쉽게 만들거나, 특정 순서에 따라 데이터를 처리해야 할 때 유용합니다.
📌 기본 문법
SELECT column_name1, column_name2, ...
FROM table_name
ORDER BY column_name1 [ASC|DESC], column_name2 [ASC|DESC];
-
- column_name1, column_name2: 정렬 기준이 되는 열
- ASC: 오름차순 정렬 (기본값으로 생략 가능)
- DESC: 내림차순 정렬
📌 사용 예제
1. 이름을 오름차순으로 정렬
SELECT * FROM employees
ORDER BY name ASC;
-
- 이 쿼리는 name 열을 기준으로 직원들을 오름차순으로 정렬합니다.
- 이름이 A부터 Z까지 순서대로 나열됩니다.
2. 급여를 내림차순으로 정렬
SELECT * FROM employees
ORDER BY salary DESC;
-
- 이 쿼리는 salary 열을 기준으로 급여가 높은 순서대로 직원들을 정렬합니다.
3. 여러 열을 사용한 정렬
SELECT * FROM employees
ORDER BY department_id ASC, salary DESC;
-
- 이 쿼리는 먼저 department_id를 기준으로 오름차순 정렬한 후, 동일한 부서 내에서는 salary를 기준으로 내림차순 정렬합니다.
4. 날짜를 기준으로 정렬
SELECT * FROM orders
ORDER BY order_date DESC;
-
- 이 쿼리는 order_date를 기준으로 최신 주문부터 오래된 주문 순으로 정렬합니다.
📌 GOOD 사용법
1. 정렬 기준이 명확할 때
-
- 사용자가 데이터를 특정 순서로 보고 싶을 때 유용합니다.
- 예: 최근 등록된 고객 목록을 보고 싶을 때.
SELECT * FROM customers
ORDER BY registration_date DESC;
2. 다중 열 정렬을 통해 데이터를 세분화할 때
-
- 예: 부서별로 그룹화된 후, 각 부서 내에서 급여가 높은 순으로 정렬된 직원 목록.
SELECT * FROM employees
ORDER BY department_id, salary DESC;
📌 BAD 사용법
1. 정렬이 불필요한 경우
-
- 정렬이 필요하지 않은 경우에도 ORDER BY를 사용하면 쿼리 성능이 저하될 수 있습니다.
-- 잘못된 예시
SELECT * FROM products
ORDER BY product_id;
-
- product_id로 정렬하는 것이 의미가 없다면 ORDER BY 없이 데이터를 조회하는 것이 더 효율적입니다.
2. 대량 데이터에서 복잡한 정렬을 사용할 경우
-
- 데이터 양이 많을 때 정렬을 여러 열로 복잡하게 사용하면 쿼리 실행 속도가 느려질 수 있습니다. 이 경우 인덱스를 설정하거나, 정렬된 결과가 실제로 필요한지 검토해야 합니다.
📌 데이터 예시
1. 직원 데이터를 사용한 급여 내림차순 정렬 예제
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(255),
department_id INT,
salary DECIMAL(10, 2)
);
INSERT INTO employees (id, name, department_id, salary) VALUES
(1, 'Alice', 1, 5000),
(2, 'Bob', 2, 4000),
(3, 'Charlie', 1, 4500),
(4, 'David', 3, 6000);
SELECT * FROM employees
ORDER BY salary DESC;
- 이 쿼리는 급여가 높은 순서대로 직원들을 정렬합니다. 결과는 David, Alice, Charlie, Bob 순으로 출력됩니다.
2. 주문 데이터를 사용한 날짜별 정렬 예제
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_name VARCHAR(255),
order_date DATE,
total_amount DECIMAL(10, 2)
);
INSERT INTO orders (id, customer_name, order_date, total_amount) VALUES
(1, 'Alice', '2024-09-01', 150.00),
(2, 'Bob', '2024-09-15', 200.00),
(3, 'Charlie', '2024-08-20', 300.00),
(4, 'David', '2024-10-01', 100.00);
SELECT * FROM orders
ORDER BY order_date DESC;
- 이 쿼리는 order_date를 기준으로 최신 주문부터 정렬합니다. 결과는 David, Bob, Alice, Charlie 순으로 출력됩니다.
실무 경험상 간혹 이런 케이스가 필요할 때가 있습니다.
📌 SQL ORDER BY와 CASE 문 예제
ORDER BY와 CASE 문을 함께 사용하면 정렬 순서를 조건에 따라 더 세밀하게 제어할 수 있습니다.
특정 열의 값에 따라 정렬 순서를 커스터마이징하거나, 원하는 기준에 따라 데이터를 우선적으로
정렬할 수 있습니다.
- 기본 문법
SELECT column_name1, column_name2, ...
FROM table_name
ORDER BY CASE
WHEN condition1 THEN value1
WHEN condition2 THEN value2
ELSE value3
END;
-
- CASE 문은 특정 조건에 따라 다른 값을 반환할 수 있으며, ORDER BY에서 이를 이용해 데이터의 정렬 순서를 조정할 수 있습니다.
- 예제
1. 특정 상태 값을 기준으로 정렬
SELECT * FROM employees
ORDER BY CASE
WHEN status = 'Manager' THEN 1
WHEN status = 'Team Lead' THEN 2
ELSE 3
END;
-
- 이 쿼리는 status 값이 'Manager'인 경우를 가장 먼저, 'Team Lead'를 그 다음, 그 외의 경우를 마지막에 정렬합니다. 즉, status가 'Manager'인 직원들이 가장 먼저 나오게 됩니다.
2. 지역에 따라 우선순위를 두어 정렬
SELECT * FROM customers
ORDER BY CASE
WHEN city = 'New York' THEN 1
WHEN city = 'Los Angeles' THEN 2
ELSE 3
END;
-
- 이 쿼리는 city 값이 'New York'인 고객을 먼저 정렬하고, 그 다음 'Los Angeles'에 위치한 고객들을 정렬합니다. 그 외의 도시 고객들은 마지막에 배치됩니다.
3. 특정 가격대에 우선순위를 두어 정렬
SELECT * FROM products
ORDER BY CASE
WHEN price < 50 THEN 1
WHEN price BETWEEN 50 AND 100 THEN 2
ELSE 3
END;
-
- 이 쿼리는 가격이 50 미만인 제품을 먼저, 50에서 100 사이의 제품을 그 다음, 그 외의 가격대 제품을 마지막에 정렬합니다.
4. 마감일에 따라 우선순위를 두어 정렬
SELECT * FROM tasks
ORDER BY CASE
WHEN due_date IS NULL THEN 2
ELSE 1
END, due_date ASC;
- 이 쿼리는 due_date가 NULL인(즉, 마감일이 지정되지 않은) 작업을 후순위로 두고, 나머지 작업들은 마감일 순서대로 오름차순 정렬합니다.
ORDER BY는 데이터를 정렬하여 보기 좋게 하거나 분석을 쉽게 하는 데 유용한 도구입니다.
하지만, 필요하지 않은 경우 사용을 피하거나, 대량의 데이터에 대해서는 정렬을 최소화하여 성능 문제를 피하는
것이 중요합니다.
반응형