DB/MySQL

ORDER BY절

태로미 2023. 2. 1. 13:35

 

 

 

 

 

 

 

 

 

 

   ORDER BY 절

– 사용자가 지정한 기준과 정렬방식으로 출력 결과를 정렬하여 만드는 옵션절.
– ORDER BY절의 위치는 SELECT 구문에서 대부분 가장 마지막에 위치함.
   원하는 데이터 추출 후 마지막에 보기 편하게 정렬할 때 사용함.
– 데이터가 많으면 많을수록 정렬 잘못했다가는 여러모로 위험함.
   특히, 테이블의 모든 행을 출력할 때 정렬해버리면 시간소모도 크므로 쓸 때 조심해야 함
– 정렬방식

 

 

  1. 오름차순 (Ascending order/ASC)
  2. 내림차순 (Descending order/DESC)

 

 


ORDER BY + 정렬기준 컬럼 + 정렬방식

정렬방식 숫자 (0 < 9) 문자 ('A' < 'Z') 날짜 (이전 < 이후)
오름차순(사전순)
작은 값 → 큰 값
0   →   9 'A'  →   'Z' 이전    →   이후
내림차순
큰 값 → 작은 값
9   →   0 'Z'  →   'A' 이전  →   이후

EX1   )   내림차순 정렬

mysql> SELECT last_name, job_id, department_id, hire_date
    -> FROM employees
    -> ORDER BY hire_date DESC;
+-------------+------------+---------------+------------+
| last_name   | job_id     | department_id | hire_date  |
+-------------+------------+---------------+------------+
| Banda       | SA_REP     |            80 | 2000-04-21 |
| Kumar       | SA_REP     |            80 | 2000-04-21 |
| Ande        | SA_REP     |            80 | 2000-03-24 |
| Markle      | ST_CLERK   |            50 | 2000-03-08 |
| Lee         | SA_REP     |            80 | 2000-02-23 |
| Philtanker  | ST_CLERK   |            50 | 2000-02-06 |
...
| Kochhar     | AD_VP      |            90 | 1989-09-21 |
| Whalen      | AD_ASST    |            10 | 1987-09-17 |
| King        | AD_PRES    |            90 | 1987-06-17 |
+-------------+------------+---------------+------------+
107 rows in set (0.00 sec)

 

 

 

EX2   )   column alias 사용 & ORDER BY절의 기본값

mysql> SELECT employee_id, last_name, salary*12 annsal
    -> FROM employees
    -> ORDER BY annsal;
+-------------+-------------+-----------+
| employee_id | last_name   | annsal    |
+-------------+-------------+-----------+
|         132 | Olson       |  25200.00 |
|         128 | Markle      |  26400.00 |
|         136 | Philtanker  |  26400.00 |
|         127 | Landry      |  28800.00 |
...
|         102 | De Haan     | 204000.00 |
|         100 | King        | 288000.00 |
+-------------+-------------+-----------+
107 rows in set (0.00 sec)

→   column alias를 정렬기준으로 사용할 수 있음.   
→   SELECT절에 명시된 alias를 사용해야 출력값에 alias가 나옴.
→   정렬방식을 생략하는 경우 기본값으로 오름차순(ASC)가 적용됨.

 

 

 

EX2–1   )   ORDER_BY절에 SELECT의 컬럼명을 안 쓸 경우

mysql> SELECT employee_id, last_name, salary*12 annsal
    -> FROM employees
    -> ORDER BY salary*36;
+-------------+-------------+-----------+
| employee_id | last_name   | annsal    |
+-------------+-------------+-----------+
|         132 | Olson       |  25200.00 |
|         128 | Markle      |  26400.00 |
|         136 | Philtanker  |  26400.00 |
|         127 | Landry      |  28800.00 |
...
|         102 | De Haan     | 204000.00 |
|         100 | King        | 288000.00 |
+-------------+-------------+-----------+
107 rows in set (0.00 sec)

→   SELECT과 ORDER BY절은 개별적으로 실행되므로,  SELECT에 있는 컬럼을 안 쓴다해도 결과는 나옴.

 

 

 

EX3   )   LENGTH함수 사용해보기

mysql> SELECT employee_id, last_name, salary*12 annsal
    -> FROM employees
    -> ORDER BY LENGTH(last_name) DESC;
+-------------+-------------+-----------+
| employee_id | last_name   | annsal    |
+-------------+-------------+-----------+
|         126 | Mikkilineni |  32400.00 |
|         119 | Colmenares  |  30000.00 |
|         136 | Philtanker  |  26400.00 |
|         177 | Livingston  | 100800.00 |
...
|         170 | Fox         | 115200.00 |
|         202 | Fay         |  72000.00 |
+-------------+-------------+-----------+
107 rows in set (0.00 sec)

→   LENGTH는 길이를 의미하는 함수이므로 last_name의 길이 내림차순으로 정렬됨.

 

 

 

EX4   )   ORDER BY + 숫자

mysql> SELECT last_name, job_id, department_id, hire_date
    -> FROM employees
    -> ORDER BY 3;
+-------------+------------+---------------+------------+
| last_name   | job_id     | department_id | hire_date  |
+-------------+------------+---------------+------------+
| Grant       | SA_REP     |          NULL | 1999-05-24 |
| Whalen      | AD_ASST    |            10 | 1987-09-17 |
| Hartstein   | MK_MAN     |            20 | 1996-02-17 |
| Fay         | MK_REP     |            20 | 1997-08-17 |
| Raphaely    | PU_MAN     |            30 | 1994-12-07 |
...
| Popp        | FI_ACCOUNT |           100 | 1999-12-07 |
| Higgins     | AC_MGR     |           110 | 1994-06-07 |
| Gietz       | AC_ACCOUNT |           110 | 1994-06-07 |
+-------------+------------+---------------+------------+
107 rows in set (0.00 sec)

→   우선, 컬럼명은 알파벳으로 시작해야 함.
→   숫자 3은 세번째 컬럼을 정렬하란 뜻, 정렬 방식은 생략되어 오름차순이 적용됨.

 

 

 

EX5   )   다중 컬럼을 기준으로 정렬하기

mysql> SELECT last_name, department_id, salary
    -> FROM employees
    -> ORDER BY Department_id, salary DESC;	// == ORDER BY 2, 3 DESC;
+-------------+---------------+----------+
| last_name   | department_id | salary   |
+-------------+---------------+----------+
| Grant       |          NULL |  7000.00 |
| Whalen      |            10 |  4400.00 |
| Hartstein   |            20 | 13000.00 | 	
| Fay         |            20 |  6000.00 | 
| Raphaely    |            30 | 11000.00 |
| Khoo        |            30 |  3100.00 |
| Baida       |            30 |  2900.00 |
| Tobias      |            30 |  2800.00 |
| Himuro      |            30 |  2600.00 |
| Colmenares  |            30 |  2500.00 |
| Mavris      |            40 |  6500.00 |
| Fripp       |            50 |  8200.00 |
| Weiss       |            50 |  8000.00 |
...
| Higgins     |           110 | 12000.00 |
| Gietz       |           110 |  8300.00 |
+-------------+---------------+----------+
107 rows in set (0.00 sec)

→   1차적으로 첫번째 정렬기준으로 행을 정렬하고,  정렬 결과가 같은 값인 행에 대해서 그 다음 차수의 정렬이 동작함.
→   정렬 기준마다 정렬 방식은 개별적으로 적용됨.
→   부서번호별로 오름차순 정렬 후 동일 부서에 근무하는 사원들에 대해서,  급여 기준 내림차순으로 정렬함.
→   컬럼명을 숫자로 바꾸어 쓸 수 있음.

      ORDER BY Department_id, salary DESC;   ==  ORDER BY 2, 3 DESC;

 

 


 

 

Q   )  employees 테이블로부터 커미션을 받지 않는 모든 사원의 
         last_name, salary, commission_pct를 출력하되 salary를 기준으로 내림차순 정렬하시오.

 

A   )

커미션을 받지 않는 사원들 = 값을 비워놓음 = NULL

샐러리 기준으로 내림차순 정렬

mysql> SELECT last_name, salary, commission_pct
    -> FROM employees
    -> WHERE commission_pct is NULL
    -> ORDER BY salary DESC;
+-------------+----------+----------------+
| last_name   | salary   | commission_pct |
+-------------+----------+----------------+
| King        | 24000.00 |           NULL |
| Kochhar     | 17000.00 |           NULL |
| De Haan     | 17000.00 |           NULL |
...
| Philtanker  |  2200.00 |           NULL |
| Markle      |  2200.00 |           NULL |
| Olson       |  2100.00 |           NULL |
+-------------+----------+----------------+
72 rows in set (0.00 sec)

→   질문이 이해안가고 복잡할 때는, 한글로 풀어서 요약만 정리해보고 그 다음 그 문장들을 코드로 풀어내기.