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 关键字,难度加大。

相关文章
|
2月前
|
关系型数据库 MySQL 数据库
MySQL查询聚合函数与分组查询
MySQL查询聚合函数与分组查询
|
1月前
|
SQL 关系型数据库 MySQL
MySQL数据库——SQL(3)-DQL(基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询、案例练习)
MySQL数据库——SQL(3)-DQL(基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询、案例练习)
29 0
|
2月前
T-sql 高级查询( 5*函数 联接 分组 子查询)
T-sql 高级查询( 5*函数 联接 分组 子查询)
|
10月前
|
关系型数据库 MySQL BI
MySQL数据库操作篇3(聚合函数&分组查询)
MySQL数据库操作篇3(聚合函数&分组查询)
111 0
|
11月前
|
关系型数据库 MySQL 数据管理
MySQL查询语言:从SELECT到多表查询
本文深入探讨了MySQL查询语言的核心要素,涵盖了SELECT语句的详解、WHERE子句与逻辑操作符、ORDER BY子句与排序、聚合函数与GROUP BY子句,以及JOIN操作与多表查询。通过详细介绍每个部分的用法和示例,读者可以轻松掌握在MySQL中进行数据查询和分析的关键技能。了解SELECT语句的构造,以及如何使用WHERE子句和逻辑操作符筛选数据,能够使读者更有效地提取所需信息。此外,通过掌握ORDER BY子句进行排序和使用聚合函数进行数据汇总,读者将能够在查询结果中获得更有价值的信息。最后,本文还介绍了JOIN操作,使读者能够从多个数据表中联合数据,实现更复杂的查询需求
73 0
|
2月前
|
SQL
SQL-条件查询与聚合函数的使用
SQL-条件查询与聚合函数的使用
|
10月前
数据查询语句:包括SELECT语句、WHERE子句、GROUP BY子句、HAVING子句、ORDER BY子句等,用于从数据表中检索数据。
数据查询语句:包括SELECT语句、WHERE子句、GROUP BY子句、HAVING子句、ORDER BY子句等,用于从数据表中检索数据。
33 1
|
11月前
|
SQL 机器学习/深度学习 数据可视化
SQL语法:浅析select之七大子句
SQL语法:浅析select之七大子句
|
SQL Oracle 关系型数据库
oracle数据库分组查询,使用聚合函数
oracle数据库分组查询,使用聚合函数
100 0
基础DQL(数据查询)——聚合函数&分组查询
基础DQL(数据查询)——聚合函数&分组查询
99 0
基础DQL(数据查询)——聚合函数&分组查询