barriers / 阅读 / 详情

SQL语句 里的order by 、group by、having、where 用在哪里

2023-07-08 14:12:31
共1条回复
我不懂运营

1.order by 是 按字段 进行排序.. 字段后面可跟 desc 降序..asc 升序..默认为升序2.group by 是进行分组 查询3.having 和 where 都属于 条件过滤 区别在于 一般having是和 group by 连用... 目的是 分组后进行的条件查询...而如果在group by 前面有where 则是表示 先条件过滤再 分组 这个在实际中 特殊的查询 会影响到查询结果PS: 这几条关键字 是有先后顺序的. where.....group by....having.....order by 都是可选..但是如果全部写出来 必须是这个顺序...

相关推荐

order by 和 group by 的区别

order by 排序查询、asc升序、desc降序示例:select * from 学生表 order by 年龄 查询学生表信息、按年龄的升序(默认、可缺省、从低到高)排列显示也可以多条件排序、 比如 order by 年龄,成绩 desc 按年龄升序排列后、再按成绩降序排列group by 分组查询、having 只能用于group by子句、作用于组内,having条件子句可以直接跟函数表达式。使用group by 子句的查询语句需要使用聚合函数。示例:select 学号,SUM(成绩) from 选课表 group by 学号 按学号分组、查询每个学号的总成绩select 学号,AVG(成绩) from 选课表 group by 学号having AVG(成绩)>(select AVG(成绩) from 选课表 where 课程号="001")order by AVG(成绩) desc查询平均成绩大于001课程平均成绩的学号、并按平均成绩的降序排列
2023-07-08 12:28:145

order by 和 group by 的区别?

order by 排序查询、asc升序、desc降序示例:select * from 学生表 order by 年龄 查询学生表信息、按年龄的升序(默认、可缺省、从低到高)排列显示也可以多条件排序、 比如 order by 年龄,成绩 desc 按年龄升序排列后、再按成绩降序排列group by 分组查询、having 只能用于group by子句、作用于组内,having条件子句可以直接跟函数表达式。使用group by 子句的查询语句需要使用聚合函数。示例:select 学号,SUM(成绩) from 选课表 group by 学号 按学号分组、查询每个学号的总成绩select 学号,AVG(成绩) from 选课表 group by 学号having AVG(成绩)>(select AVG(成绩) from 选课表 where 课程号="001")order by AVG(成绩) desc查询平均成绩大于001课程平均成绩的学号、并按平均成绩的降序排列
2023-07-08 12:29:187

order by是什么意思

order by 是排序的意思。order by 列名1,列名2,..... 你按照什么排序就写什么列。 如果列名后什么都不写,也可以写ASC,表示升序排列,如果要想降序排列,在列名后面写desc 。 order by是什么意思 order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。 group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。 在使用group by的语句中,只能select用于分类的列(表达式),或聚合函数。 where条件用于group by之前,having用于group by 之后对结果进行筛选。 order用法 一、名词order: 1、作“顺序”、“次序”。常用短语:in order of 按顺序。如: A list of some of the common metals in the order of their activity is given below. 下面列出了某些金属按其活泼顺序排列的一个表格. 2、作“秩序”。常用短语:keep ... in order 使......有序。如: The machine is in good working order. 机器运转良好. Our laboratory is kept in good order. 我们的实验室保持整齐.(句中in good order为主语补语.) 3、作“指示、命令”。常用短语:give sb. anorderto do sth.命令某人做某事。如: He gave orders for the work to be started. (=…orders that the work should be started.)他下令开始工作. 4、点菜;所点的饮食菜肴。 二、动词order: 1、作”命令”。常用短语:ordersb.to do sth. 令某人做某事。如: The doctor ordered him to stay there.医生嘱咐他留在那里。(不定式短语to stay there作宾语补语) 2、作“点餐、“订购”。常用短语:ordersth.for sb./ordersb.for sth.为某人订购/点某物。如: They have ordered 1,000 oil pumps from our factory.他们已向我厂订购1,000台油泵。 来源:网络。本文版权归原创作者所以。
2023-07-08 12:29:391

对order by的理解

前言 日常开发中,我们经常会使用到order by,亲爱的小伙伴,你是否知道order by 的工作原理呢?order by的优化思路是怎样的呢?使用order by有哪些注意的问题呢?本文将跟大家一起来学习,攻克order by~ 一个使用order by 的简单例子 假设用一张员工表,表结构如下: 表数据如下: 我们现在有这么一个需求:查询前10个,来自深圳员工的姓名、年龄、城市,并且按照年龄小到大排序。对应的 SQL 语句就可以这么写: 这条语句的逻辑很清楚,但是它的底层执行流程是怎样的呢? order by 工作原理 explain 执行计划 我们先用Explain关键字查看一下执行计划 我们可以发现,这条SQL使用到了索引,并且也用到排序。那么它是怎么排序的呢? 全字段排序 MySQL 会给每个查询线程分配一块小内存,用于排序的,称为 sort_buffer。什么时候把字段放进去排序呢,其实是通过idx_city索引找到对应的数据,才把数据放进去啦。 我们回顾下索引是怎么找到匹配的数据的,现在先把索引树画出来吧,idx_city索引树如下: idx_city索引树,叶子节点存储的是主键id。还有一棵id主键聚族索引树,我们再画出聚族索引树图吧: 我们的查询语句是怎么找到匹配数据的呢?先通过idx_city索引树,找到对应的主键id,然后再通过拿到的主键id,搜索id主键索引树,找到对应的行数据。 加上order by之后,整体的执行流程就是: 执行示意图如下: 将查询所需的字段全部读取到sort_buffer中,就是全字段排序。这里面,有些小伙伴可能会有个疑问,把查询的所有字段都放到sort_buffer,而sort_buffer是一块内存来的,如果数据量太大,sort_buffer放不下怎么办呢? 磁盘临时文件辅助排序 实际上,sort_buffer的大小是由一个参数控制的:sort_buffer_size。如果要排序的数据小于sort_buffer_size,排序在sort_buffer 内存中完成,如果要排序的数据大于sort_buffer_size,则借助磁盘文件来进行排序 如何确定是否使用了磁盘文件来进行排序呢?可以使用以下这几个命令 可以从 number_of_tmp_files 中看出,是否使用了临时文件。 number_of_tmp_files 表示使用来排序的磁盘临时文件数。如果number_of_tmp_files>0,则表示使用了磁盘文件来进行排序。 使用了磁盘临时文件,整个排序过程又是怎样的呢? TPS: 借助磁盘临时小文件排序,实际上使用的是归并排序算法。 小伙伴们可能会有个疑问,既然sort_buffer放不下,就需要用到临时磁盘文件,这会影响排序效率。那为什么还要把排序不相关的字段(name,city)放到sort_buffer中呢?只放排序相关的age字段,它不香吗?可以了解下rowid 排序。 rowid 排序 rowid 排序就是,只把查询SQL需要用于排序的字段和主键id,放到sort_buffer中。那怎么确定走的是全字段排序还是rowid 排序排序呢? 实际上有个参数控制的。这个参数就是max_length_for_sort_data,它表示MySQL用于排序行数据的长度的一个参数,如果单行的长度超过这个值,MySQL 就认为单行太大,就换rowid 排序。我们可以通过命令看下这个参数取值。 max_length_for_sort_data 默认值是1024。因为本文示例中name,age,city长度=64+4+64 =132 < 1024, 所以走的是全字段排序。我们来改下这个参数,改小一点. 使用rowid 排序的话,整个SQL执行流程又是怎样的呢? 执行示意图如下: 对比一下全字段排序的流程,rowid 排序多了一次回表。 什么是回表?拿到主键再回到主键索引查询的过程,就叫做回表” 我们通过optimizer_trace,可以看到是否使用了rowid排序的: 全字段排序与rowid排序对比 一般情况下,对于InnoDB存储引擎,会优先使用全字段排序。可以发现 max_length_for_sort_data 参数设置为1024,这个数比较大的。一般情况下,排序字段不会超过这个值,也就是都会走全字段排序。 order by的一些优化思路 我们如何优化order by语句呢? 联合索引优化 再回顾下示例SQL的查询计划 我们给查询条件city和排序字段age,加个联合索引idx_city_age。再去查看执行计划: 可以发现,加上idx_city_age联合索引,就不需要Using filesort排序了。为什么呢?因为索引本身是有序的,我们可以看下idx_city_age联合索引示意图,如下: 整个SQL执行流程变成酱紫: 流程示意图如下: 从示意图看来,还是有一次回表操作。针对本次示例,有没有更高效的方案呢?有的,可以使用覆盖索引: 覆盖索引:在查询的数据列里面,不需要回表去查,直接从索引列就能取到想要的结果。换句话说,你SQL用到的索引列数据,覆盖了查询结果的列,就算上覆盖索引了。” 我们给city,name,age 组成一个联合索引,即可用到了覆盖索引,这时候SQL执行时,连回表操作都可以省去啦。 调整参数优化 我们还可以通过调整参数,去优化order by的执行。比如可以调整sort_buffer_size的值。因为sort_buffer值太小,数据量大的话,会借助磁盘临时文件排序。如果MySQL服务器配置高的话,可以使用稍微调整大点。 我们还可以调整max_length_for_sort_data的值,这个值太小的话,order by会走rowid排序,会回表,降低查询性能。所以max_length_for_sort_data可以适当大一点。 当然,很多时候,这些MySQL参数值,我们直接采用默认值就可以了。 使用order by 的一些注意点:没有where条件,order by字段需要加索引吗 日常开发过程中,我们可能会遇到没有where条件的order by,那么,这时候order by后面的字段是否需要加索引呢。如有这么一个SQL,create_time是否需要加索引: 无条件查询的话,即使create_time上有索引,也不会使用到。因为MySQL优化器认为走普通二级索引,再去回表成本比全表扫描排序更高。所以选择走全表扫描,然后根据全字段排序或者rowid排序来进行。 如果查询SQL修改一下: 分页limit过大时,会导致大量排序怎么办? 假设SQL如下: 索引存储顺序与order by不一致,如何优化? 假设有联合索引 idx_age_name, 我们需求修改为这样:查询前10个员工的姓名、年龄,并且按照年龄小到大排序,如果年龄相同,则按姓名降序排。对应的 SQL 语句就可以这么写: 我们看下执行计划,发现使用到Using filesort 这是因为,idx_age_name索引树中,age从小到大排序,如果age相同,再按name从小到大排序。而order by 中,是按age从小到大排序,如果age相同,再按name从大到小排序。也就是说,索引存储顺序与order by不一致。 我们怎么优化呢?如果MySQL是8.0版本,支持Descending Indexes,可以这样修改索引: 使用了in条件多个属性时,SQL执行是否有排序过程 如果我们有联合索引idx_city_name,执行这个SQL的话,是不会走排序过程的,如下: 但是,如果使用in条件,并且有多个条件时,就会有排序过程。 这是因为:in有两个条件,在满足深圳时,age是排好序的,但是把满足上海的age也加进来,就不能保证满足所有的age都是排好序的。因此需要Using filesort。
2023-07-08 12:29:461

order by默认是升序还是降序?

orderby默认是升序。orderby关键字用于对结果集进行排序,但是orderby关键字默认按照升序对记录进行排序,如果需要按照降序对记录进行排序,需用DESC关键字。orderby的语法SELECTcolumn1,column2FROMtable_nameORDERBYcolumn1,column2ASC|DESC。ORDERBYcolumn1,column2ASC先对column1进行升序排序,在column1相同时再按照column2升序排列,ASC可省略不写,因为ORDERBY默认就是按照升序对记录进行排序。ORDERBYcolumn1,column2DESC先对column1进行降序排序,在column1相同时再按照column2降序排列,DESC不可省略。
2023-07-08 12:29:531

Mysql中ORDER BY 排序怎么使用?指定顺序和多字段排列

ORDER BY 默认按升序排列,因此 ASC (升序)子句是可选的。 另外,还可以按降序排列,为此可以使用 DESC(降序)。 ORDER BY 子句中还可以用数字来表示对应的列 3 对应于 SELECT 中指定的第 3 列,即工资。 按从左到右的顺序依次根据 ORDER BY 子句中指定的列进行排序。 指定用于排序的列时,如果使用的是 SELECT 子句中列的数字位置,那么指定的数字不能超过 SELECT 子句中指定的列数。( 不能超出索引 ) 通常,可以按 SELECT 子句中未指定的列进行排序,但必须指定列名。然而,如果在查询中使用了GROUP BY 或 DISTINCT 子句,就不能按SELECT 子句中未指定的列进行排序。 要求:显示部门编号为 10 的员工的姓名、职位和薪水,并根据薪水按从低到高的顺序排列想获得上面这样的数据结果 如果想对表中多个字段进行不同的排列如工资表按照升序排列,年龄按照降序排列 可以再ORDER之后用逗号隔开不同排列的字段
2023-07-08 12:30:061

order by 和 group by 的区别

在计算机中:order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。作为英语:order by 排序;排序依据;分组排序例句:1.An index will be used for both an ascending and a descending ORDER BY,whether the index was ascending or descending.不管索引是升序排列还是降序排列,在执行升序或降序ORDERBY操作时都会使用索引。2.Analytic functions are the last set of operations performed in a query except for the final ORDER BY clause.除了ORDERBY(按…排序)语句外,分析函数是一条查询被执行的操作。group by分组;将表按行分组;分组依据例句:1.The List To Group projection can only be used for lists, and it turns the list into agroup by retaining only the first item of the list.ListToGroup映射仅可用于列表,它通过仅保留列表的第一个项目将列表转化成一个组。2.Indicates that the data column is being used to create a grouped result set (ispart of a GROUP BY clause) in an aggregate query.表示数据列用于在聚合查询中创建分组的结果集(GROUPBY子句的一部分)。
2023-07-08 12:30:151

sql中order by和group by的区别

一、适用范围不同:order by 用于排序,一般与asc升序或desc降序一起使用。例如select * from 表A order by 列a。group by 用于分类汇总,一般与聚合函数(比如avg平均、sum合计、max最大、min最小、count计算行)一起使用。例如select 月份,sum(工资)as 总工资 from 工资表 group by 月份。二、定义不同:order by主要侧重许多数据的排序,例如按照大小顺序对数据进行排列,group by主要侧重许多数据的分组,例如按照性别、年龄、国家、学科等进行分组。三、主要用途不同:order by 是按表中某字段排列表中数据。group by 是按某些字段分类。例如,按年龄排序表中的记录就是select * from users order by age。按年龄分类表中数据就是sselect age,count(*) as number1 from users group by age。扩展资料order byORDER BY 语句用于根据指定的列asdf对结果集进行排序。ORDER BY 语句默认按照升序对记录进行排序。order by放在from table_name后面。如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。group byGroupBy语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。参考资料来源:百度百科:order by参考资料来源:百度百科:GROUP BY
2023-07-08 12:30:234

sql里的排序倒序的命令是order by什么

order by desc
2023-07-08 12:33:243

SQL里面的order by语句是干什么用的?

排序order by 字段 这样是降排序order by 字段 desc 这样是降排序
2023-07-08 12:33:492

sql 排序,order by 按时间

order by (CAST(LEFT(字段名,CHARINDEX(":",字段名)-1) AS INT)) 别忘了评为最佳,谢谢
2023-07-08 12:33:573

若sql语句中order by指定了多个字段,则怎么排序?

依次按自左至右的字段顺序排序
2023-07-08 12:34:042

数据库使用order by排序乱序的问题

数据分页时需要根据数据记录创建时间create_time字段倒序,即使用order by create_time desc,但是我们会发现,前端进行请求时获取的数据并不正确,分页中出现了一定的重复数据。 由于大量数据是并发创建的,所以create_time字段值是相同的。这里会有一个很有趣的问题,当order by的字段相同的时候 系统对数据的排序可能变得随机,即一会儿这条数据在前面,一会儿这条数据在后面了 ,所以当翻页的时候我们很容易便看到了重复的数据。 查阅了Goole和相关资料,大概总结了这种情况的原因。其实发生这种现象是“故意”设计的。 u2003u2003如果没有指定ORDER BY语句,则SQL Server(或任何RDBMS)不保证以特定顺序返回结果。 有些人认为,如果没有指定order by子句,行总是以聚簇索引顺序或物理磁盘顺序返回。 然而,这是不正确的,因为在查询处理期间可以改变行顺序的许多因素,例如并行的HASH连接是更改行顺序的操作符的一个很好的例子。 u2003u2003如果指定ORDER BY语句,SQL Server将对行进行排序,并按请求的顺序返回。 但是,如果该顺序不是确定性的,即可能有重复的值,则在每个具有相同值的组中,由于与上述相同的原因,该顺序是“随机的”。 u2003u2003确保确定性顺序的唯一方法是在ORDER BY子句中包含保证的唯一列或列组(例如主键)。
2023-07-08 12:34:161

order by 和 group by 的区别

order by 和 group by 的区别:1,order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。2,group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。注意:聚合函数是---sum()、count()、avg()等都是“聚合函数”3,在sql命令格式使用的先后顺序上,group by 先于 order by。在Sql中也可以说order by是按字段排序,group by 是按字段分类通常order by 和group by 没有太多的关系,但是它们常常组合在一起用,完成分组加排序的功能。
2023-07-08 12:34:231

ORDER BY的作用,要详细点哦

建议学点基础知识,看些SQL基础!
2023-07-08 12:34:333

sql语句中的order by

orderby这个指令来达到我们的目的。orderby的语法如下:select"栏位名"from"表格名"[where"条件"]orderby"栏位名"[asc,desc][]代表where是一定需要的。不过,如果where子句存在的话,它是在orderby子句之前。asc代表结果会以由小往大的顺序列出,而desc代表结果会以由大往小的顺序列出。如果两者皆没有被写出的话,那我们就会用asc。我们可以照好几个不同的栏位来排顺序。在这个情况下,orderby子句的语法如下(假设有两个栏位):orderby"栏位一"[asc,desc],"栏位二"[asc,desc]若我们对这两个栏位都选择由小往大的话,那这个子句就会造成结果是依据"栏位一"由小往大排。若有好几笔资料"栏位一"的值相等,那这几笔资料就依据"栏位二"由小往大排。
2023-07-08 12:34:401

SQL语句中,ORDER BY是代表分组的意思吗

先进行分组处理。Group By 和 Having, Where ,Order by这些关键字是按照如下顺序进行执行的:Where, Group By, Having, Order by。首先where将最原始记录中不满足条件的记录删除(所以应该在where语句中尽量的将不符合条件的记录筛选掉,这样可以减少分组的次数)然后通过Group By关键字后面指定的分组条件将筛选得到的视图进行分组接着系统根据Having关键字后面指定的筛选条件,将分组视图后不满足条件的记录筛选掉最后按照Order By语句对视图进行排序,这样最终的结果就产生了。在这四个关键字中,只有在Order By语句中才可以使用最终视图的列名,如:SELECT FruitName, ProductPlace, Price, ID AS IDE, DiscountFROM T_TEST_FRUITINFOWHERE (ProductPlace = N"china")ORDER BY IDE这里只有在ORDER BY语句中才可以使用IDE,其他条件语句中如果需要引用列名则只能使用ID,而不能使用IDE。
2023-07-08 12:34:491

用SQL语句中的ORDER BY如何排序两个字段

ORDER BY 字段1,字段2
2023-07-08 12:35:102

sql order by 日期 排序问题

SQL会根据日期进行排序,如果日期时间完全一样的话,那么记录再同一个时间顺序内就是随机排序的。
2023-07-08 12:35:196

oracle sql语句中 先执行where还是order by

order by 最后执行
2023-07-08 12:35:334

SQL语句Order by两个条件怎么写?

order by * desc, * acs ;*为条件,条件的优先级和条件的先后顺序一致
2023-07-08 12:35:412

ORDER BY的使用

请问你的数据库是什么sql还是oracle还是其他 我只知道oracle的用法,也许你可以参考 select to_char(FORMATDATETIME,"yyyymmdd"),sum(金额) as charge FROM 表1 where 1=1 group by to_char(FORMATDATETIME,"yyyymmdd") order by charge desc;
2023-07-08 12:35:542

sql 排序,order by 按时间

sql排序是指定时间字段才能按照时间排序,asc默认升序,desc默认降序。ORDERBY语句ORDERBY语句用于根据指定的列对结果集进行排序。ORDERBY语句默认按照升序对记录进行排序。如果您希望按照降序对记录进行排序,可以使用DESC关键字。比如要排序:selectdatefromtablenameorderbydatedesc按date降序排列。
2023-07-08 12:36:031

在数据库中order by 和 group by 的区别

order by是排序,group by是分组,
2023-07-08 12:36:232

sql里 where和order by一起使用是怎样的顺序

还是把条件1 条件2都执行了才top1的啊
2023-07-08 12:36:316

sql语句 order by @ID order by 后面的跟参数该怎么写

"…… order by "+@ID +" desc"这样
2023-07-08 12:36:464

SQL如何使用order by语句查询数据表的多字段

order by是排序 group by 是分组select * from tab group by name,number
2023-07-08 12:37:322

Mysql orderby把指定的数据行排在前面

如果只是一条数据行,可以这样: 主要是“user_id<>7”,就会把用户id为7的排在前面。 如果是多条数据行:
2023-07-08 12:37:481

一楼说的很好,但是感觉写的语句和楼主的要求还不一样。我这样改,您看是否正确。SELECT*FROM(SELECTTOP10*FROMFIRST_CHAPTERORDERBYNEWID()UNIONSELECTTOP10*FROMSECOND_CHAPTERORDERBYNEWID()UNIONSELECTTOP10*FROMTHIRD_CHAPTERORDERBYNEWID())ORDERBYNEWID()
2023-07-08 12:37:551

order_by 排序怎么使用?

不好意思,刚才没有说清楚,刚才想问的$this->db->order_by("modified","desc");是放在$query=$this->db->get("items",50);前还是后,现在已经知道了,谢谢!$this->db->select("*");$this->db->order_by("modified","desc");$query=$this->db->get("items",50);另外,如何我想着页面上显示动态排序(跟点击倒序就显示倒序,点击正序就显示正序该怎么做)
2023-07-08 12:38:021

order by和sort by 区别

造句可以看到区别:The list is “in the order by”numbers. 等同The list is “sorted by ”numbers.
2023-07-08 12:38:092

ThinkPHP order by 两个条件

  ORDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL  语句的最后。  ORDER子句中定义了多个字段,则按照字段的先后顺序排序:  select * from tablename order by column1 desc, column2 asc,  column3 desc; 在column2中有"AAA","BBB"两种值。让AAA在前,BBB在后排序的情况:  方法一 select * from tablename order by column1 desc,  case column2 when "AAA" then 0 when "BBB" then 1 end ,column3 desc;  方法二 select * from tablename order by column1 desc,  CHARINDEX(column2,"AAA,BBB") , column3 desc
2023-07-08 12:38:181

vb里取order by 怎么写

这个不是VB的语句,是SQL语句,一般的格式:Select * From 数据表名 Where 子句 Order By 字段名1 ASC , 字段名2 DESC上述例子是按照 字段名1 顺序排序,当字段名1的值相同时 按照 字段名2 逆序排序。
2023-07-08 12:38:321

dictionary 的 orderby 怎么用?

Dictionary<string, string> dic1 = new Dictionary<string, string>(); dic1.Add("ddd","123"); dic1.Add("aaa", "123"); dic1.Add("ccc", "123"); dic1.Add("fff", "123"); dic1.Add("eee", "123"); dic1.Add("bbb", "123"); Dictionary<string, string> dic1Asc = dic1.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value); Dictionary<string, string> dic1desc = dic1.OrderByDescending(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
2023-07-08 12:38:402

对order by的理解

前言 日常开发中,我们经常会使用到order by,亲爱的小伙伴,你是否知道order by 的工作原理呢?order by的优化思路是怎样的呢?使用order by有哪些注意的问题呢?本文将跟大家一起来学习,攻克order by~ 一个使用order by 的简单例子 假设用一张员工表,表结构如下: 表数据如下: 我们现在有这么一个需求:查询前10个,来自深圳员工的姓名、年龄、城市,并且按照年龄小到大排序。对应的 SQL 语句就可以这么写: 这条语句的逻辑很清楚,但是它的底层执行流程是怎样的呢? order by 工作原理 explain 执行计划 我们先用Explain关键字查看一下执行计划 我们可以发现,这条SQL使用到了索引,并且也用到排序。那么它是怎么排序的呢? 全字段排序 MySQL 会给每个查询线程分配一块小内存,用于排序的,称为 sort_buffer。什么时候把字段放进去排序呢,其实是通过idx_city索引找到对应的数据,才把数据放进去啦。 我们回顾下索引是怎么找到匹配的数据的,现在先把索引树画出来吧,idx_city索引树如下: idx_city索引树,叶子节点存储的是主键id。还有一棵id主键聚族索引树,我们再画出聚族索引树图吧: 我们的查询语句是怎么找到匹配数据的呢?先通过idx_city索引树,找到对应的主键id,然后再通过拿到的主键id,搜索id主键索引树,找到对应的行数据。 加上order by之后,整体的执行流程就是: 执行示意图如下: 将查询所需的字段全部读取到sort_buffer中,就是全字段排序。这里面,有些小伙伴可能会有个疑问,把查询的所有字段都放到sort_buffer,而sort_buffer是一块内存来的,如果数据量太大,sort_buffer放不下怎么办呢? 磁盘临时文件辅助排序 实际上,sort_buffer的大小是由一个参数控制的:sort_buffer_size。如果要排序的数据小于sort_buffer_size,排序在sort_buffer 内存中完成,如果要排序的数据大于sort_buffer_size,则借助磁盘文件来进行排序 如何确定是否使用了磁盘文件来进行排序呢?可以使用以下这几个 命令 可以从 number_of_tmp_files 中看出,是否使用了临时文件。 number_of_tmp_files 表示使用来排序的磁盘临时文件数。如果number_of_tmp_files>0,则表示使用了磁盘文件来进行排序。 使用了磁盘临时文件,整个排序过程又是怎样的呢? TPS: 借助磁盘临时小文件排序,实际上使用的是归并排序算法。 小伙伴们可能会有个疑问,既然sort_buffer放不下,就需要用到临时磁盘文件,这会影响排序效率。那为什么还要把排序不相关的字段(name,city)放到sort_buffer中呢?只放排序相关的age字段,它不香吗?可以了解下rowid 排序。 rowid 排序 rowid 排序就是,只把查询SQL需要用于排序的字段和主键id,放到sort_buffer中。那怎么确定走的是全字段排序还是rowid 排序排序呢? 实际上有个参数控制的。这个参数就是max_length_for_sort_data,它表示MySQL用于排序行数据的长度的一个参数,如果单行的长度超过这个值,MySQL 就认为单行太大,就换rowid 排序。我们可以通过 命令 看下这个参数取值。 max_length_for_sort_data 默认值是1024。因为本文示例中name,age,city长度=64+4+64 =132 < 1024, 所以走的是全字段排序。我们来改下这个参数,改小一点. 使用rowid 排序的话,整个SQL执行流程又是怎样的呢? 执行示意图如下: 对比一下全字段排序的流程,rowid 排序多了一次回表。 什么是回表?拿到主键再回到主键索引查询的过程,就叫做回表” 我们通过optimizer_trace,可以看到是否使用了rowid排序的: 全字段排序与rowid排序对比 一般情况下,对于InnoDB存储引擎,会优先使用全字段排序。可以发现 max_length_for_sort_data 参数设置为1024,这个数比较大的。一般情况下,排序字段不会超过这个值,也就是都会走全字段排序。 order by的一些优化思路 我们如何优化order by语句呢? 联合索引优化 再回顾下示例SQL的查询计划 我们给查询条件city和排序字段age,加个联合索引idx_city_age。再去查看执行计划: 可以发现,加上idx_city_age联合索引,就不需要Using filesort排序了。为什么呢?因为索引本身是有序的,我们可以看下idx_city_age联合索引示意图,如下: 整个SQL执行流程变成酱紫: 流程示意图如下: 从示意图看来,还是有一次回表操作。针对本次示例,有没有更高效的方案呢?有的,可以使用覆盖索引: 覆盖索引:在查询的数据列里面,不需要回表去查,直接从索引列就能取到想要的结果。换句话说,你SQL用到的索引列数据,覆盖了查询结果的列,就算上覆盖索引了。” 我们给city,name,age 组成一个联合索引,即可用到了覆盖索引,这时候SQL执行时,连回表操作都可以省去啦。 调整参数优化 我们还可以通过调整参数,去优化order by的执行。比如可以调整sort_buffer_size的值。因为sort_buffer值太小,数据量大的话,会借助磁盘临时文件排序。如果MySQL服务器配置高的话,可以使用稍微调整大点。 我们还可以调整max_length_for_sort_data的值,这个值太小的话,order by会走rowid排序,会回表,降低查询性能。所以max_length_for_sort_data可以适当大一点。 当然,很多时候,这些MySQL参数值,我们直接采用默认值就可以了。 使用order by 的一些注意点:没有where条件,order by字段需要加索引吗 日常开发过程中,我们可能会遇到没有where条件的order by,那么,这时候order by后面的字段是否需要加索引呢。如有这么一个SQL,create_time是否需要加索引: 无条件查询的话,即使create_time上有索引,也不会使用到。因为MySQL优化器认为走普通二级索引,再去回表成本比全表扫描排序更高。所以选择走全表扫描,然后根据全字段排序或者rowid排序来进行。 如果查询SQL修改一下: 分页limit过大时,会导致大量排序怎么办? 假设SQL如下: 索引存储顺序与order by不一致,如何优化? 假设有联合索引 idx_age_name, 我们需求修改为这样:查询前10个员工的姓名、年龄,并且按照年龄小到大排序,如果年龄相同,则按姓名降序排。对应的 SQL 语句就可以这么写: 我们看下执行计划,发现使用到Using filesort 这是因为,idx_age_name索引树中,age从小到大排序,如果age相同,再按name从小到大排序。而order by 中,是按age从小到大排序,如果age相同,再按name从大到小排序。也就是说,索引存储顺序与order by不一致。 我们怎么优化呢?如果MySQL是8.0版本,支持Descending Indexes,可以这样修改索引: 使用了in条件多个属性时,SQL执行是否有排序过程 如果我们有联合索引idx_city_name,执行这个SQL的话,是不会走排序过程的,如下: 但是,如果使用in条件,并且有多个条件时,就会有排序过程。 这是因为:in有两个条件,在满足深圳时,age是排好序的,但是把满足上海的age也加进来,就不能保证满足所有的age都是排好序的。因此需要Using filesort。
2023-07-08 12:38:581

SQL中Order By的意义和用法

以下内容参考 w3school 中关于SQL的教学,可以点击蓝字参考原文。 ORDER BY 语句用于 根据指定的列 对 结果集 进行 排序 。 ORDER BY 语句 默认 按照 升序 对记录进行排序。 如果您希望按照 降序 对记录进行排序,可以使用 DESC 关键字。 注:对字符串排序的时候会按 首字符 的 ASCII值 排列,如果首字符相同,则向后看一位。 原始的表 (用在例子中的): Orders 表: 实例 1 以字母顺序显示公司名称: SELECT Company, OrderNumber FROM Orders ORDER BY Company 实例2 以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber): SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber 结果: 看此结果和上一结果不同之处在于,Company值相同的行,排序按照OrederNumber的升序排列。 实例 3 以逆字母顺序显示公司名称: SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC 结果: 实例 4 以逆字母顺序显示公司名称,并以数字顺序显示顺序号: SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC 结果: 注意:在以上的结果中有两个相等的公司名称 (W3School)。只有这一次,在第一列中有相同的值时,第二列是以升序排列的。如果第一列中有些值为 nulls 时,情况也是这样的。 问题描述 Mysql排序时如果用的字段为字符型,排序出来时这样的: 1,10,2,20,3,4,5 这种排序是按照字符从第一个字符开始比较出来的,但不是我们想要的,我们想要的是: 1,2,3,4,5……,10,20 解决方案 排序时,把相应的字段转换成整型,使用CAST函数,如下: CAST(seat_row AS UNSIGNED) 将seat_row列转换为UNSIGNED的数值类型。
2023-07-08 12:39:051

orderby是实现什么子句

ORDERBY是最后处理的一个子句。ORDERBY子句用于展示数据时对输出结果中的行进行排序。从逻辑查询处理来看,ORDERBY是最后处理的一个子句。
2023-07-08 12:39:131

SQL里面的order by语句是干什么用的?

order by为排序表达式,用于指定排序的依据,它可以是字段名也可以是字段别名。例--.对成绩表先按课程编号,再按成绩,然后按学号排列select * from 成绩表order by 课程编号,成绩,学号--.查询成绩表中成绩最高的前五条记录,显示与第五条成绩相同的记录select top 5 with ties * from 成绩表order by 成绩 descASC和DESC用于指定排序方式。前者指定字段的值按照升序排列,后者按照降序排列,默认顺序为升序。
2023-07-08 12:39:221

dictionary 的 orderby 怎么用

Dictionary dic1 = new Dictionary();dic1.Add("ddd","123");dic1.Add("aaa", "123");dic1.Add("ccc", "123");dic1.Add("fff", "123");dic1.Add("eee", "123");dic1.Add("bbb", "123");Dictionary dic1Asc = dic1.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value);Dictionary dic1desc = dic1.OrderByDescending(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
2023-07-08 12:39:341

若sql语句中order by指定了多个字段,则怎么排序?

举个例子吧:orderbyiddesc,timedesc先是按id降序排列(优先)如果id字段有些是一样的话再按time降序排列(前提是满足id降序排列)
2023-07-08 12:39:432

sql语句中 order by 排序原则

SELECT top 20 *FROM newsWHERE newsDate =TO_DATE("&Year(Now())&"-"&Month(Now())&"-"&Day(Now())&","YYYY-MM-DD HH:MM:SS")ORDER BY newsID DESC
2023-07-08 12:39:522

如何让SQL按ORDERBY数组顺序排列

1、ORDER BY Field1, Field2, ...2、特殊情况下,可以ORDER BY StrField1 + StrField23、有时候用函数更合适ORDER BY funXX(Field) -- 比如,前面补0变成统一的10位代码
2023-07-08 12:39:591

下列关于ORDER BY子句的说法,正确的有()

下列关于ORDER BY子句的说法,正确的有() A.在SELECT语句中,ORDER BY子句为必选B.ORDER BY默认按照降序排序C.ORDER BY字段DESC是降序排列D.ORDER BY子句放于WHERE子句之前正确答案:ORDER BY字段DESC是降序排列
2023-07-08 12:40:061

若sql语句中order by指定了多个字段,则怎么排序?

举个例子吧:orderbyiddesc,timedesc先是按id降序排列(优先)如果id字段有些是一样的话再按time降序排列(前提是满足id降序排列)
2023-07-08 12:40:151

SQL语句中,如果有group by 和order by两个语句,是先分组还是先排序?

按姓名排序:select 姓名,SUM(销售额) as 销售 from 销售表 order by 姓名 group by 姓名按销售排序:select 姓名,SUM(销售额) as 销售 from 销售表 group by 姓名 order by SUM(销售额) desc
2023-07-08 12:40:505

SQL注入时,使用order by x命令,其中X表示什么意思?

order by 关键字用于对结果集进行排序x有两个值可选 desc, ascdesc:降序 asc:升序 可以省略,是数据库默认的排序方式
2023-07-08 12:41:071

一个Sql语句里能有两个排序(两个Order By)吗?

flyingFish211 说的不错。
2023-07-08 12:41:153

order by 1,2这个是什么意思,该如何解决

对要查询的字段中的第二个字段排序(默认升序)。select a,bfrom table order by 2 ;相当于:select a,bfrom table order by b ;
2023-07-08 12:41:221

SQL语句中,如果有group by 和order by两个语句,是先分组还是先排序?

SQL语句中,如果有group by 和order by两个语句,是先分组还是先排序? 先进行分组处理。 Group By 和 Having, Where ,Order by这些关键字是按照如下顺序进行执行的:Where, Group By, Having, Order by。 首先where将最原始记录中不满足条件的记录删除(所以应该在where语句中尽量的将不符合条件的记录筛选掉,这样可以减少分组的次数) 然后通过Group By关键字后面指定的分组条件将筛选得到的检视进行分组 接着系统根据Having关键字后面指定的筛选条件,将分组检视后不满足条件的记录筛选掉 最后按照Order By语句对检视进行排序,这样最终的结果就产生了。 在这四个关键字中,只有在Order By语句中才可以使用最终检视的列名,如: SELECT FruitName, ProductPlace, Price, ID AS IDE, Discount FROM T_TEST_FRUITINFO WHERE (ProductPlace = N"china") ORDER BY IDE 这里只有在ORDER BY语句中才可以使用IDE,其他条件语句中如果需要引用列名则只能使用ID,而不能使用IDE。 SQL语句中,有group by 和order by两个语句,是先分组还是先排序? 肯定是group by先 order by优先顺序最低,在最后 group by 语句执行后记录会按关键字自动升序? 不一定,group by只负责分组。 VF 中先排序order by还是先分组 group by 这是需要看题上的要求,要求要分组才分组,要求要排序才排序的,并不是每道题两个都同时需要 sql语句中 order by 排序原则 ORDER BY这个指令来达到我们的目的。 ORDER BY 的语法如下: SELECT "栏位名" FROM "表格名" [WHERE "条件"] ORDER BY "栏位名" [ASC, DESC] [] 代表 WHERE 是一定需要的。不过,如果 WHERE 子句存在的话,它是在 ORDER BY 子句之前。 ASC 代表结果会以由小往大的顺序列出,而 DESC 代表结果会以由大往小的顺序列出。如果两者皆没有被写出的话,那我们就会用 ASC。 我们可以照好几个不同的栏位来排顺序。在这个情况下, ORDER BY 子句的语法如下(假设有两个栏位): ORDER BY "栏位一" [ASC, DESC], "栏位二" [ASC, DESC] 若我们对这两个栏位都选择由小往大的话,那这个子句就会造成结果是依据 "栏位一" 由小往大排。若有好几笔资料 "栏位一" 的值相等,那这几笔资料就依据 "栏位二" 由小往大排。 select-sql 语句中,筛选用(?)子句,分组用group by 子句,排序用order by 子句 筛选用 where 子句 比如 select * from sutdent where 年龄=20 这就是根据年龄这个条件进行筛选 oracle sql语句中 先执行where还是order by where 里面条件 and 是先执行 and 前面 还是后面条件这个其实和你写的顺序不大,这个先后顺序,是资料库来根据表/索引的资讯来决定的。例如一个 学生表, 有学号,姓名,性别其中 学号是主键, 姓名上面有个索引。 找 名字叫 强妹 的女生: SELECT * FROM 学生 WHERE 姓名="强妹" AND 性别 = "女" 与 SELECT * FROM 学生 WHERE 性别 = "女" AND 姓名="强妹" 资料库在处理 SQL 以前,都会去分析, 发现 查询的条件中, 姓名上面有索引,而性别上面没有。 那么优先根据 姓名的条件, 去检索,然后再去把通过索引得到的资料,去筛选 性别=女的比如表里面共有10000行。姓名叫 "强妹" 的只有一个。那么通过索引,一步就定位到那一行。然后再判断这一行资料的 性别栏位, 是不是 = "女" 假如 姓名/性别 都没有索引呢?那就是执行 全表扫描。不分先后。什么意思呢?就是假如 表里面10000行资料。那就是从第一行开始, 检视 姓名与性别 条件。 满足的返回。 不满足的丢弃。 直到100行都处理完。并不是一口气把所有的资料,都放到记忆体里面,然后 姓名判断一次, 去掉部分, 性别判断一次,再去掉部分。 蓝屏 sql语句中的where语句和order by语句,哪个语句先执行 ④SELECT [DISTINCT] * | 列 [别名],列 [别名],…… ①FROM 表名称 [别名],表名称 [别名],…… ②[WHERE 限定条件] ③[GROUP BY 分组栏位,[分组栏位,分组栏位……]] ⑤[ORDER BY 排序列名 [ASC|DESC],排序列名 [ASC|DESC],……] where先执行:SQL语句执行顺序:SELECTFROM--1WHERE--2GROUPBY--3HAVING--4ORDERBY--5 where先执行,然后对筛出来的结果再排序。 如果不先按where查出来的结果再排序,那先排序出来的结果有什么意义呢。
2023-07-08 12:41:301

ACCESS 的 ORDER BY 问题

order by 为指定查询结果的顺序
2023-07-08 12:41:394