文章目录
前言
上一篇介绍了数据库四种语言,其中,DQL语言在数据库中是最难且考点最多的,面试中的mysql的实战题目也大多出在这里,所以这一篇文章针对select的检索语法详细讲一讲。
一、聚合函数
聚合函数是用来做纵向运算的函数:将一列数据作为一个整体,进行纵向计算
常见的聚合函数有如下几种
函数 | 描述 |
---|---|
COUNT() | 统计指定列不为NULL的记录行数 |
MAX() | 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算 |
MIN() | 计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算 |
SUM() | 计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0 |
AVG() | 计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0 |
语法
SELECT 聚合函数(字段列表) FROM 表名 ;
注意 : NULL值是不参与所有聚合函数运算的。
1) COUNT()
用于统计某个字段的行数。可以统计某个字段的非空值数量,也可以统计表中的总行数。以下几种情况就需要用到count()。
#查询emp表中记录数:
SELECT COUNT(*) AS cnt FROM emp;
#查询emp表中有奖金的人数:
SELECT COUNT(comm) cnt FROM emp;
注意,因为count()函数中给出的是comm列,那么只统计comm列非NULL的行数。
#查询emp表中月薪大于2500的人数:
SELECT COUNT(*) FROM emp WHERE sal > 2500;
#统计月薪与佣金之和大于2500元的人数:
SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;
count()支持多列查询
#查询有佣金的人数,以及有领导的人数:
SELECT COUNT(comm), COUNT(mgr) FROM emp;
2) SUM()和AVG()
SUM:用于计算某个字段的总和。AVG:用于计算某个字段的平均值。
这两个聚合函数一般一起使用,所以放在一起讲述。
#查询所有雇员月薪和:
SELECT SUM(sal) FROM emp;
#查询所有雇员月薪和,以及所有雇员奖金和:
SELECT SUM(sal), SUM(comm) FROM emp;
#查询所有雇员月薪+奖金和:
SELECT SUM(sal+IFNULL(comm,0)) FROM emp;
#这里的IFNULL我在上一篇已经讲过,这里就不再讲了
#统计所有员工平均工资:
SELECT AVG(sal) FROM emp;
3) MAX()和MIN()
MAX:用于找出某个字段的最大值。MIN:用于找出某个字段的最小值。
#查询最高工资和最低工资:
SELECT MAX(sal), MIN(sal) FROM emp;
二、分组查询
MySQL分组函数是一组用于对数据进行统计和处理的函数,当需要分组查询时需要使用GROUP BY子句,例如查询每个部门的工资和,这说明要使用部分来分组。
语法
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组 后过滤条件 ];
#查询每个部门的部门编号和每个部门的工资和:
SELECT deptno, SUM(sal) FROM emp GROUP BY deptno;
#查询每个部门的部门编号以及每个部门的人数:
SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;
#查询每个部门的部门编号以及每个部门工资大于1500的人数:
SELECT deptno,COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;
HAVING子句
在语法中提到了[ HAVING 分组 后过滤条件 ],HAVING子句是在数据库查询中用于过滤结果集的一种方式。它类似于WHERE子句,但可以用于过滤GROUP BY子句分组后的结果。
HAVING子句用于在GROUP BY子句之后对结果集进行过滤。它可以基于聚合函数来过滤结果,如COUNT、SUM、AVG等。只有满足HAVING条件的行才会被返回。
下面来看一个案例讲解一下:
#查询工资总和大于9000的部门编号以及工资和: SELECT deptno, SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal) > 9000;
在这里,having是对group by出来的部门编号进行过滤,只留下部门的总工资大于9000的,
注意一点,having可以用聚合函数,但是where不行。
having和where的不同:
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组
之后对结果进行过滤。
判断条件不同:where不能对聚合函数进行判断,而having可以
注意事项:
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
执行顺序: where > 聚合函数 > having 。
支持多字段分组, 具体语法为 : group by columnA,columnB
三、分页查询
分页操作在业务系统开发时,也是非常常见的一个功能,我们在网站中看到的各种各样的分页条,后台都需要借助于数据库的分页操作。MySQL使用LIMIT用来限定查询结果的起始行,以及总行数。
#语法:
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
注意事项:
• 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。
• 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
• 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
# 查询5行记录,起始行从0开始
SELECT * FROM emp LIMIT 0, 5;
或者
SELECT * FROM emp LIMIT 5;
#查询10行记录,起始行从3开始
SELECT * FROM emp LIMIT 3, 10;
四、DQL语句执行顺序
之前我们说了DQL语句的书写顺序,但是它的执行顺序是完全不一样的,这里就来了解一下执行顺序。
1)从from开始,先找到所查询的表格
2)是where,过滤查询条件
3)进行group by分组及分组的过滤条件having
4)进行字段的查询select,查看要获得几个列
5)对查询到的列进行排序,用到order by
6)最后是进行分页limit,即展示的数据列表
总结
这一篇文章对聚合函数、分组查询、分页查询及执行顺序做了大概说明,这些都只是建立在单表什的查询,之后会讲到关于多表查询。