티스토리 뷰

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)

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

 

 

 

 

 

 

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함