SQL에서 복잡한 데이터를 추출할 때 서브쿼리는 매우 유용한 방법입니다. 하지만 서브쿼리의 결과를 특정 순서로 정렬하려면 ORDER BY 절의 사용에 주의가 필요합니다. 이번 기사에서는 서브쿼리 결과를 ORDER BY로 정렬하는 방법에 대해 자세히 설명합니다.
서브쿼리의 기본적인 사용법
서브쿼리는 다른 쿼리 내에서 사용되는 쿼리입니다. 서브쿼리는 괄호로 묶여 있으며, SELECT, INSERT, UPDATE, DELETE 등의 SQL 문장의 일부로 사용됩니다. 서브쿼리를 사용하면 보다 복잡한 쿼리를 구성하고, 특정 조건에 기반해 데이터를 추출할 수 있습니다.
서브쿼리의 기본 구조
서브쿼리는 다음과 같은 구조를 가집니다:
SELECT column1, column2
FROM (SELECT column1, column2 FROM table WHERE condition) AS subquery_alias;
이와 같이, 서브쿼리를 사용하여 다른 쿼리의 결과를 이용하면서 새로운 쿼리를 실행할 수 있습니다.
ORDER BY의 기본적인 사용법
ORDER BY 절은 쿼리의 결과 집합을 특정 순서로 정렬하기 위해 사용됩니다. 일반적으로 오름차순(ASC) 또는 내림차순(DESC)으로 정렬합니다.
ORDER BY 절의 기본 구조
ORDER BY 절은 SELECT 문장의 마지막에 위치하며 다음과 같이 사용됩니다:
SELECT column1, column2
FROM table
WHERE condition
ORDER BY column1 ASC, column2 DESC;
ORDER BY 사용 예
예를 들어, 다음 쿼리는 employees
테이블에서 직원 이름을 알파벳 순서로 정렬하여 가져옵니다:
SELECT first_name, last_name
FROM employees
ORDER BY last_name ASC, first_name ASC;
이처럼, ORDER BY 절을 사용하여 결과 집합을 원하는 순서로 정리할 수 있습니다.
서브쿼리 내에서 ORDER BY의 제약
서브쿼리 내에서 ORDER BY 절을 사용할 때 몇 가지 제약이 있습니다. 특히 서브쿼리가 직접 결과를 반환하지 않는 경우, ORDER BY 절은 효과가 없습니다.
서브쿼리 내의 ORDER BY 절의 비활성화
서브쿼리 내에서 ORDER BY 절을 사용해도 외부 쿼리가 그 순서를 무시할 수 있습니다. 예를 들어, 다음 쿼리에서는 서브쿼리 내의 ORDER BY 절이 무시됩니다:
SELECT *
FROM (SELECT first_name, last_name FROM employees ORDER BY last_name) AS subquery;
이 경우, 외부 쿼리에 ORDER BY 절이 없으므로 결과 집합은 정렬되지 않습니다.
서브쿼리에서 ORDER BY를 사용할 때 주의점
서브쿼리 내에서 ORDER BY를 사용하는 것은 TOP이나 LIMIT 등과 같은 절과 결합할 때에만 유효합니다. 예를 들어, LIMIT 절과 함께 사용하면 다음과 같습니다:
SELECT *
FROM (SELECT first_name, last_name FROM employees ORDER BY last_name LIMIT 10) AS subquery;
이 경우, 서브쿼리 내에서 정렬이 이루어지며, 첫 10개의 결과가 외부 쿼리로 전달됩니다.
서브쿼리 결과를 ORDER BY로 정렬하는 방법
서브쿼리의 결과를 특정 순서로 정렬하려면 서브쿼리의 외부에서 ORDER BY 절을 사용해야 합니다. 이를 통해 서브쿼리 결과 집합 전체가 정렬됩니다.
서브쿼리 결과를 정렬하는 기본적인 방법
먼저 서브쿼리로 필요한 데이터를 가져온 후, 그 결과를 외부 쿼리에서 ORDER BY 절로 정렬합니다. 예는 다음과 같습니다:
SELECT *
FROM (
SELECT first_name, last_name, hire_date
FROM employees
WHERE department_id = 10
) AS subquery
ORDER BY hire_date DESC;
이 쿼리는 department_id
가 10인 직원을 서브쿼리로 가져와 그 결과를 hire_date
의 내림차순으로 정렬합니다.
실제 사용 예
예를 들어, 판매 데이터에서 특정 제품 카테고리의 판매를 서브쿼리로 추출한 후, 그 결과를 판매 금액 순으로 정렬하려면 다음과 같이 작성합니다:
SELECT product_name, total_sales
FROM (
SELECT product_name, SUM(sales_amount) AS total_sales
FROM sales
WHERE category = 'Electronics'
GROUP BY product_name
) AS subquery
ORDER BY total_sales DESC;
이 쿼리는 Electronics
카테고리의 상품 판매 합계를 계산하고, 그 결과를 판매 금액의 내림차순으로 정렬합니다.
서브쿼리에서 ORDER BY를 사용할 때의 포인트
서브쿼리 내에서 ORDER BY 절을 사용하더라도, 외부 쿼리가 그 순서를 따르지 않기 때문에 반드시 외부 쿼리에서 ORDER BY 절을 사용하여 최종적으로 정렬을 수행해야 합니다. 이를 통해 서브쿼리 결과를 원하는 순서대로 표시할 수 있습니다.
서브쿼리를 포함한 SQL 쿼리의 실례
서브쿼리를 포함한 SQL 쿼리의 구체적인 예를 몇 가지 소개합니다. 이를 통해 서브쿼리의 실제 사용 방법과 ORDER BY 절을 결합하는 방법을 이해할 수 있습니다.
직원의 입사일로 정렬
다음 쿼리는 특정 부서에 속한 직원을 입사일로 정렬하여 표시합니다:
SELECT first_name, last_name, hire_date
FROM (
SELECT first_name, last_name, hire_date
FROM employees
WHERE department_id = 10
) AS subquery
ORDER BY hire_date DESC;
이 쿼리는 부서 ID가 10인 직원을 서브쿼리로 추출하고, 그 결과를 입사일의 내림차순으로 정렬합니다.
판매 데이터 정렬
다음 쿼리는 특정 상품 카테고리의 판매 데이터를 집계하고, 판매 금액으로 정렬합니다:
SELECT product_name, total_sales
FROM (
SELECT product_name, SUM(sales_amount) AS total_sales
FROM sales
WHERE category = 'Electronics'
GROUP BY product_name
) AS subquery
ORDER BY total_sales DESC;
이 쿼리는 Electronics
카테고리의 상품별 판매 합계를 계산하고, 그 결과를 판매 금액의 내림차순으로 정렬합니다.
가장 최근 주문을 한 고객 리스트
다음 쿼리는 가장 최근 주문일을 가진 고객 리스트를 추출하여 그 주문일로 정렬합니다:
SELECT customer_name, last_order_date
FROM (
SELECT customer_name, MAX(order_date) AS last_order_date
FROM orders
GROUP BY customer_name
) AS subquery
ORDER BY last_order_date DESC;
이 쿼리는 각 고객의 가장 최근 주문일을 서브쿼리로 추출하고, 그 결과를 주문일의 내림차순으로 정렬합니다.
각 카테고리의 상위 제품을 판매 순으로 정렬
다음 쿼리는 각 카테고리에서 판매 상위 제품을 추출하여, 이를 판매 순으로 정렬하여 표시합니다:
SELECT category, product_name, total_sales
FROM (
SELECT category, product_name, total_sales,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY total_sales DESC) AS rank
FROM (
SELECT category, product_name, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY category, product_name
) AS subquery
) AS ranked_products
WHERE rank = 1
ORDER BY total_sales DESC;
이 쿼리는 각 카테고리의 제품을 판매 금액으로 순위를 매기고, 상위 제품만을 추출하여 그 결과를 판매 금액의 내림차순으로 정렬합니다.
이 예제를 통해 서브쿼리와 ORDER BY 절을 결합하여 사용하는 방법을 이해할 수 있습니다. 서브쿼리를 적절히 사용하면 복잡한 데이터 추출과 정렬을 효율적으로 처리할 수 있습니다.
정리
서브쿼리는 복잡한 SQL 쿼리를 구성하는 데 강력한 도구입니다. 특히, 데이터의 일부를 필터링하고 그 결과를 기반으로 추가 처리를 수행하는 경우에 유효합니다. 하지만 서브쿼리 내의 ORDER BY 절은 외부 쿼리에서 무효화되기 때문에, 최종적인 정렬은 외부 쿼리에서 수행하는 것이 중요합니다. 이를 통해 서브쿼리 결과를 원하는 순서대로 정리하고 필요한 정보를 효율적으로 얻을 수 있습니다. 서브쿼리와 ORDER BY를 결합하여 복잡한 데이터 추출도 쉽게 수행할 수 있습니다.