MySQL 排序

Posted 不会写代码的菜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 排序相关的知识,希望对你有一定的参考价值。

排序数据

1.排序规则

  • 使用ORDER BY 字句排序,在其后面加所需字段

    • ASC(ascend): 升序

    • DESC(descend): 降序

  • ORDER BY 字句在SELECT语句的结尾

注意:

数据库中默认按照先后添加顺序存储数据,在查询时,也按照添加顺序遍历显示结果.因此当我们需要一些特定的数据排列时就要使用到排序

2.单列排序

#练习: 按照salary从高到低顺序对员工进行排序

SELECT employees_id,last_name,salary
FROm employees
ORDER BY salary DESC;

#练习: 按照salary从高到顺序对员工进行排序

SELECT employees_id,last_name,salary
FROm employees
ORDER BY salary ASC;

注意:

如果在ORDER BY 后面没有显示指明排序方式的话,则默认按照升序排列排序

#练习: 可以使用列的别名进行排序

SELECT employee_id,salary * 12 annual_sal
FROM employees
ORDER BY annual_sal;

注意:

  • 列的别名只能在ORDER BY 语句之中对字段进行排序,不能在WHERE语句之中对字段进行排序

#有WHERE 和 ORDER BY 同时出现的地方,一定要把WHERE放在FRON语句后面,ORDER BY 往后放

SELECT employee_id,salary
FROM employees
WHERE department_id IN (50,60,70)
ORDER BY department_id DESC;

注意:

  • ORDER BY 的查询字段,不一定非得是上面SELECT的查询字段,即即使没有在SELECT语句中查询表中的相应字段,只要是在表中,就可以使用ORDER BY 语句进行排序

  • 原因:

因为SQL语句并非按照从前的顺序执行,实际执行时先从FROM语句出发,找到表中的数据,再走到WHERE语句进行过滤操作,筛选出所有所需的数据;按照走到SELECT语句,选择出所需查询的字段和字段的别名;接下来再到后面的ORDER BY 语句中对应的字段进行排序,而WHERE 语句在 SELECT 语句之前执行,此时还没有创建字段的别名,因此,在WHERE 语句中使用字段的别名会报错

例如:

SELECT employee_id,salary
FROM employees
WHERE department_id > 16400;  # 此时会报错

3.多列排序

#练习: 显示员工信息,按照department_id降序排序,再按照salary的升序排序

SELECT employee_id,salary
FROM employees
ORDER BY department_id DESC,salary ASC;
  • 可以使用不在SELECT列表中的列排序

  • 在对多列进行排序时,首先排序的第一列必须有相同的列值,才会对第二列及另外的列进行排序,如果第一列的数据中所有的值都是唯一的.将不再对第二列及后面的列进行排序

mysql 时间排序问题

有一个表如下:
name time
xx 今天1:00
xx 2:00
xx 3:00
每小时1条数据.....
.....
....
....
xx 24:00
共24条数据
(时间是时间戳,为方便,在此写成时间)
想做如下排序:比如现在16:00 要从现在开始排排成如下:
16:00,17:00,18:00,19,20,21,22,23,24 ,15,14,13,12,11,10,9,8,......1
请问怎么写查询语句

-------------------------------------------方法1
select * from (
select
tablename_tmp.*,
@rownum:=@rownum+1 ,
if(time >=DATE_FORMAT(now(),'%Y-%m-%d %H:00') ,@rank:=@rank+1,@rank:=0) as rank
from (
select * from tablename order by time desc
)
tablename_tmp ,
(select @rownum :=0 , @ptime := null ,@rank:=0) a
) a
order by rank desc ,time desc
---------------------------------------方法2
select * from tablename order by 
(case when DATE_FORMAT(time ,'%k')=0 then 24 when  DATE_FORMAT(time ,'%k')*1>=DATE_FORMAT(now(),'%k')*1  then DATE_FORMAT(time ,'%k') else 25 end) ,time desc

题主测试一下?你这里的24点应该是第二天的00:00:00  。你这样排有什么用处?

追问

就想知道用什么方法排,或者这么说吧。1-10 10个数,比5大或等于5的正序排列,比5小的倒序排列,产生这样一个结果 5 6 7 8 9 10 4 3 2 1

追答

那你就要多加一列做为区分这两类数据(大于或等于5的集合和小于5的集合)的标志,排在前或后都有讲究的。
比如生成这样的:
number 多加的
1 4
2 3
3 2
4 1
5 0
6 0
7 0
8 0
9 0
10 0
select * from tablename order by 多加的 , number
还嫌麻烦就做并集:
select * from tablename where number>=5 order by number
union all
select * from tablename where number<5 order by number desc

参考技术A select name, time from 表名 order by 时间 asc; //按照时间戳升序排序,如果要降序的话就"order by 时间 desc" 参考技术B 如果你的time是时间戳的话直接order by time dec追问

时间不是递减的,是按照从现在的时间开始递增,增到12点再从现在的时间递减

以上是关于MySQL 排序的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 分组并排序

mysql使用sql语句根据经纬度计算距离排序

mysql数据库,排序的语句

mysql查询结果排序

MySQL数据库的高级SQL语句!

MySQL数据库的高级SQL语句!