해당글은 ORACLE기준으로 작성되어 있다. 단순히 오름차순 내림차순 정렬로 간단한 ORDER BY만 사용하다가 다양하게 사용할 수 있다는 것을 알고 간단하게 정리해볼까 한다.
ORDER BY절 설명
ORDER BY 절은 데이터를 원하는 순서로 정렬할 때 사용된다. 정렬할 컬럼을 지정하며, 오름차순(ASC) 또는 내림차순(DESC)을 사용하여 정렬 순서를 지정할 수 있으며, DECODE나 CASE WHEN 같은 함수를 함께 사용할 수 있다.
오름차순 정렬 (ASC) - 작은 값에서 큰 값으로 정렬
오름차순은 ORDER BY의 기본값이므로 컬럼명 뒤에 ASC를 생략해도 된다.
SELECT USER_ID
, USER_NAME
, USER_LEVEL
FROM USER
ORDER BY USER_LEVEL ASC
위와 같이 USER_LEVEL을 기준으로 오름차순으로 조회된다.
내림차순 정렬 (DESC) - 큰 값에서 작은 값으로 정렬
내림차순은 ASC와 같이 정렬하려는 컬럼 뒤에 기입하여 사용할 수 있다.
SELECT USER_ID
, USER_NAME
, USER_LEVEL
FROM USER
ORDER BY USER_LEVEL DESC
위와 같이 USER_LEVEL을 기준으로 내림차순으로 조회된다.
여러 개의 컬럼 정렬
여러 컬럼을 같이 정렬할 수도 있다. 기입한 순서대로 우선순위를 가지고 정렬하게 되며, 오름차순(ASC)와 내림차순(DESC)을 섞어서 사용도 가능하다.
SELECT USER_ID
, USER_NAME
, USER_LEVEL
FROM USER
ORDER BY USER_LEVEL DESC, USER_ID ASC
위와 같이 USER_LEVEL을 기준으로 내림차순으로 정렬하고, USER_LEVEL이 같은 로우끼리 USER_ID기준으로 오름차순으로 정렬하려 조회하게 된다. 물론 아래처럼 사용도 가능하다.
SELECT USER_ID
, USER_NAME
, USER_LEVEL
FROM USER
ORDER BY USER_LEVEL, USER_ID
위와 같이 USER_LEVEL을 기준으로 오름차순으로 정렬하고, USER_LEVEL이 같은 로우끼리 USER_ID기준으로 오름차순으로 정렬하려 조회하게 된다.
SELECT절에 없는 컬럼 기준으로 정렬
SELECT USER_ID
, USER_NAME
, USER_LEVEL
FROM USER
ORDER BY JOB
위와 같이 SELECT절에 없지만 USER테이블에는 존재하는 컬럼을 사용하여 정렬도 가능하다. 명심해야 하는 것은 아래에서 설명하겠지만 집계함수 (SUM, MIN, MAX, COUNT...)와 함께 사용할 때는 오류가 발생한다.
DECODE 함수를 사용한 우선순위 정렬
DECODE 함수를 이용하여 저장된 데이터를 오름차순이나 내림차순이 아닌 우선순위를 임의로 정해서 조회하고 싶을 때 사용가능하다.
SELECT USER_ID
, USER_NAME
, USER_LEVEL
, JOB
FROM USER
ORDER BY DECODE(JOB, 'NECROMANCER', 1, 'DRUID', 2, 3)
위와 같이 DECODE함수를 사용하여 우선순위를 부여하고 정렬할 수 있다.
CASE WHEN 함수를 사용한 우선 순위 정렬
CASE함수를 사용하여 DECODE함수를 사용한 것처럼 우선순위를 부여하여 정렬 가능하다.
SELECT USER_ID
, USER_NAME
, USER_LEVEL
, JOB
FROM USER
ORDER BY CASE WHEN JOB = 'NECROMANCER' THEN 1
WHEN JOB = 'DRUID' THEN 2
ELSE 3
END
위와 같이 CASE함수를 사용하여 우선순위를 부여하고 정렬할 수 있다.
GROUP BY와 함께 사용하는 경우
GROUP BY와 함께 사용하는 경우는 아래와 같다.
SELECT JOB
FROM USER
GROUP BY JOB
ORDER BY SUM(USER_LEVEL)
위와 같이 NECROMANCER, DRUID, BARBARIAN순으로 조회된다. 그러나 아래와 같이 사용한다면 오류가 발생하니 주의하길 바란다.
SELECT JOB
FROM USER
GROUP BY JOB
ORDER BY USER_LEVEL
그룹으로 묶지 않은 컬럼을 사용할 시 오류가 발생할 것이다.
UNION, UNION ALL과 함께 사용하는 경우
UNION으로 조회 결과를 합친 쿼리에서 ORDER BY사용법은 아래와 같다.
SELECT USER_ID
, USER_NAME
, USER_LEVEL
FROM USER
WHERE JOB = 'NECROMANCER'
UNION ALL
SELECT USER_ID
, USER_NAME
, USER_LEVEL
FROM USER
WHERE JOB = 'DRUID'
ORDER BY USER_LEVEL
위와 같이 UNION ALL 전체를 묶어서 ORER BY를 사용해야 하며, 각 SELECT절마다 ORDER BY를 사용하면 아래 오류가 발생할 것이다.
ORA-00933: SQL command not properly ended
NULL값 처리 정렬
마지막으로 NULL값을 활용하여 정렬하는 방법이다. NULL값을 우선으로 정렬할 때는 NULLS FIRST를 사용하고, 반대로 NULL값을 마지막으로 정렬할 때는 NULLS LAST를 사용하면 된다. 아래 예를 보고 이해하길 바란다.
SELECT USER_ID
, USER_NAME
, USER_LEVEL
FROM USER
ORDER BY JOB NULLS FIRST
NULLS FIRST를 사용하면 위와 같이 NULL값이 최우선으로 조회된다.
SELECT USER_ID
, USER_NAME
, USER_LEVEL
FROM USER
ORDER BY JOB NULLS LAST
NULLS LAST를 사용하면 위와 같이 NULL값이 제일 마지막으로 조회된다.
그 외
그 외에 NLS_SORT 및 NLS_COMP를 사용하는 방법 등이 있으나, 잘 사용하지 않아서 이런 게 있다 정도만 알아두길 바란다. 위 정리한 내용만 있다면 실무에서 큰 어려움 없이 사용할 수 있을 거라고 생각된다.
'기타 IT > DB' 카테고리의 다른 글
Redis - Redis란 무엇인가? (간단 정리) (0) | 2024.08.08 |
---|---|
h2 DB 이전 버전 다운로드 방법 1.4.200버전 (0) | 2022.01.11 |
PL/SQL Developer 쿼리 실행 중단 (Break) 사용방법 (0) | 2021.12.21 |
PL/SQL Developer에서 조회 된 데이터 수정하는 방법 + Commit, Rollback버튼 (0) | 2021.12.21 |
PL/SQL Developer (AutoReplace) 자동완성 설정법 (0) | 2021.12.21 |