DQL 之聚合函数、分组查询及 Limit 方言|学习笔记

简介: 快速学习 DQL 之聚合函数、分组查询及 Limit 方言

开发者学堂课程【数据处理:DQL 之聚合函数、分组查询及 Limit 方言】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/64/detail/1154


DQL 之聚合函数、分组查询及 Limit 方言


内容介绍:

一.聚合函数

二.分组查询

三.Limit 子句(方言)


前面讲解的查询都是横向查询,没有纵向查询。下面所讲的聚合函数是纵向查询。例如问该公司有多少人,需要查询出15这个结果;所有员工工资为多少,需要把 sal 列数值全部加起来;而统计该公司人数需要查找 emdno 列数据个数。最高工作为多少,最低工资为多少;这些都是纵向排序。


一.聚合函数

1.count()函数。

执行 select count(*)from emp;查询结果显示15,即查询所有列中没有完全为 NULL 参加计算。

image.png

select count(empno)from emp;把参数改为 empno,执行结果同样为15。需要查找 empno 列中是否含有 NULL 值,没有 NULL 累加,如果有 NULL 则不计数。执行 select count(comm)from emp;comm 列中值不为 null 的有5个,所有查询结果为5。如果参数为*,则表示一行数据全部为 null 就不计数,只要有一个不为 null 就计数。查询该公司人数即查询表中有效行数。

image.png

执行select count(1)from emp;结果为15;

执行select count(2)from emp;结果为15;

执行select count(200)from emp;结果为15。

其实数字与*的效果完全相同,没有特殊意义。怕在做题时碰到 select count(1)from emp;说是语法错误,在平时不使用1,2等作为参数。

image.png

2.Sum()函数

刚才学习 count 函数,那么 sun 函数作用是求和。Select sum(sal) from emp;执行结果是计算 sal 列中数值的和。Select sum(comm) from emp;执行结果是计算 comm 列中数值的和。

image.png

执行 Select sum(ename) from emp;执行结果是0;把人名当作0进行运算。

3.max 函数

还是 sal 列,执行 select max(sal) from emp;执行结果查询出 sal 列中最大值 80000

image.png

4.min 函数

执行select min(sal) from emp;执行结果查询出 sal 列中最小值 8000(甘宁的工资,入职最早工资最低)

5. avg 函数

执行 select avg(sal) from emp;执行结果查询出 sal 列的平均值24683.33333。结果可以自行验算。

image.png

共学习了五个函数,count()函数:用来计算有效行数;sum()函数:用来求和;max()函数:求一列中的最大值;min()函数:求一列中的最小值;avg()函数:求平均值。

如果一次把有效值,求和结果,最大值,最小值,平均值全部查询出来:select count(*)人数,sum(sal)总和,max(sal)最高工资,min(sal)最低工资,avg(sal)平均工资 from emp;注意逗号,空格千万不要带输入法。

image.png

查询功能到目前为止,已经感觉非常强大。Excel 与它差远了,后期 sql 语句可以编写函数,编写 if 语句,for 循环,还有其他函数。Excel 不能与之相比较,sql 语句是一种语言结构。


二.分组查询

首先举例列出需求:比如全班站排,站两排男生一排女生一排,这既是分组。分为两组使用性别进行分组。还可以使用祖籍所在省份分组(山东一组,山西一组等等),或者带眼镜的站一排不戴眼镜的站一排;这些都叫分组。

例如表emp,如果按员工编号分组则并无实际意义,因为员工编号每个人都不同,分组需要有相同的地方。如果按工作分组,文员一组,销售员一组;一般分组后还要相应查询组信息。按工种分完组后,如果问某某人属于什么工种,这是组信息。问他们几个是什么工种,他们答:文员;则知道为这组信息。这是组信息。如果问销售员有多少人?经理有几个人?这些询问的都是组信息,经理中那个工资最高,这询问的是组最高工资,与个人无关;此组的平均工资为多少?这些都是询问组信息。你叫什么名字?这是询问个人信息。

记住:分组查询不能查询个人信息,必须查询组信息。组信息查询一般使用聚合函数,如刚刚的问题:某个组有多少人?某个组平均工资是多少?某个组最高工资是多少?查询组信息需要使用聚合函数。

现在使用 job 分组,并且查询每一组的人数,以及该组的工作名称。这些语句 select job count(*) from emp;则查询结果:表中数据并未按工作分组。应使用关键字 group by: select job count(*) from emp group by job; 查询结果:保洁员一人,分析师两人(诸葛亮和庞统),文员四人,经理三人(刘备,关羽,张飞),董事长一人(增阿牛),销售员四人。这即是分组查询,group by 后写分组列的列名,查询的列只能写 group by 后的列名,其余的必须使用聚合函数。如果在查询时多一列:ename,不符合逻辑,如果做某一工作有多个人那么显示谁的名字?无法显示,ename 不是组信息;组信息只有分组列,聚合函数

image.png

select job, count(*),max(sal) from emp group by job; 可以另外查询当前组的最大工资。做保洁工作的最高工资80000,董事长最高工资50000,分析师最高工资30000,文员中最高工资13000,经理中刘备工资最高:29750,销售员中黛绮丝工资最高:16000.

分组查询关键字为 group by,group by 后艮分组列。除了分组列可以查询,其他全部为聚合函数,查询的必须是组信息。

image.png

对 stu 表,可以使用性别分组:select gander,count(*) from stu group by gander;查询结果男生35,女生20

image.png

可以按籍贯分组:select province,count(*) from emp group by province;查询结果北京30人,取余省份都是五人(山东,山西,广州,湖北,辽宁)

image.png

对 emp 表使用部门分组,查询前做操作:去除工资低于15000然后再用部门分组。条件是在分组前列出,应使用 where 语句。Select deptno ,count(*)from emp group by deptno;查询结果 10部门3人,20部门五人,30部门六人,50部门一人.此时没有把工资低于15000人员去除,需要在语句中先添加where条件:Select deptno ,count(*)from emp  where  sal>15000  group by deptno;查询结果10部门两人,20部门三人,30部门两人,50部门一人。10部门中有张飞,增阿牛,黄盖其中黄盖工资不大于15000,所有未统计。20部门有甘宁,刘备,诸葛亮,周泰,庞统其中甘宁,周泰工资不大于15000。

image.png

查询部门中工资大于15000的员工数大于两人的部门,现在存在分组前的条件和分组后的条件,需要在分组后使用关键字 having。Select deptno ,count(*)from emp group by deptno having count(*)>2;

查询结果:把50部门去除。分组前条件去除的数据没有参加分组,分组后的条件使用聚合函数作为条件。

image.png

目前学习的关键字:select,from,where,group by,having,order by。若编写语句时需要使用所有关键字,则可以按上面所写顺序编写语句,语句执行顺序也是select,from,where,group by,having,order by;首先去除分组前的数据,然后进行分组,再去除分组后的数据,最后排序。目前已经学习分组前条件,分组后条件等等,已经感受到查询功能的强大。关键字需要记忆。


三.Limit子句(方言)

只有 MySQL 中有 limit 子句,其他程序中没有。如果想要实现 limit 子句的效果,想要编写多表查询,而编写多表查询语句非常麻烦,limit 子句只在 MySQL 范围内。limit 子句可以指定范围查询,select* from emp 查询所有行,select* from emp limit 0,5:从第1行开始查询,即从下标0开始查找五行记录,可以查询五行记录。

image.png

select* from emp limit 8,5:从下标为8即从第九行查询五行数据

image.png

select* from emp limit 12,5:从下标为12即从第十三行查询五行数据,但表中一共十五行记录所有只能查询3行记录。

image.png

这一概念将来会再分页查询中用到,分页使用简单但编写不简单。在浏览器中搜索 hello,网页最下面即是分页。百度与 hello 相关的数据大约有100000000条,但是不能全部显示在一个页面中,从服务器中把数据全部运输到客户端上,客户端同样承受不了。现在一次显示一页,想要查看下一页再显示第二页,想要查看再显示第三页的内容,一次查询一页这是分页查询。

给出条件:第一个条件:一页记录数为10行,第二个条件:查询第三页。可以使用语句 select* from emp limit 20,10;(第一页显示内容从0-9,第二页显示内容从10-19,则第三页从20行开始,计算方法:当前页减一乘以每一页记录数即查询第三页(3-1)*10=20.)如果每一页8行记录,查询第17页内容:这时应当使用公式计算,select* from emp limit(17-1)*8,8;.使用 limit 子句可以进行分页查询,而Oracle 想要实现分页,每一页还需要使用子查询,需要使用 top 关键字,难度加大。

相关文章
|
小程序 JavaScript
最新微信小程序反编译工具,完美解决分包问题
看了很多反编译、找回微信小程序源码很多教程,各种问题导致都没法正常使用。微信版本升级后,会遇到各种报错, 以及无法获取到wxss分包无法反编译的问题。于是寻找资料,也买过别人的破解工具,最终解决文件缺失和分包问题,而且无意中发现还能获取小游戏的源码,于是和大家分享下。
最新微信小程序反编译工具,完美解决分包问题
|
3月前
|
存储 前端开发 关系型数据库
终于有人把数据仓库讲明白了
数据仓库不是大号数据库,更不是BI附属品。它通过整合多源数据、统一标准,让数据更易查、易用,真正服务于业务分析与决策。本文带你厘清数据仓库的本质、架构与搭建步骤,避开常见误区,实现数据价值最大化。
终于有人把数据仓库讲明白了
|
Go
golang run时报undefined错误【已解决】
golang run时报undefined错误【已解决】
3905 0
golang run时报undefined错误【已解决】
|
Ubuntu Linux 网络安全
Linux Debian11服务器安装SSH,创建新用户并允许远程SSH远程登录,并禁止root用户远程SSH登录
本文介绍了Linux Debian11服务器安装SSH,创建新用户并允许远程SSH远程登录,并禁止root用户远程SSH登录。
3703 1
Linux Debian11服务器安装SSH,创建新用户并允许远程SSH远程登录,并禁止root用户远程SSH登录
|
存储 缓存 关系型数据库
都说InnoDB好,那还要不要使用Memory引擎?
【11月更文挑战第16天】本文介绍了 MySQL 中 InnoDB 和 Memory 两种存储引擎的特点及适用场景。InnoDB 支持事务、外键约束,数据持久性强,适合 OLTP 场景;而 Memory 引擎数据存储于内存,读写速度快但易失,适用于临时数据或缓存。选择时需考虑性能、数据持久性、一致性和完整性需求以及应用场景的临时性和可恢复性。
311 6
|
9月前
|
人工智能 自然语言处理 数据挖掘
2025国内有哪些呼叫中心系统值得推荐?
在数字化浪潮推动下,呼叫中心系统已成为企业客户服务的核心枢纽。通过全面智能化、多渠道融合、大数据与AI驱动的决策支持及云化与安全性等技术优势,呼叫中心系统实现了降本增效和客户体验提升。2025年,随着人工智能和云计算的深度渗透,呼叫中心将迎来新一轮升级。推荐几款高效系统:合力亿捷、中国移动、华为云、阿里云和百度语音解决方案,涵盖电商、金融、政府等多个领域,助力企业优化服务流程,提升竞争力。
714 13
|
存储 监控 算法
|
关系型数据库 MySQL
mysql查看当前实时连接数最大连接数
mysql查看当前实时连接数最大连接数
2010 0
|
存储 Linux 数据库
运维系列.在Docker中使用Grafana(二)
运维系列.在Docker中使用Grafana(二)
641 4
阿里云地域节点测试IP(国内+海外)Ping值延迟测试
阿里云地域节点遍布全球19个地区节点(国内+海外),共有56个可用区,哪个快网分享阿里云国内及海外节点测试IP,阿里云节点Ping值延迟测试: 阿里云节点全球无缝覆盖,提供CN2高速网络,BGP接入支持。
40294 0