DQL语言(数据库检索select)2

本文详细介绍了MySQL中的聚合函数(COUNT(),SUM(),AVG(),MAX(),MIN()),分组查询(包括HAVING子句),分页查询以及DQL语句的执行顺序,重点讲解了这些在数据库查询中的应用和注意事项。
摘要由CSDN通过智能技术生成

文章目录

前言

一、聚合函数

1) COUNT()

2) SUM()和AVG()

3) MAX()和MIN()

二、分组查询

HAVING子句

having和where的不同:

三、分页查询

四、DQL语句执行顺序


前言

        上一篇介绍了数据库四种语言,其中,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,即展示的数据列表


总结

        这一篇文章对聚合函数、分组查询、分页查询及执行顺序做了大概说明,这些都只是建立在单表什的查询,之后会讲到关于多表查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值