mysql语句怎么先排序 mysql语句顺序( 二 )


查询employee表中的所有记录,按照d_id字段的降序方式和age字段的升序方式进行排序 。
MySql的几种排序方式1、单列排序
SELECT * FROM test1 ORDER BY date_time
默认升序 , 降序后面接"DESC"即可 。
2、多列排序
SELECT * FROM test1 ORDER BY `status`, date_time DESC
首先按`status`字段排序,若`status`相等,则按data_time排序 。
3、自定义排序
SELECT * FROM test1 ORDER BY FIELD(`status`, 3, 2, 4, 1, 5), date_time DESC
使用"FIELD()"函数,可指定顺序 。
4、其他条件排序
先按大于等于当前时间升序,再按小于当前时间降序,支持分页 。
SELECT * FROM test1 ORDER BY date_timeNOW(), IF(date_timeNOW(), 0, date_time), date_time DESC
附加SQL脚本:
CREATE TABLE `test1` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`date_time` datetime NOT NULL,
`status` int(5) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
INSERT INTO `test1` VALUES
(NULL, '测试1', '2018-03-05 11:09:00', 1),(NULL, '测试2', '2018-03-06 11:09:00', 1),(NULL, 'abc', '2018-03-07 11:09:00', 1),
(NULL, 'def', '2018-04-08 11:09:00', 2),(NULL, '李某某', '2018-04-17 11:09:00', 1),(NULL, '饭某某', '2018-04-20 13:09:00', 2),
(NULL, '赵', '2018-04-20 01:09:00', 4),(NULL, '倩', '2018-04-28 11:09:00', 2),(NULL, 'andy', '2018-04-30 11:09:00', 1),
(NULL, 'tony', '2018-05-08 11:09:00', 4),(NULL, 'tom', '2018-05-07 11:09:00', 3),(NULL, 'bill', '2018-05-18 11:09:00', 3),
(NULL, 'james', '2018-06-07 11:09:00', 4),(NULL, 'anthony', '2018-06-18 11:09:00', 2),(NULL, '盖茨', '2018-04-21 11:09:00', 1),
(NULL, '部长', '2018-04-24 11:09:00', 4),(NULL, '李总', '2018-04-20 11:09:00', 5),(NULL, '张总', '2018-04-29 11:09:00', 2),
(NULL, '王总', '2018-04-19 11:09:00', 3),(NULL, '唐总', '2018-05-01 11:09:00', 2);
参考的这篇文档Mysql排序方式
mysql分组排序 , 取每组第一条数据 MySQL:5.7
SQL语句的写法:
思路:先进行排序,然后再进行分组,获取每组的第一条 。
derived_merge指的是一种查询优化技术,作用就是把派生表合并到外部的查询中,提高数据检索的效率 。这个特性在MySQL5.7版本中被引入,可以通过如下SQL语句进行查看/开启/关闭等操作 。
上面虽然听起来感觉很牛逼的样子,但是实际情况是,这个新特性 , 不怎么受欢迎,容易引起错误 。
假设我们现在把sql中的 distinct(a.id) tid ,去掉,会发现子查询(或者叫:临时表)中的order by a.id desc失效了 。
为什么会这样呢?
原理分析:
我们这里使用了临时表排序,继而对其结果进行分组,结果显示失败,加了distinct(a.id) tid,后结果正确,原因是因为临时表(派生表derived table)中使用order by且使其生效,必须满足三个条件:
一旦外部表使用了group by ,  那么临时表(派生表 derived table)将不会执行filesort操作(即 order by 会被忽略 ) 。之后我使用了limit可以使其生效 , 原因是因为要使派生表order by生效 ,  派生表可以通过使用group by、limit、having、distinct等等使其生效 (方法有好多 , 详情可看文档)
原文链接:
关于mysql语句怎么先排序和mysql语句顺序的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

推荐阅读