order by null(ThinkPHP order by 两个条件)

本文目录
- ThinkPHP order by 两个条件
- oracle使用orderby排序null值如何处理
- mysql中group by里面的问题
- oracle使用order by排序null值如何处理
- 请教各位同仁有关hibernate查询语句中order by中null值的处理
- ORDER BY ISNULL((SELECT RTRIM(货位号) FROM CPBM 是什么意思
- mysql 可以group by 两个字段吗
- 为什么SQL语句的结尾要加上ORDER BY NULL
ThinkPHP order by 两个条件
order by可以按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),如果缺省,则是升序。order by中如果定义了多个字段,则按照字段的先后顺序排序。
比如: order by * desc, * acs ;
*为条件,条件的优先级和条件的先后顺序一致,order by通常放在SQL语句的最后。
扩展资料:
order by排序的用法:
1,ORDER BY 中关于NULL的处理缺省处理
Oracle在Order by 时认为null是最大值,所以如果是ASC升序则排在最后,DESC降序则排在最前。也可以使用nulls first 或者nulls last 语法来控制NULL的位置。
如果Order by 中指定了表达式Nulls first则表示null值的记录将排在最前(不管是asc 还是 desc)如果Order by 中指定了表达式Nulls last则表示null值的记录将排在最后 (不管是asc 还是 desc)
2,多列排序
单列升序:select《column_name》 from 《table_name》 order by 《column_name》; (默认升序,即使不写ASC)
单列降序:select 《column_name》 from 《table_name》 order by 《column_name》 desc。
多列升序:select 《column_one》, 《column_two》 from 《table_name》 order by 《column_one》, 《column_two》。
多列降序:select 《column_one》, 《column_two》 from 《table_name》 order by 《column_one》 desc, 《column_two》 desc。
多列混合排序:select 《column_one》, 《column_two》 from 《table_name》 order by 《column_one》 desc, 《column_two》 asc。
oracle使用orderby排序null值如何处理
oracle 对查询结果进行排序时,被排序的栏位存在null值,且要指定NULL值排在最前面或者最后面,本文将介绍如何处理oracle 空值排序,需要的朋友可以参考下
适用情况:
oracle 对查询结果进行排序时,被排序的栏位存在null值,且要指定NULL值排在最前面或者最后面
关键字:Nulls First;Nulls Last
默认情况:null 默认为最大值(即:asc 升序大》,null值排在最后;desc 降序小》,null值排在最前面)
指定:
1.Oracle Order by支持的语法
2.指定Nulls first 则表示null值的记录将排在最前(不管是asc 还是desc)
3.指定Nulls last 则表示null值的记录将排在最后(不管是asc 还是desc)
语法举例:(Table:Tab_A 有部分空值的栏位Col_A)
select * from Tab_A order by Tab_A. Col_A (asc/desc) nulls first------》null 值排在最前面
select * from Tab_A order by Tab_A. Col_A (asc/desc) nulls last ------》null 值排在最后面
其他方法:
在order by 的时候,用Nvl、NVL2 、Decode、case .....when....end;等函数对栏位的null值进行处理
例如:select * from Tab_A order by NVL(Tab_A. Col_A,’abc’ ) (asc/desc);
mysql中group by里面的问题
GROUP BY dept,name 的意思,就是先按dqpt分组,如果出现dept相同的,再按name分组,也就是说除非出现dept和name都相同的记录才会合为一组,否则的话是不会合在一起的,这样的话显示出的name就只有一个了。
你用现实生活中的例子来理解一下就很明白啦:比如说你们班上的同学如果按性别来分组,可以分为两组,如果按照姓名来分组,那就基本上有多少个同学就有多少组(除非有同名同姓的),那如果按性别和姓名同时分组呢,那分的组就是同学数的两倍了,即“男的张三”一组,“女的张三”一组,“男的李四”一组,“女的李四”一组……当然,这其中有一半的组是空的,剩下的也是每一组只有一个人啊!理解没有?
所以 Group by 后面的分组字段不是随便加的,多个字段的分组是需要排列组合的,分的组数会按几何级数增长!
补充说一句:本来按名字来分组就是个愚不可及的想法了!更何况还要加上其他分组条件,这样的话基本上就是一组只有一个了!
oracle使用order by排序null值如何处理
适用情况:oracle 对查询结果进行排序时,被排序的栏位存在null值,且要指定NULL值排在最前面或者最后面,
在order by 的时候,用Nvl、NVL2 、Decode、case .....when....end;等函数对栏位的null值进行处理。
排序要看用什么字段排序,可以单个字段,也可以多个字段,这些与存在值是否为null无关。
如下列数据
id name class
1 a 1
2 b null
3 c null
现在要按id和class排序,其中id为主要排序字段,class为次要排序字段
可写如下语句
select * from 表名 order by id,class。
请教各位同仁有关hibernate查询语句中order by中null值的处理
Query q = getSession().createQuery( from T order by idx ); List li=q.list(); 一开始我用HIBERNATE自带的连接池,发先了查询结果不稳定现象,然后我换成C3P0,问题依旧。
ORDER BY ISNULL((SELECT RTRIM(货位号) FROM CPBM 是什么意思
问题在详细点,isnull(xx)判断是否为空,
ISNULL((SELECT RTRIM(货位号) FROM CPBM )
是将CPBM表中检索出RTRIM(货位号) ,不为空,
而ORDER BY 是排序,按RTRIM字段,ASC(升序)或DESC(降序),默认是升序。
mysql 可以group by 两个字段吗
在日常查询中,索引或其他数据查找的方法可能不是查询执行中最高昂的部分,例如:MySQL GROUP BY 可能负责查询执行时间 90% 还多。MySQL 执行 GROUP BY 时的主要复杂性是计算 GROUP BY 语句中的聚合函数。UDF 聚合函数是一个接一个地获得构成单个组的所有值。这样,它可以在移动到另一个组之前计算单个组的聚合函数值。当然,问题在于,在大多数情况下,源数据值不会被分组。来自各种组的值在处理期间彼此跟随。因此,我们需要一个特殊的步骤。
处理 MySQL GROUP BY让我们看看之前看过的同一张table: mysql》 show create table tbl G *************************** 1. row *************************** Table: tbl Create Table: CREATE TABLE `tbl` ( `id` int(11) NOT NULL AUTO_INCREMENT, `k` int(11) NOT NULL DEFAULT ’0’, `g` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `k` (`k`) ) ENGINE=InnoDB AUTO_INCREMENT=2340933 DEFAULT CHARSET=latin1 1 row in set (0.00 sec)
并且以不同方式执行相同的 GROUP BY 语句:
1、MySQL中 的 Index Ordered GROUP BY
mysql》 select k, count(*) c from tbl group by k order by k limit 5;
+---+---+
| k | c |
+---+---+
| 2 | 3 |
| 4 | 1 |
| 5 | 2 |
| 8 | 1 |
| 9 | 1 |
+---+---+
5 rows in set (0.00 sec)
mysql》 explain select k, count(*) c from tbl group by k order by k limit 5 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: index
possible_keys: k
key: k
key_len: 4
ref: NULL
rows: 5
filtered: 100.00
Extra: Using index
1 row in set, 1 warning (0.00 sec)
在这种情况下,我们在 GROUP BY 的列上有一个索引。这样,我们可以逐组扫描数据并动态执行 GROUP BY(低成本)。当我们使用 LIMIT 限制我们检索的组的数量或使用“覆盖索引”时,特别有效,因为顺序索引扫描是一种非常快速的操作。
2、MySQL 中的外部排序 GROUP BY
mysql》 explain select SQL_BIG_RESULT g, count(*) c from tbl group by g limit 5 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 998490
filtered: 100.00
Extra: Using filesort
1 row in set, 1 warning (0.00 sec)
mysql》 select SQL_BIG_RESULT g, count(*) c from tbl group by g limit 5;
+---+---+
| g | c |
+---+---+
| 0 | 1 |
| 1 | 2 |
| 4 | 1 |
| 5 | 1 |
| 6 | 2 |
+---+---+
5 rows in set (0.88 sec)
如果我们没有允许我们按组顺序扫描数据的索引,我们可以通过外部排序(在 MySQL 中也称为“filesort”)来获取数据。你可能会注意到我在这里使用 SQL_BIG_RESULT 提示来获得这个计划。没有它,MySQL 在这种情况下不会选择这个计划。
3、MySQL中 的临时表 GROUP BY
mysql》 explain select g, sum(g) s from tbl group by g limit 5 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 998490
filtered: 100.00
Extra: Using temporary
1 row in set, 1 warning (0.00 sec)
mysql》 select g, sum(g) s from tbl group by g order by null limit 5;
+---+------+
| g | s |
+---+------+
| 0 | 0 |
| 1 | 2 |
| 4 | 4 |
| 5 | 5 |
| 6 | 12 |
+---+------+
5 rows in set (7.75 sec)
在这种情况下,MySQL 也会进行全表扫描。但它不是运行额外的排序传递,而是创建一个临时表。此临时表每组包含一行,并且对于每个传入行,将更新相应组的值。很多更新!虽然这在内存中可能是合理的,但如果结果表太大以至于更新将导致大量磁盘 IO,则会变得非常昂贵。在这种情况下,外部分拣计划通常更好。请注意,虽然 MySQL 默认选择此计划用于此用例,但如果我们不提供任何提示,它几乎比我们使用 SQL_BIG_RESULT 提示的计划慢 10 倍 。您可能会注意到我在此查询中添加了“ ORDER BY NULL ”。这是为了向您展示“清理”临时表的唯一计划。没有它,我们得到这个计划: mysql》 explain select g, sum(g) s from tbl group by g limit 5 G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: tbl partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 998490 filtered: 100.00 Extra: Using temporary; Using filesort 1 row in set, 1 warning (0.00 sec)
在其中,我们获得了 temporary 和 filesort “两最糟糕的”提示。MySQL 5.7 总是返回按组顺序排序的 GROUP BY 结果,即使查询不需要它(这可能需要昂贵的额外排序传递)。ORDER BY NULL 表示应用程序不需要这个。您应该注意,在某些情况下 - 例如使用聚合函数访问不同表中的列的 JOIN 查询 - 使用 GROUP BY 的临时表可能是唯一的选择。
4、MySQL 中的索引基于跳过扫描的 GROUP BY前三个 GROUP BY 执行方法适用于所有聚合函数。然而,其中一些人有第四种方法。
mysql》 explain select k,max(id) from tbl group by k G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: range
possible_keys: k
key: k
key_len: 4
ref: NULL
rows: 2
filtered: 100.00
Extra: Using index for group-by
1 row in set, 1 warning (0.00 sec)
mysql》 select k,max(id) from tbl group by k;
+---+---------+
| k | max(id) |
+---+---------+
| 0 | 2340920 |
| 1 | 2340916 |
| 2 | 2340932 |
| 3 | 2340928 |
| 4 | 2340924 |
+---+---------+
5 rows in set (0.00 sec)
此方法仅适用于非常特殊的聚合函数:MIN() 和 MAX()。这些并不需要遍历组中的所有行来计算值。他们可以直接跳转到组中的最小或最大组值(如果有这样的索引)。如果索引仅建立在 (K) 列上,如何找到每个组的 MAX(ID) 值?这是一个 InnoDB 表。记住 InnoDB 表有效地将 PRIMARY KEY 附加到所有索引。(K) 变为 (K,ID),允许我们对此查询使用 Skip-Scan 优化。仅当每个组有大量行时才会启用此优化。否则,MySQL 更倾向于使用更传统的方法来执行此查询(如方法#1中详述的索引有序 GROUP BY)。虽然我们使用 MIN() / MAX() 聚合函数,但其他优化也适用于它们。例如,如果您有一个没有 GROUP BY 的聚合函数(实际上所有表都有一个组),MySQL 在统计分析阶段从索引中获取这些值,并避免在执行阶段完全读取表: mysql》 explain select max(k) from tbl G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: NULL partitions: NULL type: NULL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: NULL filtered: NULL Extra: Select tables optimized away 1 row in set, 1 warning (0.00 sec)
我们已经研究了 MySQL 执行 GROUP BY 的四种方式。为简单起见,我在整个表上使用了 GROUP BY,没有应用过滤。当您有 WHERE 子句时,相同的概念适用: mysql》 explain select g, sum(g) s from tbl where k》4 group by g order by NULL limit 5 G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: tbl partitions: NULL type: range possible_keys: k key: k key_len: 4 ref: NULL rows: 1 filtered: 100.00 Extra: Using index condition; Using temporary 1 row in set, 1 warning (0.00 sec)
对于这种情况,我们使用K列上的范围进行数据过滤/查找,并在有临时表时执行 GROUP BY。在某些情况下,方法不会发生冲突。但是,在其他情况下,我们必须选择使用 GROUP BY 的一个索引或其他索引进行过滤:
mysql》 alter table tbl add key(g);
Query OK, 0 rows affected (4.17 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql》 explain select g, sum(g) s from tbl where k》1 group by g limit 5 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: index
possible_keys: k,g
key: g
key_len: 4
ref: NULL
rows: 16
filtered: 50.00
Extra: Using where
1 row in set, 1 warning (0.00 sec)
mysql》 explain select g, sum(g) s from tbl where k》4 group by g limit 5 G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl
partitions: NULL
type: range
possible_keys: k,g
key: k
key_len: 4
ref: NULL
rows: 1
filtered: 100.00
Extra: Using index condition; Using temporary; Using filesort
1 row in set, 1 warning (0.00 sec)
根据此查询中使用的特定常量,我们可以看到我们对 GROUP BY 使用索引顺序扫描(并从索引中“放弃”以解析 WHERE 子句),或者使用索引来解析 WHERE 子句(但使用临时表来解析 GROUP BY)。根据我的经验,这就是 MySQL GROUP BY 并不总是做出正确选择的地方。您可能需要使用 FORCE INDEX 以您希望的方式执行查询。
如果您有少量组,并且没有覆盖索引,索引顺序扫描可能会导致大量 IO。所以这可能不是最优化的计划。
一般来说,MySQL 只有在我们拥有大量组时才更喜欢使用这个计划,因为在这种情况下,排序比拥有临时表更有效(我们将在下面讨论)。
如果要强制 MySQL 使用为 GROUP BY 执行临时表的计划,可以使用 SQL_SMALL_RESULT 提示。
过滤和分组
为什么SQL语句的结尾要加上ORDER BY NULL
有时候我们会看到项目中有些SQL语句带有 ORDER BY NULL ,这时我们看的有点疑惑了。难道 ORDER BY NULL 是按null进行排序的意思么?关键是表中字段都是设置NOT NULL,那还怎么按照null排序?
我们在学习索引优化时知道, ORDER BY 后面字段建立索引,可利用索引有序性而不用对字段进行额外排序操作,以提升语句执行效率 。而null不是索引字段,也没代表什么实际的含义,那么在SQL语句带有 ORDER BY NULL 究竟有什么用?下面一起来一探究竟。
查看MySQL官方文档可以看到,官方对使用 ORDER BY NULL 给出的解析。大致意思是,在SQL语句中会隐含对 GROUP BY 列进行排序,如果在 GROUP BY 列后面加上 ORDER BY NULL 会去掉这个隐含排序,以提升语句查询的速度。
***隐藏网址***
纸上得来终觉浅,绝知此事要躬行。下面我们利用EXPLAIN,来复现一下这个场景:
GROUP BY
GROUP BY + ORDER BY NULL
我们可以看到加上 ORDER BY NULL 之后可以看到Extra里面少了 Using filesort 。
Using filesort 表示对查询结果进行排序的意思。如果我们查询的结果集是非常大的,排序操作也将消耗较多的性能,如果去掉Using filesort,减少排序的步骤,将会对查询的效率有极大的提升。小小的改进,收益却是巨大的。
同时,在 stackoverflow 中发现有人说MySQL 8.0之后版本使用 ORDER BY NULL 将没有任何的查询性能上收益了。
原因是8.0版本之后, GROUP BY 的隐含排序已经去掉了,在 GROUP BY 后面使用 ORDER BY NULL 也不会出现5.7版本之前压制字段隐含排序的现象,所以也没有必要在SQL语句中加上 ORDER BY NULL 。在MySQL官方文档中也有相同的叙述,由于本人使用的是MySQL版本是5.7,感兴趣的小伙伴可以在8.0上复现一下这个场景。
***隐藏网址***
如果使用8.0之前版本,在没有明确声明 ORDER BY 列时,可以在 GROUP BY 后加上 ORDER BY NULL 来提升查询的效率。
如果使用8.0之后版本, GROUP BY 后无需加 ORDER BY NULL ,但需留意结果集是未排序的。 GROUP BY 后无需加 ORDER BY NULL ,但需留意结果集是未排序的。

更多文章:
kali上传文件到apache服务器(如何在macOS系统和KaliLinux系统之间共享文件)
2025年10月25日 23:30
c语言一维数组有几个数(c语言的一维数组中至少要有几个元素)
2025年11月27日 13:30
织梦岛隐藏要素(塞尔达传说织梦岛脸孔神殿迷宫怎么通关 脸孔神殿迷宫)
2025年9月18日 18:45
最新版android studio安装(如何安装android studio)
2025年9月24日 10:15
97的十六进制(97 98 换成八进制 如何换 如何将十进制转换成八进制或者十六进制 哪位大仙帮帮忙)
2026年4月5日 15:00
redis命令登录(软件Xshell连接Redis操作教程)
2026年6月6日 17:30
category nouns(the different lexical category in translation)
2026年1月9日 10:45
哈夫曼树编码不唯一那解码结果(如何解决哈夫曼树不唯一的问题)
2025年6月24日 02:45
关系数据库管理系统有哪些?(下面哪些属于关系型数据库管理系统())
2026年5月2日 12:15
insertrow(在Power Query中如何插入自定义行)
2025年10月10日 12:30
















