bitsCN.com

数据的排序与分组语句

使用SQL语句执行查询操作时,我们可能发现查询出的数据结果的排序是无序的。为了更好的观察数据表中的查询结果,开发人员或者用户经常要对查询的数据进行排序操作,这就需要使用ORDER BY子句。在数据库的实际应用中,有时需要对查询的数据进行统计和分组操作,这就需要了解SQL语句的聚合函数和GROUP BY子句的使用。有些时候开发人员或者用户还希望对分组后的结果做进一步的统计,在SQL语句中提供了ROLLUP这样一个关键字用来对数据进行统计。最后还将介绍主要数据库中如何限制结果集的行数。

1.使用ORDER BY子句对数据记录进行排序

指定表中的一列进行排序

通过ORDER BY 子句可以对查询结果中指定的列进行升序或者是降序操作,这取决于ORDER BY子句后的关键字,如果ORDER BY子句后面的关键字是ASC,则对查询的结果执行升序操作;如果ORDER BY子句后面的关键字是DESC,则对查询的结果执行降序操作。其语法规则如下

ORDER BY 列名1 [ASC|DESC]

其中列名1表示需要对该列进行排序操作。关键字ASC和DESC是可选的。如果ORDER BY 子句后面不写ASC或者是DESC,则默认执行的是升序操作。

SELECT teaID,teaName,dept,profession,salary

FROM T_teacher

WHERE dept ='计算机系'

ORDER BY salary ASC

指定表中列的位置序号进行排序

排在使用ORDER BY子句进行排序操作时,除了可以使用列名对指定列进行序,也可以使用该列在选择列表中的位置的序号对其进行排序。

SELECT teaID,teaName,dept,profession,salary

FROM T_teacher

ORDER BY 5 ASC

对SELECT语句中的非选择列进行排序

ORDER BY子句中也可以对没有在SELECT语句中出现的选择列进行排序操作。

SELECT teaID,teaName,dept,profession

FROM T_teacher

WHERE dept ='计算机系'

ORDER BY salary

指定表中的多列进行排序

ORDER BY子句除了可以指定单列进行排序操作,也可以指定数据表中的多个列进行排序操作。如果要指定数据表中的多个列进行排序操作,则指定排序的列与列之间需要用逗号隔开。其语法规则如下:

ORDER BY 列名1[ASC|DESC],列名2 [ASC|DESC]

其中列名1和列名2表示需要对指定的数据列进行排序操作。列名1和列名2之间用逗号进行分割。关键字ASC和DESC是可选的。如果ORDER BY 子句后面不写ASC或者DESC,则默认执行的是升序操作。首先,根据ORDER BY中指定的第一列进行排序;然后,再根据ORDER BY子句中指定的第二列的升序或者降序方式进行排序。

SELECT teaID,teaName,dept,profession,salary

FROM T_teacher

ORDER BY salary DESC,dept ASC

2.常用的聚合函数

聚合函数也被称为分组函数或者统计函数,主要用于对得到的一组数据进行统计计算,例如求和、求平均值等,常用的聚合函数包括COUNT、MAX、MIN、SUM和AVG五个。

COUNT、SUM和AVG函数中可以使用DISTINCT关键字去除指定列中的重复项。使用DISTINCT关键字后只是对不同行的值进行统计。

MAX和MIN函数中的列或者表达式可以是数字型、字符型或者是日期类型的值。如果MAX和MIN函数中的列或者表达式是字符型的,则按照首字母从A到Z的顺序排序,如果首字母相同,则比较字符串中第二个字母的大小,以此类推。汉字则是按照其汉语拼音的全拼来排序。

SELECT MAX(salary),MIN(salary)

FROM T_teacher

SUM和AVG函数中的表达式只能是数字类型的值。

除了COUNT(*)之外,其他的几个函数在计算时都忽略表达式中的空值(NULL行)。

COUNT函数是用来计算数据表中的总行数,SUM函数是用来计算数据表中某一列的属性值的总和。

SELECT SUM(salary),COUNT(salary),AVG(salary)

FROM T_teacher

聚合函数只能出现在SELECT语句、GROUP BY子句以及HAVING子句中,WHERE子句中不能出现聚合函数。

3.使用GROUP BY子句对表中数据进行分组

单列分组

使用GROUP BY子句对数据表中的某一列进行分组时,会对指定分组的列中不同的值都计算出一个统计结果。其语法格式如下:

GROUP BY列名1

其中列名1表示需要对该列进行分组操作。

SELECT dept,COUNT(profession)

FROM T_teacher

GROUP BY dept

Select同时包含数据列和聚合函数时,必须使用Group By。

多列分组

使用GROUP BY子句对数据表中的多个列进行分组时,会对指定分组的多个列中不同的值都计算出一个统计结果。其语法格式如下:

GROUP BY列名1,列名2…

其中列名1和列名2表示需要对指定列进行分组操作。列名1和列名2之间用逗号进行分割。

使用HAVING子句子限制分组后的查询结果

如果想要对分组后的结果限制查询条件,就需要使用HAVING子句。由于HAVING子句是用来限制分组后的查询结果,所以该子句需要放到GROUP BY子句的后面使用。其语法格式如下:

GROUP BY列名1 HAVING 条件表达式

其中列名1表示需要对该列进行分组操作。HAVING子句后的条件表达式是用来筛选分组后的结果。在HAVING子句中经常使用聚合函数对分组后的结果进行筛选。

SELECT dept,profession,MAX(salary)

FROM T_teacher

GROUP BY dept,profession

HAVING MAX(salary)>3000

注意:GROUP BY下才有HAVING,HAVING用于组;而WHERE是针对SELECT的(针对于表或者视图),WHERE用于分布前。

SELECT profession,MAX(salary)

FROM T_teacher

WHERE age>30

GROUP BY profession

HAVING MAX(salary)>3000

对分组结果进行排序

很多时候,对数据表中数据进行分组后,还希望对分组的结果进行排序操作。如果想对使用了GROUP BY子句的分组结果进行排序的话,就需要使用ORDER BY子句。

SELECT dept,profession,MAX(salary)

FROM T_teacher

GROUP BY dept

ORDER BY MAX(salary) DESC

按照GROUP BY后分得的各组中的最高工资给组排序;而如下语句则是按照每组的第一行的工资给组排序。

SELECT dept,profession,MAX(salary)

FROM T_teacher

GROUP BY dept

ORDER BY salary DESC

GROUP BY子句中处理NULL值

在使用GROUP BY子句对对指定列进行分组时,有时可能会遇到指定列中含有NULL值的情况。此时,GROUP BY子句会将该列中所有的NULL值归为一组。

如果要得到每个分组中的工资的最大值对应的行(而不是分组的第一行),可以使用子查询等方法,详细以后讨论。

select teaName,salary

from (select * from t_teacher order by salary desc) temp

group by dept

order by salary

4.使用ROLLUP关键字统计数据

在实际应用中,有时不仅需要得到分组后的统计结果,还希望对分组的统计结果做进一步的计算,例如通过对教师信息表(T_teacher)中的院校和教师职称进行分组,得到分组后教师的工资,还希望对每一个院系中的教师的工资做一个阶段性的统计,希望得到各个院校中不同职称的教师的工资的加和(相当于小计),还希望得到所有院校不同职称教师工资的总和(相当于总计)。这个时候仅仅使用GROUP BY子句是无法做到的,此时就需要使用ROLLUP关键字。

ROLLUP关键字使用时需要放到GROUP BY关键字的后面。ROLLUP关键字在不同的数据库中的使用方式上稍有不同。

a.在MySQL和Microsoft SQL Server数据库中需要使用WITH ROLLUP。其语法格式如下:

GROUP BY 列名1 WITH ROLLUP

其中列名1表示要对该列进行分组,WITH ROLLUP关键字表示要对分组的结果进行统计。当然也可以对多个列进行分组,并统计分组后的结果。其语法格式如下:

GROUP BY 列名1 ,列名2 WITH ROLLUP

b.在Oracle数据库中,ROLLUP关键字需要紧跟在GROUP BY关键字的后面,然后再写需要分组的字段。其语法格式如下:

GROUP BY ROLLUP (列名1,列名2…)

5.限制结果集行数

有些时候,开发人员或者用户并不希望将查询结果的数据列中的数据全部显示出来,而是只希望显示其中的几行,尤其是在需要分页的操作中。例如,一个数据表最后查询出了100条记录,而开发人员或者用户只关心其中前10条记录的值,这就需要对查询结果中的数据记录的行数进行限制。在不同的数据库中限制结果集行数的方法也不尽相同。

a.在MySQL数据库中限制结果集行数可以使用LIMIT关键字,它可以用来限制查询出来的数据结果的个数。通过使用LIMIT关键字可以让开发人员或者用户得到其中想要的部分的结果。如果要使用LIMIT限制结果集行数,可以使用下面的语法格式。

LIMIT n

其中LIMIT是关键字,数字n表示要限制结果集行数。

SELECT teaID,teaName,dept,profession

FROM T_teacher

ORDER BY teaID

LIMIT 3

-- 升序排序后的前3条记录

LIMIT 3,3

-- 升序排序后的第4条到第6条记录

b.Oracle数据库中不支持类似于 MySQL 中的 LIMIT关键字来限制结果集行数,但是在 Oracle数据库中可以使用ROWNUM关键字限制结果集的行数。其语法格式如下:

WHERE ROWNUM其中ROWNUM关键字表示对符合条件结果的序列号,它的起始值总是从1开始的。数字n表示要限制的结果集的行数。当然,这里的比较运算符除了可以使用(

c.MySQL数据库和Oracle数据库中使用LIMIT关键字和ROWNUM的方法限制结果集行数,在Microsoft SQL Server数据库中需要使用TOP关键字。其语法格式如下:

SELECT TOP n [PRECENT] 列名1,列名2 …

FROM 表名

其中,TOP是表示限制结果集行数的关键字;数字n表示限制结果集行数;PRECENT关键字表示返回查询的结果集中前n%的行数,它是可选的。bitsCN.com

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

mysql分组排列的查询语句_数据的排序与分组语句_MySQL相关推荐

  1. mysql临时表如何分页查询慢_数据量很大,分页查询很慢,怎么优化?

    作者:悠悠i,来源: http://uee.me/aVSnD 当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分 ...

  2. mysql字段排序语句_数据库字段排序的SQL语句

    简明现代魔法 -> 数据库技术 -> 数据库字段排序的SQL语句 数据库字段排序的SQL语句 2009-09-17 将字段依次写在order by 后面即可 , 中间用逗号隔开. sele ...

  3. mysql分组失效_请教MySql中使用表子查询时,试着先排序后分组,出现排序失效的原因?...

    1,今天试着码了一下教程里的题目,是找出每一个班级的身高最高的学生,用的是先order by降序排序所有学生升高,再用 group by分组每一个班级取第一个值,却发现当使用子查询时,得到的仍旧是未排 ...

  4. mysql临时表如何分页查询慢_面试官扎心一问:数据量很大,分页查询很慢,有什么优化方案?...

    准备工作 一般分页查询 使用子查询优化 使用 id 限定优化 使用临时表优化 关于数据表的id说明 当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明 ...

  5. 将查询出来的数据按照一个字段分组且排序过程中,遇到的一些有关group的问题(分组排序应该使用partition by)

    目录 我想要的效果 Group By Group By 语法 Group By 错误示例 重点提醒 功能实现(partition by 分区函数) 以往查询出来的数据想要按照某一个字段分组展示,直接按 ...

  6. ef 执行mysql语句_在EF中执行SQL语句

    一.为什么要在EF中执行SQL语句 使用EF操作数据库,可以避免写SQL语句,完成使用Linq实现,但为什么还要在EF中执行SQL语句呢.如果要写SQL语句,完全可以使用ADO.NET来操作数据库.这 ...

  7. java分页sql语句_「sql分页」sql语句 实现分页 - seo实验室

    sql分页 sql语句 实现分页 /* 分页思想:比如你要每页获取10条记录,当你显示第5页的记录时, 也就是选取第40条至50条的记录.首先应该从所有的记录集中选取 50条记录,同时进行倒序,再从中 ...

  8. mybatisplus执行sql语句_一条更新的SQL语句是如何执行的?

    提出问题 UPDATE student SET score = score + 1 WHERE uid = 666; 以上就是一条最简单的SQL更新语句,想要知道上面这句SQL语句是怎么执行的先要了解 ...

  9. SQL查询单表数据之排序(二)

    [SQL从一点一滴分析系列文章]为实际开发中的点点滴滴的总结,从最最简单的SQL 查询 到 综合分析查询 在分析 SQL 时,也会同时分析 mybatis .Hibernate 中的相关操作 点击查看 ...

最新文章

  1. python中*的用法
  2. 异常注意事项_子父类异常
  3. hive 元数据 自定义_如何在Hive中创建自定义函数UDF及如何直接通过Impala的同步元数据重用UDF的jar文件-阿里云开发者社区...
  4. pdf是文件还是文档
  5. 基本概念----Beginning Visual C#
  6. Android键盘属性
  7. 图片无损放大软件Topaz Gigapixel AI for Mac
  8. mysql索引数据结构图解_一步一步推导MySQL索引隐秘的底层数据结构
  9. (php毕业设计)基于thinkphp5小区物业管理系统
  10. Filter过滤器实现登录权限拦截
  11. 全手工杂拌面——韩国才有的中华料理 冬至餐桌上的25道家常手工主食
  12. 小柯:人生最不值得你去触碰的30件傻事
  13. [微信聊天]--一个人有多成熟,就看他如何聊微信
  14. php岗位范文,PHP开发工程师岗位个人简历个人技能范文
  15. 数据分析:Day01软件安装及基础
  16. 智慧社区三维可视化决策系统平台(数字孪生)-解决方案开发案例
  17. Zookeeper三台机器集群搭建
  18. BRVAH官方使用指南(持续更新)--BaseRecyclerViewAdapterHelper
  19. 完满(Full)二叉树,完全(Complete)二叉树, 完美(Perfect)二叉树
  20. 微信电话本体验怎么样?

热门文章

  1. java iText 的jar导出pdf格式,禁止浏览器预览,直接下载功能
  2. 计算机替换字体怎么操作,电脑替换文字怎么操作
  3. Win11中,睡眠、休眠、关闭显示器的区别
  4. image generation from scene graphs 论文+code复现总结
  5. SpringBoot整合activeMQ消息队列手动签收(Session.CLIENT_ACKNOWLEDGE)为什么失效啊?
  6. 基于Stm32的WiFi多功能LED
  7. nao机器人行走速度_基于PID控制的NAO机器人循线行走技术研究
  8. 美颜SDK是什么意思?美颜SDK可以用在哪些地方?
  9. 部分大数据平台运维题及答案
  10. Java学习:流程控制