지지 On Air

2-1-6. ORDER BY 절 본문

개발/SQL [SQLD&SQLP]

2-1-6. ORDER BY 절

슈스 지지 2022. 7. 28. 08:31
반응형


ORDER BY 절은 쉽게 말하면 '정렬' 하여 출력하는것이라고 할 수 있습니다.

날짜별로 저장된 데이터가 있을때, 날짜 순서대로 데이터를 보고싶다면 ORDER BY를 이용하여 날짜별로 정렬하여 출력할 수 있겠죠 ㅎㅎ


 

과목 II. SQL 기본과 활용
  - 제1장 SQL 기본
    > 제6절 ORDER BY절

 

1. ORDER BY 정렬

ORDER BY 절은 SQL문장으로 조회한 데이터들을 다양한 목적에 맞게 특정 칼럼을 기준으로 정렬/출력 하는 데 사용한다.

ORDER BY 절에 칼럼명 대신에 SELECT 절에서 사용한 ALIAS명이나 칼럼 순서를 나타내는 정수도 사용 가능하다.

기본 구조는 다음과 같다.

SELECT 칼럼명 [ALIAS명]
FROM 테이블명
[WHERE 조건식]
[GROUP BY 칼럼이나 표현식]
[HAVING 그룹조건식]
[ORDER BY 칼럼이나 표현식 [ASC 또는 DESC]];

 

ORDER BY의 정렬방식은 ASC와 DESC가 있다.

- ASC (Ascending) : 조회한 데이터를 오름차순으로 정렬한다. (기본값이므로 생략 가능)

- DESC (Descending) : 조회한 데이터를 내림차순으로 정렬한다.

 

다음은 PLAYER 테이블에서 POSITION을 내림차순으로 출력하는 SQL문이다

SELECT PLAYER_NAME AS 선수명, POSITION AS 포지션, BACK_NO AS 백넘버
FROM PLAYER
ORDER BY 포지션 DESC;

 

ORDER BY절에서 POSITION 이라고 칼럼명을 써도 되고, 위와같이 ALIAS를 이용해도 된다.

결과는 다음과 같이 나올것이다.

선수명 포지션 백넘버
김철수    
박영희    
이기혁 MF 23
김건웅 MF 14
... ... ...

실행결과에 포지션과 백넘버가 아무것도 없는 값들이 있다. 현재 PLAYER 테이블에서 해당 칼럼에 NULL 이 들어있다는 뜻이다. ORACLE에서는 위와 같이 NULL을 가장 큰 값으로 취급하고, SQL Server는 가장 작은값으로 취급한다.

 

ORDER BY절의 특징은 다음과 같다.

- 기본적인 정렬 순서는 ASC(오름차순) 이다.

- 숫자형 데이터 타입은 ASC(오름차순)로 정렬했을 경우에 가장 작은 값부터 출력된다.

- 문자형 데이터 타입은 ASC(오름차순)로 정렬했을 경우에 날짜 깞이 가장 빠른 값이 먼저 출력된다. 예를들어 '01-JAN-2022'는 '01-SEP-2022'보다 먼저 출력된다.

- Oracle에서는 NULL값을 가장 큰 값으로 간주해 오름차순으로 정렬했을 경우 가장 마지막에, 내림차순으로 정렬했을 경우에는 가장 먼저 위치한다.

- SQL Server에서는 NULL값을 가장 작은값으로 간주해 오름차순으로 정렬했을경우 가장먼저, 내림차순으로 정렬했을 경우에 가장 마지막에 위치한다.

 

 

ORDER BY절에서 한개의 칼럼이 아닌 여러가지 칼럼을 기준으로 정렬하는 것도 가능하다.

SELECT PLAYER_NAME 선수명, POSITION AS 포지션, BACK_NO AS 백넘버, HEIGHT AS 키
FROM PLAYER
WHERE HEIGHT IS NOT NULL
ORDER BY HEIGHT DESC, BACK_NO;

먼저 키가 큰 순서대로, 키가 같은 경우에는 백넘버 순으로 정렬하는 SQL문이다. 결과는 다음과 같다.

선수명 포지션 백넘버
이범영 GK 27 197
라스 FW 9 197
잭슨 DF 5 196
김현 FW 7 190
... ... ... ...

197cm인 선수가 두명 있는데, ORDER BY 절에서 우선 키 큰 순서대로 출력하고, 키가 같으면 백넘버 순으로 정렬하게 되어 있으므로, 조건에 따라 같은 키 정렬된 것을 확인할 수 있다.

 

ORDER BY 절에 칼럼명이나 ALAS 명을 대신해서 SELECT 절의 칼럼 순서를 정수로 매핑해 사용할 수도 있다.

SELECT 절의 칼럼명이 너무 길거나, 정렬조건이 많으면 편리하게 사용할 수 있으나 향후 유지보수성이나 가독성이 떨어지므로 칼럼명이나 ALIAS명을 권고한다.

ORDER BY 절에서 칼럼명, ALIAS명, 칼럼 순서를 같이 혼용하는 것도 가능하다.

 

 

 

2. SELECT 문장 실행 순서

GROUP BY 절과 ORDER BY가 같이 사용될 때 SELECT 문장은 6개의 절로 구성되고, SELECT 문장의 수행단계는 아래와 같다.

5.  SELECT 칼럼명 [ALIASAUD]
1.  FROM 테이블명
2.  WHERE 조건식
3.  GROUP BY 칼럼이나 표현식
4.  HAVING 그룹조건식
6.  ORDER BY 칼럼이나 표현식;

1. 테이블 참조 (FROM)

2. 대상 데이터가 아닌것은 제거 (WHERE)

3. 행들을 소그룹화 (GROUP BY)

4. 그룹핑된 값의 조건에 맞는 것만 출력 (HAVING)

5. 데이터 값을 출력,계산 (SELECT)

6. 데이터 정렬 (ORDER BY)

 

위 순서는 옵티마이저가 SQL문장의 SYNTAX, SEMANTIC 에러를 점검하는 순서이기도 하다.

예를 들면, FROM절에 정의되지 않은 테이블의 칼럼을 WHERE절, GROUP BY절, HAVING절, SELECT절, ORDER BY절에서 사용하면 에러가 발생한다.

그러나 ORDER BY 절에는 SELECT 목록에 나타나지 않은 문자형 항목이 포함될 수 있다. 단 SELECT가 DISTINCT를 지정하거나, SQL문장에  GROUP BY절이 있거나, SELECT문에 UNION연산자가 있으면 열 정의가 SELECT목록에 표시되어야 한다.

SQL 문장 실행 순서는 오라클 옵티마이저가 SQL 문장을 해석하는 논리적인 순서이므로, SQL문장이 실제로 실행되는 물리적인 순서는 아니다. 물리적인 순서는 실행계획에 의해 정해진다.

 

인라인 뷰에 정의된 SELECT 칼럼을 메인 쿼리에서 사용할 수 있다.

인라인 뷰는 2장에서 다룰 예정이지만, 다음 예제를 통해 간단하게 살펴본다.

SELECT EMPNO
FROM (SELECT EMPNO, ENAME
		FROM EMP
        ORDER BY MANAGER);

두번째 줄 부터 괄호로 묶인 인라인뷰에서 정의한 'EMPNO'에 대하여 메인쿼리에서 'EMPNO'를 사용 할 수 있는것을 볼 수 있다.

 

그러나 다음과 같은 경우에는 오류가 난다.

SELECT MANAGER
FROM (SELECT EMPNO, ENAME
		FROM EMP
        ORDER BY MANAGER);

인라인뷰에서 정의되지 않은 'MANAGER'를 메인쿼리에서 사용하면 부적합한 식별자 라고 오류가 발생한다.

 

서브쿼리의 SELECT 절에서 선택되지 않은 칼럼들은 계속 유지되는 것이 아니라, 서브쿼리 범위를 벗어나면 더이상 사용할 수 없게 된다.

GROUP BY 절에서 그룹핑 기준을 정의하게 되면 데이터베이스는 일반적인 SELECT 문장처럼 FROM 절에 정의된 테이블의 구조를 그대로 갖고가는 것이 아니다. GROUP BY 절의 그룹핑 기준에 사용된 칼럼과 집계함수에 사용될 수 있는 숫자형 데이터 칼럼들의 집합을 새로 만든다.
GROUP BY 절을 사용하게 되면 그룹핑 기준에 사용된 칼럼과 집계함수에 사용될 수 있는 숫자형 데이터 칼럼들의 집합을 새로 만드는데, 개별 데이터는 필요 없으므로 저장하지 않는다. GROUP BY 이후 수행 절인 SELECT 절이나 ORDER BY 절에서 개별 데이터를 사용하는 경우 에러가 발생한다.

결과적으로 SELECT 절에서는 그룹핑 기준과 숫자 형식 칼럼의 집계함수를 사용할 수 있지만, 그룹핑 기준외의 문자 형식 칼럼은 정할 수 없다.

 

 

쉽게 예제를 통해 살펴본다.

GROUP BY 절 사용 시 SELECT 절에 일반 칼럼을 사용하면 오류가 난다.

SELECT JOB, SAL
FROM EMP
GROUP BY JOB
HAVING COUNT (*) > 0
ORDER BY SAL;

1행에 GROUP BY 표현식이 아니라는 오류가 난다.

 

또한 다음과 같이 GROUP BY 절 사용시 ORDER BY절에 일반 칼럼을 사용하면 오류가 난다.

SELECT JOB
FROM EMP
GROUP BY JOB
HAVING COUNT(*) >0
ORDER BY SAL;

5행에 GROUP BY 표현식이 아니라는 오류가 난다.

 

다음과 같이 ORDER BY 절에 집계 칼럼을 사용할 경우에는 오류 없이 잘 실행 될것이다.

SELECT JOB, SUM(SAL) AS SALARY_SUM
FROM EMP
GROUP BY JOB
HAVING SUM (SAL) > 5000
ORDER BY SUM (SAL);

결과

JOB SALARY_SUM
SALESMAN 5500
ANALYST 6000
MANAGER 8600

 

SELECT SQL에서 GROUP BY 절이 사용됐기 때문에 SELECT 절에 정의하지 않은 MAX, SUM, COUNT와 같은 집계함수도 ORDER BY 절에서 사용할 수 있다.

 


이번 절에서는 ORDER BY에 대하여 다루었습니다.

SELECT 문장의 실행 순서는 SQLD 시험에서 자주 출제 되므로 꼭 기억하고 계시면 좋겠습니다 :)

 

구독, 공감, 댓글은 큰 힘이 됩니다 😊


본 포스팅은 '한국데이터산업진흥원' 에서 발행한 'SQL 전문가 가이드' 를 참고/인용 하였음을 밝힙니다.
반응형

'개발 > SQL [SQLD&SQLP]' 카테고리의 다른 글

2-1-8. 표준 조인 [SQL 전문가 가이드]  (10) 2022.08.03
2-1-7. 조인(JOIN) [ SQL 가이드 ]  (15) 2022.07.29
2-1-5. GROUP BY, HAVING절  (8) 2022.07.27
2-1-4. WHERE절  (12) 2022.07.23
2-1-3. 함수(2)  (2) 2022.07.22
Comments