更新時間:2021-01-22 17:43:30 來源:動力節(jié)點 瀏覽1698次
數(shù)據(jù)排序是按一定順序?qū)?shù)據(jù)排列,以便研究者通過瀏覽數(shù)據(jù)發(fā)現(xiàn)一些明顯的特征或趨勢, 找到解決問題的線索。但是在MySQL數(shù)據(jù)庫中,默認情況下,SELECT語句不會對返回的結(jié)果進行排序,意味著查詢結(jié)果的顯示順序是不確定的。如果想要將結(jié)果按照某種規(guī)則進行排序,例如按照入職先后順序顯示員工的信息,可以使用ORDER BY子句。MySQL數(shù)據(jù)排序分為以下5種:單列排序、多列排序、表達式排序,空值排序和中文排序,下面的內(nèi)容將依次介紹這5種MySQL排序。
1.單列排序
基于單個字段排序按照單個字段的值進行排序稱為單列排序。
單列排序的語法如下:
SELECT col1, col2, ...
FROM table_name
[WHERE conditions]
ORDER BY col1 [ASC | DESC];
其中,ORDER BY用于指定排序的字段;
ASC表示升序排序(Ascending),DESC表示降序排序(Descending),默認值為升序排序。例如,以下查詢按照員工的入職先后順序進行排序顯示:
select emp_name, hire_date
from employee
order by hire_date;
emp_name|hire_date |
---------|----------|
趙 |2000-01-01|
錢 |2000-01-01|
孫 |2000-01-01|
李 |2002-08-08|
周 |2002-08-08|
吳 |2005-12-19|
...對于升序排序,數(shù)字按照從小到大的順序排列,字符按照編碼的順序排列,日期時間按照從早到晚的順序排列;降序排序正好相反。在上面的查詢結(jié)果中,入職日期為 2000-01-01 的員工有 3 位。那么他們誰排在前面,誰排在后面呢?答案是不確定。如果要解決這個問題,需要使用多列排序。
2.多列排序
多列排序是指基于多個字段的值排序,多個字段使用逗號進行分隔。
多列排序的語法如下:SELECT col1, col2, ...
FROM table_name
[WHERE conditions]
ORDER BY col1 [ASC | DESC], col2 [ASC | DESC], ...;
執(zhí)行過程中,先基于第一個字段進行排序;
對于第一個字段排序相同的數(shù)據(jù),再基于第二個字段進行排序;
依此類推。例如,以下語句查詢行政管理部(dept_id = 1)的員工信息;
按照入職先后進行排序,入職日期相同再按照月薪從高到低排序:
select emp_name, sex, hire_date, salary
from employee
where dept_id = 1
order by hire_date asc, salary desc;
emp_name|sex |hire_date |salary |
---------|----|----------|--------|
趙 |男 |2000-01-01|30000.00|
錢 |男 |2000-01-01|26000.00|
孫 |男 |2000-01-01|24000.00|
3. 表達式排序
除了使用字段的值進行排序之外,也可以基于表達式的結(jié)果進行排序。例如,以下語句按照年度總收入(年薪加獎金)進行排序:
select emp_name, salary, bonus, salary * 12 + ifnull(bonus, 0) as total_income
from employee
order by total_income;
emp_name|salary |bonus |salary * 12 + ifnull(bonus, 0)|
emp_name|salary |bonus |total_income|
---------|--------|--------|------------|
趙 | 4000.00| | 48000.00|
錢 | 4000.00| 1500.00| 49500.00|
孫 | 4200.00| | 50400.00|
李 | 4100.00| 2000.00 | 51200.00|
周 | 4300.00| | 51600.00|
吳 | 4700.00| | 56400.00|
...其中,ifnull(bonus, 0) 函數(shù)用于將 bonus 為空的數(shù)據(jù)轉(zhuǎn)換為 0;該函數(shù)將會在后續(xù)文章中進行介紹。另外,在指定排序字段時,除了使用字段名或者表達式之外,也可以使用它們在查詢列表中出現(xiàn)的數(shù)字編號順序。
上面的示例可以改寫如下:
select emp_name, salary, bonus, salary * 12 + ifnull(bonus, 0) as total_income
from employee
order by 4;
在查詢列表中,total_income 是返回的第 4 個字段;因此該語句也是按照年度總收入從低到高進行排序。
4.空值排序
空值(NULL)在 SQL 中表示未知或者缺失的值。如果排序的字段中存在空值時,結(jié)果會怎么樣呢?
以下語句按照獎金從高到低進行排序:
select emp_name, bonus
from employee
where dept_id = 3
order by bonus desc;
emp_name|bonus |
----------|-------|
趙 |5000.00|
錢 | |從查詢結(jié)果可以看到,空值排在了最后。也就是說,MySQL 認為空值最小,升序時排在最前,降序時排在最后。如果想要調(diào)整空值的排序位置,可以使用函數(shù)(例如 ifnull)將空值轉(zhuǎn)換為一個指定的值。例如,以下語句將獎金為空的數(shù)據(jù)轉(zhuǎn)換為0:
select emp_name, ifnull(bonus, 0) as bonus
from employee
where dept_id = 3
order by ifnull(bonus, 0);
emp_name|bonus |
----------|-------|
趙 | 0.00|
錢 |5000.00|10.5
5.中文排序
中文排序我們可以為數(shù)據(jù)庫、表或者字段指定一個字符集(Charset)和排序規(guī)則(Collation)。字符集決定了能夠存儲哪些字符,比如 ASCII 字符集只能存儲簡單的英文、數(shù)字和一些控制字符;GB2312 字符集可以存儲中文;Unicode 字符集能夠支持世界上的各種語言。排序規(guī)則定義了字符集中字符的排序順序,包括是否區(qū)分大小寫,是否區(qū)分重音等。對于中文而言,排序方式與英文有所不同;中文通常需要按照拼音、偏旁部首或者筆畫進行排序。
以上的5種數(shù)據(jù)排序基本上囊括了MySQL的數(shù)據(jù)排序,良好的排序方法可以有效提高排序速度,提高排序效果,提升用戶的使用體驗,千萬不能小覷,在本站的MySQL教程中,對各種MySQL數(shù)據(jù)排序方式都有詳細的實例介紹,感興趣的小伙伴千萬不要錯過學好MySQL數(shù)據(jù)排序的機會。