W
e
l
c
o
m
e
: )

Mysql高级查询

聚合函数

什么是聚合函数?

聚合函数在数据的查询分析中,应用十分广泛。聚合函数可以对数据求和、求最大值和最小值、求平均值等等。

AVG函数

AVG函数用于获得非空值的平均值,非数字数据统计结果为0。

SELECT AVG(字段) FROM [表名]; # 求非空值的平均值

SUM函数

SUM 函数用于求和,只能用于数字类型,字符类型的统计结果为0,日期类型统计结果是毫秒相加。

SELECT SUM(字段) FROM t_emp; # 求和

MAX函数

MAX函数用于获取非空值的额最大值。

SELECT MAX(字段) FROM [表名]; # 求某个表非空值的最大值

MIN函数

MIN函数用于获取非空的最小值。

SELECT MIN(字段) FROM [表名]; # 求某个表非空值的最小值

COUNT函数

COUNT(*)用于获得包含空值的记录值,COUNT(字段)用于获得包含非空值的记录值。

SELECT COUNT(*) FROM [表名]; # 统计真正记录的条数,不管数据有效无效,有没有空值
SELECT COUNT(字段) FROM [表名]; # 攻击字段里非空的数据

数据操作语言:分组查询

默认情况下汇总函数是对全表范围内的数据做统计

GROUP BY 子句的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对每个小区域分别进行数据汇总处理

SELECT deptno,AVG([求平均值]) FROM [表名] GROUP BY [需要分组的表];

ROUND() 将数字四舍五入变成整数

逐级分组

  • 数据库支持多列分组条件,执行的时候逐级分组。
SELECT deptno,AVG([求平均值]) FROM [表名] GROUP BY [需要分组的表],[分组的表];

对SELECT子句的要求

查询语句中包含GROUP BY子句,那么SELECT子句中的内容就必须遵守规定:SELECT子句中可以包含聚合函数,或者GROUP BY子句的分组列,其余内容君不可以出现在SELECT字句中

image-20220506171107832

对分组结果集再次做汇总计算

image-20220506173421106

GROUP_CONCAT函数

GROUP_CONCAT函数可以把分组查询中的某个字段拼接成一个字符串

image-20220506174458432

各种子句的执行顺序

查询语句中,GROUP BY子句应该第几个执行?

FROM (要查询的表) -> WHERE (执行条件) -> GROUP BY (按照什么分组) -> SELECT (读取数据) -> ORDER BY (排序,ASC升序、DESC降序) -> LIMIT (分页查询)

数据操作语言:HAVING 子句

HAVING 子句必须和GROUP BY一起出现,因为HAVING 依赖于GROUP BY

SELECT xxx FROM xxx GROUP BY xxx HAVING xxx;

按照数字1分组,MySQL会依据SELECT子句中的列进行分组,HAVING子句也可以正常使用

HAVING子句的特殊用法

按数字1分组,MySQL会依据SELECT子句中的列进行分组,HAVING子句也可以正常使用

SELECT deptno,COUNT(*) FROM t_emp GROUP BY 1;
SELECT deptno,COUNT(*) FROM t_emp GROUP BY 1 HAVING deptno IN(10,20);

表连接查询

从多张表提取数据,必须指定关联的条件。如果不定义关联条件就会出现无条件连接,两张表的数据会交连接,产生笛卡尔积。

image-20220508153625374

规定了连接条件的表连接语句,就不会出现笛卡尔积

image-20220508153914137

SELECT empno,ename,d.dname FROM t_emp e JOIN t_dept d ON e.deptno=d.deptno;
# 只要有ON子句规定了表连接的条件,只要有这个条件就不会出现笛卡尔积

表连接的分类

  1. 表连接分为两种:内连接和外连接
    1. 内连接是结果集中只保留符合连接条件的记录
    2. 外连接是不管符不符合;连接条件,记录都要保留在结果集中

内连接介绍

内连接是最常见的一种连接,用于查询多张关系表符合连接条件的记录。

image-20220508154753684

SELECT ... FROM 表1 JOIN 表2 ON 条件 JOIN 表3 ON 条件 ...

内连接的多种语法形式

SELECT ... FROM 表1 JOIN 表2 ON 连接条件;
SELECT ... FROM 表1 JOIN 表2 WHERE 连接条件;
SELECT ... FROM 表1,表2 WHERE 连接条件;

外连接介绍

外连接与内连接的区别在于,除了符合条件的记录外,结果集中还会保留不符合条件的记录。

image-20220510153228692

左外连接就是保留坐标所有的记录,与右表连接。如果右表有符合条件的记录就与左表连接。如果右表没有符合条件的记录,就用NULL与左表连接。右外连接也是如此。

UNION 关键字可以将多个查询语句的结果集进行合并

(查询语句) UNION (查询语句) UNION (查询语句) ......

外连接的注意事项

内连接只保留符合条件的记录,所以查询条件写在ON子句和WHERE子句中的效果是相同的。但是外连接里,条件卸载WHERE子句里,不符合条件的记录是会被过滤掉的。而不是保留下来。

image-20220510174355206

子查询

子查询是一种查询中嵌套查询的语句

image-20220510181022184

FROM子查询

这种子查询只会执行一次,所以查询效率很好

image-20220510181616482

SELECT子查询

这种子查询没输出一条记录的时候都要执行一次,查询的效率很低

image-20220510181757292

单行子查询和多行子查询

单行子查询的结果集只有一条记录,多行子查询结果集有多行记录

多行子查询只能出现在WHERE子句和FROM子句中

WHERE子句中的多行子查询

WHERE字句中,可以只用IN、ALL、ANY、EXISTS关键字来处理多行表达式结果集的判断

EXISTS关键字

EXISTS关键字是把原来的崽子查询之外的条件判断,写在了子查询的里面。

SELECT ... FROM 表名 WHERE [NOT] EXISTS (子查询);

NOT:保留那些不符合条件的结果。正常情况不写NOT

posted @ 2022-12-02 20:23  与你一起看星辰  阅读(39)  评论(0)    收藏  举报