更新时间:2021-01-22 17:43:30 来源:极悦 浏览1322次
数据排序是按一定顺序将数据排列,以便研究者通过浏览数据发现一些明显的特征或趋势, 找到解决问题的线索。但是在MySQL数据库中,默认情况下,SELECT语句不会对返回的结果进行排序,意味着查询结果的显示顺序是不确定的。如果想要将结果按照某种规则进行排序,例如按照入职先后顺序显示员工的信息,可以使用ORDER BY子句。MySQL数据排序分为以下5种:单列排序、多列排序、表达式排序,空值排序和中文排序,下面的内容将依次介绍这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|
...对于升序排序,数字按照从小到大的顺序排列,字符按照编码的顺序排列,日期时间按照从早到晚的顺序排列;降序排序正好相反。在上面的查询结果中,入职日期为 2000-01-01 的员工有 3 位。那么他们谁排在前面,谁排在后面呢?答案是不确定。如果要解决这个问题,需要使用多列排序。
2.多列排序
多列排序是指基于多个字段的值排序,多个字段使用逗号进行分隔。
多列排序的语法如下:SELECT col1, col2, ...
FROM table_name
[WHERE conditions]
ORDER BY col1 [ASC | DESC], col2 [ASC | DESC], ...;
执行过程中,先基于第一个字段进行排序;
对于第一个字段排序相同的数据,再基于第二个字段进行排序;
依此类推。例如,以下语句查询行政管理部(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. 表达式排序
除了使用字段的值进行排序之外,也可以基于表达式的结果进行排序。例如,以下语句按照年度总收入(年薪加奖金)进行排序:
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) 函数用于将 bonus 为空的数据转换为 0;该函数将会在后续文章中进行介绍。另外,在指定排序字段时,除了使用字段名或者表达式之外,也可以使用它们在查询列表中出现的数字编号顺序。
上面的示例可以改写如下:
select emp_name, salary, bonus, salary * 12 + ifnull(bonus, 0) as total_income
from employee
order by 4;
在查询列表中,total_income 是返回的第 4 个字段;因此该语句也是按照年度总收入从低到高进行排序。
4.空值排序
空值(NULL)在 SQL 中表示未知或者缺失的值。如果排序的字段中存在空值时,结果会怎么样呢?
以下语句按照奖金从高到低进行排序:
select emp_name, bonus
from employee
where dept_id = 3
order by bonus desc;
emp_name|bonus |
----------|-------|
赵 |5000.00|
钱 | |从查询结果可以看到,空值排在了最后。也就是说,MySQL 认为空值最小,升序时排在最前,降序时排在最后。如果想要调整空值的排序位置,可以使用函数(例如 ifnull)将空值转换为一个指定的值。例如,以下语句将奖金为空的数据转换为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.中文排序
中文排序我们可以为数据库、表或者字段指定一个字符集(Charset)和排序规则(Collation)。字符集决定了能够存储哪些字符,比如 ASCII 字符集只能存储简单的英文、数字和一些控制字符;GB2312 字符集可以存储中文;Unicode 字符集能够支持世界上的各种语言。排序规则定义了字符集中字符的排序顺序,包括是否区分大小写,是否区分重音等。对于中文而言,排序方式与英文有所不同;中文通常需要按照拼音、偏旁部首或者笔画进行排序。
以上的5种数据排序基本上囊括了MySQL的数据排序,良好的排序方法可以有效提高排序速度,提高排序效果,提升用户的使用体验,千万不能小觑,在本站的MySQL教程中,对各种MySQL数据排序方式都有详细的实例介绍,感兴趣的小伙伴千万不要错过学好MySQL数据排序的机会。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习