目录

一、聚合查询

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;

mysql聚合函数使用 mysql数据聚合_子查询

1.3 having子句

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

having:分组之后进行筛选

where:未分组时进行筛选

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

2.1 笛卡尔积

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

mysql聚合函数使用 mysql数据聚合_database_02

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

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 其他条件; --推荐这种写法

mysql聚合函数使用 mysql数据聚合_数据库_03

2.2.3 左外连接和右外连接

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

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

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

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

mysql聚合函数使用 mysql数据聚合_mysql聚合函数使用_04

mysql聚合函数使用 mysql数据聚合_数据库_05

2.2.4 自连接

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

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

2.2.5 子查询(嵌套查询)

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

1.单行子查询

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

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

mysql聚合函数使用 mysql数据聚合_数据库_06

2.多行子查询

①使用in

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

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

mysql聚合函数使用 mysql数据聚合_database_07

②使用exists

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

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

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

mysql聚合函数使用 mysql数据聚合_数据库_08

③比较

基于in

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

基于exists

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

 ④适用条件

基于in

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

基于exists

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

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

2.2.6 合并查询

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

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

union all:不会自动去重。

mysql聚合函数使用 mysql数据聚合_database_09

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