[SQL] Oracle에서 정렬하는 법 (ORDER BY절)

ORDER BY 절은 SELECT 문에서 맨 마지막에 수행되며, 선택한 데이터를 정렬하기 위해 사용한다. 정렬 기준이 되는 값들은 SELECT 절에 포함되어 있지 않아도 된다.
Hi's avatar
Aug 08, 2024
[SQL] Oracle에서 정렬하는 법 (ORDER BY절)

💡
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;
  1. FROM: employees 테이블에서 데이터를 가져옵니다.
  1. WHERE: salary > 50000 조건에 맞는 데이터를 필터링합니다.
  1. GROUP BY: department_id별로 데이터를 그룹화합니다.
  1. HAVING: 각 그룹에 대해 COUNT(employee_id) > 5 조건을 적용합니다.
  1. SELECT: department_id와 각 그룹의 직원 수(employee_count)를 선택합니다.
  1. ORDER BY: COUNT(employee_id)를 기준으로 내림차순으로 정렬합니다.
 
여기서, ORDER BY 절이 SELECT 절보다 나중에 수행되는데, ORDER BY는 선택되지 않은 COUNT(employee_id) 를 기준으로 어떻게 정렬할 수 있을까?
 
그 해답은 아래와 같다.
 
ORDER BY 절이 SELECT 절보다 나중에 실행되지만, ORDER BY 절에서 SELECT 절에 포함되지 않은 컬럼이나 표현식을 사용할 수 있는 이유는 SQL 엔진이 내부적으로 이를 처리하기 때문이다.
SQL 쿼리의 실행 순서는 논리적 실행 순서와 실제 물리적 실행 순서로 나눌 수 있다. 논리적 실행 순서는 SQL 문이 처리되는 순서를 의미하며, 실제 물리적 실행 순서는 데이터베이스 엔진이 최적화를 통해 쿼리를 실제로 처리하는 순서를 의미한다. 일반적으로 설명하는 실행 순서는 논리적 실행 순서를 따른다.

☑️ 1) 논리적 실행 순서

  1. FROM: 데이터 소스를 결정하고 필요한 테이블을 가져온다.
  1. WHERE: 조건에 맞는 행을 필터링한다.
  1. GROUP BY: 데이터를 그룹화한다.
  1. HAVING: 그룹화된 데이터에 조건을 적용한다.
  1. SELECT: 필요한 열을 선택한다.
  1. 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;
이 쿼리는 다음과 같이 처리된다:
  1. FROM: employees 테이블에서 데이터를 가져온다.
  1. WHERE: salary > 50000 조건에 맞는 데이터를 필터링한다.
  1. GROUP BY: department_id별로 데이터를 그룹화한다.
  1. HAVING: 각 그룹에 대해 COUNT(employee_id) > 5 조건을 적용한다.
  1. SELECT: department_id를 선택한다.
  1. ORDER BY: 각 그룹의 COUNT(employee_id) 값을 기준으로 내림차순 정렬한다.
이 과정에서 SQL 엔진은 그룹화된 데이터의 COUNT(employee_id) 값을 내부적으로 유지하고, ORDER BY 절에서 이를 사용하여 정렬을 수행한다. 이로 인해 SELECT 절에 COUNT(employee_id)가 포함되지 않더라도 ORDER BY 절에서 이를 사용할 수 있다.
또한, 데이터베이스 엔진이 내부적으로 필요하다면 ORDER BY 절에 사용된 표현식을 계산하여 정렬에 사용한다. 이는 SQL 표준에 따라 지원되는 기능이다.
 
Share article

soultree