目录
一、聚合查询
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就无法使用了。