ORDER BY절
▶▶ ORDER BY 절
– 사용자가 지정한 기준과 정렬방식으로 출력 결과를 정렬하여 만드는 옵션절.
– ORDER BY절의 위치는 SELECT 구문에서 대부분 가장 마지막에 위치함.
원하는 데이터 추출 후 마지막에 보기 편하게 정렬할 때 사용함.
– 데이터가 많으면 많을수록 정렬 잘못했다가는 여러모로 위험함.
특히, 테이블의 모든 행을 출력할 때 정렬해버리면 시간소모도 크므로 쓸 때 조심해야 함
– 정렬방식
- 오름차순 (Ascending order/ASC)
- 내림차순 (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)
→ 질문이 이해안가고 복잡할 때는, 한글로 풀어서 요약만 정리해보고 그 다음 그 문장들을 코드로 풀어내기.