[SQL] Oracle에서 정렬하는 법 (ORDER BY절)
ORDER BY 절은 SELECT 문에서 맨 마지막에 수행되며, 선택한 데이터를 정렬하기 위해 사용한다. 정렬 기준이 되는 값들은 SELECT 절에 포함되어 있지 않아도 된다.
Aug 08, 2024
ORDER BY
절은 SELECT
문에서 맨 마지막에 수행되며, 선택한 데이터를 정렬하기 위해 사용한다. 정렬 기준이 되는 값들은 SELECT 절에 포함되어 있지 않아도 된다.✅ 1. 정렬 기준
데이터를 특정 기준으로 오름차순, 내림차순으로 정렬할 수 있다.
- ASC(Ascending) : 오름차순
- DESC(Descending) : 내림차순
* 옵션 생략 시 ASC가 기본값
SELECT name, age FROM user ORDER BY name; SELECT name, age FROM user ORDER BY name DESC;
✅ 2. Oracle에서 정렬
정렬의 기준이 되는 값에
NULL
이 포함되어 있다면, DB 종류에 따라 NULL의 위치가 달라진다. Oracle의 경우 NULL
을 최댓값으로 취급하기 때문에 오름차순을 했을 경우 맨 마지막에 위치한다. 만약, 순서를 변경하고 싶다면
ORDER BY
절에 NULLS FIRST
, NULLS LAST
옵션을 추가하면 된다.SELECT name, age FROM user ORDER BY name ASC NULLS LAST; SELECT name, age FROM user ORDER BY name DESC NULLS FIRST;
ORDER BY
절은 SELECT
문에서 마지막에 실행되며 데이터를 정렬하는 데 사용된다. 정렬 기준이 되는 값들은 반드시 SELECT
절에 포함되어야 한다. 데이터는 오름차순(ASC) 또는 내림차순(DESC)으로 정렬할 수 있으며, 옵션을 생략하면 기본값은 오름차순이다. Oracle 데이터베이스에서
NULL
값은 최댓값으로 취급되어 오름차순 정렬 시 마지막에 위치한다. 이를 변경하려면 ORDER BY
절에 NULLS FIRST
또는 NULLS LAST
옵션을 추가할 수 있다.✅ 3. SELECT 절에 포함되지 않은 속성을 기준으로 정렬
SELECT 절에 포함되지 않은 속성을 기준으로 어떻게 정렬할 수 있을까? 먼저, 쿼리의 실행 순서를 알아보자. 쿼리의 논리적 실행 순서는 아래와 같다.
SELECT department_id FROM employees WHERE salary > 50000 GROUP BY department_id HAVING COUNT(employee_id) > 5 ORDER BY COUNT(employee_id) DESC;
- FROM:
employees
테이블에서 데이터를 가져옵니다.
- WHERE:
salary > 50000
조건에 맞는 데이터를 필터링합니다.
- GROUP BY:
department_id
별로 데이터를 그룹화합니다.
- HAVING: 각 그룹에 대해
COUNT(employee_id) > 5
조건을 적용합니다.
- SELECT:
department_id
와 각 그룹의 직원 수(employee_count
)를 선택합니다.
- ORDER BY:
COUNT(employee_id)
를 기준으로 내림차순으로 정렬합니다.
여기서,
ORDER BY
절이 SELECT
절보다 나중에 수행되는데, ORDER BY
는 선택되지 않은 COUNT(employee_id)
를 기준으로 어떻게 정렬할 수 있을까? 그 해답은 아래와 같다.
ORDER BY
절이 SELECT
절보다 나중에 실행되지만, ORDER BY
절에서 SELECT
절에 포함되지 않은 컬럼이나 표현식을 사용할 수 있는 이유는 SQL 엔진이 내부적으로 이를 처리하기 때문이다.SQL 쿼리의 실행 순서는 논리적 실행 순서와 실제 물리적 실행 순서로 나눌 수 있다. 논리적 실행 순서는 SQL 문이 처리되는 순서를 의미하며, 실제 물리적 실행 순서는 데이터베이스 엔진이 최적화를 통해 쿼리를 실제로 처리하는 순서를 의미한다. 일반적으로 설명하는 실행 순서는 논리적 실행 순서를 따른다.
☑️ 1) 논리적 실행 순서
- FROM: 데이터 소스를 결정하고 필요한 테이블을 가져온다.
- WHERE: 조건에 맞는 행을 필터링한다.
- GROUP BY: 데이터를 그룹화한다.
- HAVING: 그룹화된 데이터에 조건을 적용한다.
- SELECT: 필요한 열을 선택한다.
- ORDER BY: 결과를 정렬한다.
ORDER BY
절은 논리적으로 SELECT
절 다음에 실행되지만, 실제로는 데이터베이스 엔진이 필요한 모든 데이터를 가져오고 나서 정렬을 수행한다. 이 과정에서 ORDER BY
절에 사용된 표현식이나 컬럼이 SELECT
절에 포함되지 않았더라도 사용할 수 있다.☑️ 2) 예시
SELECT department_id FROM employees WHERE salary > 50000 GROUP BY department_id HAVING COUNT(employee_id) > 5 ORDER BY COUNT(employee_id) DESC;
이 쿼리는 다음과 같이 처리된다:
- FROM:
employees
테이블에서 데이터를 가져온다.
- WHERE:
salary > 50000
조건에 맞는 데이터를 필터링한다.
- GROUP BY:
department_id
별로 데이터를 그룹화한다.
- HAVING: 각 그룹에 대해
COUNT(employee_id) > 5
조건을 적용한다.
- SELECT:
department_id
를 선택한다.
- ORDER BY: 각 그룹의
COUNT(employee_id)
값을 기준으로 내림차순 정렬한다.
이 과정에서 SQL 엔진은 그룹화된 데이터의
COUNT(employee_id)
값을 내부적으로 유지하고, ORDER BY
절에서 이를 사용하여 정렬을 수행한다. 이로 인해 SELECT
절에 COUNT(employee_id)
가 포함되지 않더라도 ORDER BY
절에서 이를 사용할 수 있다.또한, 데이터베이스 엔진이 내부적으로 필요하다면
ORDER BY
절에 사용된 표현식을 계산하여 정렬에 사용한다. 이는 SQL 표준에 따라 지원되는 기능이다.Share article