Lesson 5:MySQL的聚合查询和联合查询

目录

一、聚合查询

1.1 常用的聚合函数

​1.2 group by 子句

1.3 having子句

​ 二、联合查询(多表查询)

2.1 笛卡尔积

2.2 多表查询

2.2.1 多表查询思路

2.2.2 内连接

2.2.3 左外连接和右外连接

2.2.4 自连接

2.2.5 子查询(嵌套查询)

2.2.6 合并查询


一、聚合查询

1.1 常用的聚合函数

聚合函数相当于SQL提供的库函数,是将查询结果按照行的维度进行合并。

函数说明
count

计算当前查询结果有多少行

如果查询结果里面有null,并不会计入到结果中。

sum计算当前查询结果的总和。
avg计算当前查询结果的平均值。
max计算当前查询结果的最大值。
min计算当前查询结果的最小值。

1.2 group by 子句

在selelct语句中使用group by子句可以对指定列进行分组查询。在使用时需要满足:select指定的字段必须是“分组依据,其他字段要想出现在select中,必须包含在聚合函数中。

select 列1, 聚合函数(列2), 聚合函数(列3)···from table group by 列1;

select 列1, 列2, 聚合函数(列3)···from table group by 列1,列2;

1.3 having子句

通过group by子句分组后,如果需要针对分组后的结果再进行一次筛选,使用having子句,不能使用where子句。

having:分组之后进行筛选

where:未分组时进行筛选

 二、联合查询(多表查询)

2.1 笛卡尔积

多表查询的核心概念是笛卡尔积。笛卡尔积就是对两个表进行一个排列组合,笛卡尔积得到的结果仍然是一个表,列数是两张表的列数之和,行数是两张表的行数之积。

从上图可以看到,笛卡尔积将所有可能的结果都罗列出来,有时会出现一些并不科学的数据。因此,在多表查询时,我们需要在笛卡尔积的基础上再设定一些条件筛选。设定条件时,一般至少需要指定一个连接条件。

2.2 多表查询

2.2.1 多表查询思路

步骤:

1.先分析要查找的数据在哪些表中。

2.针对这些表做笛卡尔积。

3.指定连接条件,把无意义的数据过滤掉。

4.逐渐增加题目中所列举的其他条件,一步步缩小数据范围。

5.精简查询的列。

2.2.2 内连接

select 列名 from 表1 join 表2 on 连接条件 and 其他条件;
select 列名 from 表1,表2 where 连接条件 and 其他条件; --推荐这种写法

2.2.3 左外连接和右外连接

外连接也是指对两个表做笛卡尔积,和内连接差别不大。

假设两个表中的每一条数据都是一一对应的,此时,内连接和外连接就是等价的。当两个表中的数据不对应时,内连接和外连接就有了区别。

外连接分为左外连接和右外连接。左外连接中,左侧的表的数据是全的,右外连接,右侧的表的数据是全的。

select 列名 from 表1 left join 表2 on 连接条件;
select 列名 from 表1 right join 表2 on 连接条件;

2.2.4 自连接

自连接是指一张表和自己进行连接,即和自己进行笛卡尔积。

这是一种处理问题的特殊手段,存在的最大意义就是把行转化为列。

2.2.5 子查询(嵌套查询)

子查询是指嵌入在其他sql语句里面的select语句。(也可以理解为把多个sql语句合并在一起)

1.单行子查询

返回一条查询结果的子查询。先查询的语句写在后面。

举例:查找和Mary同班的同学

2.多行子查询

①使用in

执行过程:先执行子查询,查询结果放在内存中,再进行外层查询,一共执行2次SQL。

举例:查询在一班和二班的同学。

②使用exists

执行过程:先执行外层查询,得到很多行记录。针对每一条记录,带到子查询中,如果子查询的结果集合为空,那么外层查询的这一行记录就会被忽略,如果非空则保留。

注意,每获取到外层查询的一行,都要执行一次子查询的SQL。

exists作用就是检测子查询结果是否为空的集合。 

③比较

基于in

查询速度快,但如果子查询的结果集合很大,内存放不下就会出现问题。

基于exists

查询速度较慢,但是查询操作与内存关系不大。即使子查询结果很大,也不会出现问题。

 ④适用条件

基于in

子查询结果集合较小的情况。

基于exists

子查询结果集合比较大,并且外层查询结果集合较小的情况。

如果子查询结果集合比较大,并且外层查询结果较多,不适合使用数据库。

2.2.6 合并查询

将多个查询结果合并成一个。

union:会自动去除结果中的重复行。

union all:不会自动去重。

 union和or的区别:如果数据来源于两个表,union可以使用,但是or就无法使用了。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘减减

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值