【MYSQL】聚合查询、分组查询、联合查询
目录
- 聚合查询
- 聚合函数
- count()
- sum()
- avg()
- max()和min()
- 总结
- 分组查询
- group by 子句
- having 子句
- 联合查询
- 笛卡尔积
- 内连接
- 外连接
- 自连接
- 子查询
- 单行子查询
- 多行子查询
- from子句使用子查询
- 合并查询
聚合查询
聚合查询就是针对表中行与行之间的查询。
聚合函数
count()
count(列名):查询当前列下面有多少条数据。
select count(*) from 表名;#查询当前表有多少行
select count(列名) from 表名;#查询该列有多少行
- count(1),里面加个数字常量也可以达到count(*)的效果,推荐写count(*)。
- 使用count(列名)查询到null时不算入行数。
sum()
把查询到的结果相加。
select sum(列名) from 表名;#将该列所有值相加
- 必须是数字,不是数字会报警告没结果。
- 使用该函数会将null不计算,不会出现加上null和为null的结果。
avg()
求查询到结果的平均值。
select avg(列名/表达式) from 表名;#将该列所有值的平均数
- 必须是数字,不是数字会报警告没结果。
- 使用该函数会将null那行不计算,比如1,2,null平均值为(1 + 2)/
2
= 1.5000。
max()和min()
分别返回查到的最大值和最小值。
select max(列名) from 表名;#返回该列最大值
select min(列名) from 表名;#返回该列最小值
- 必须是数字,不是数字会报警告没结果。
- null不参与。
总结
函数 | 说明 |
---|---|
count (列名) | 返回查询到的数据的 数量 |
sum(列名) | 返回查询到的数据的 总和,不是数字没有意义 |
avg(列名) | 返回查询到的数据的 平均值,不是数字没有意义 |
max(列名) | 返回查询到的数据的 最大值,不是数字没有意义 |
min(列名) | 返回查询到的数据的 最小值,不是数字没有意义 |
分组查询
group by 子句
查询(select) 中使用 group by子句可以对指定列进行分组查询。
功能就是将查询到的结果中 group by 子句后的列完全相同的合并在一起。
select 列名.... from 表名 group by 列名1, 列名2;
group by 子句后也可以跟 order by子句排序。
having 子句
group by 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 where语句,而需要用having。
因为分组结果在结果集中是临时表,不是真是的数据,where处理的事是真实数据。
select 列名.... from 表名 group by 列名1, 列名2 having 条件;
联合查询
联合查询就是将多张表联合起来查询,将需要的信息一起取出来。
笛卡尔积
笛卡尔积就是将表中每行与其他表的行进行全排列。
select .... from 表1,表2;
例如:
-
当使用笛卡尔积的表含有主外键查询时,因为是全排列,必然会产生无效数据,我们就可以使用条件查询,但是必须要使用 表名.列名。
-
通过指定列查询精简结果集时也需要使用 表名.列名。
-
可以通过给表名起别名来精简SQL语句。
内连接
两种写法:
select 列名 from 表1 as 别名1,表2 as 别名2 where 条件 and 其他条件;
select 列名 from 表1 as 别名1 join 表2 as 别名 on 条件 and 其他条件;
外连接
外连接分为左外连接和右外连接。
如果联合查询,join 左侧的表完全显示我们就说是左外连接;
join右侧的表完全显示我们就说是右外连接。
select 列名 from 表1 as 别名1 right join 表2 as 别名2 on 条件;#右外连接,表2全显示
select 列名 from 表1 as 别名1 left join 表2 as 别名2 on 条件;#左外连接,表1全显示
自连接
自连接是指在同一张表连接自身进行查询。
但是必须要对表进行起不同的别名。
select 列名 from 表名 as 别名1,表名 as 别名2 where 条件 and 其它条件;
select 列名 from 表名 as 别名1 join 表名 as 别名2 on 条件 and 其它条件;
子查询
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。
select 列名 from 表名 where 列 = (select语句 );#例子
单行子查询
作为条件的子查询语句返回值只有一行数据。
多行子查询
作为条件的子查询语句返回值有多行行数据。
- 可以使用in来处理:
- 可以使用多列包含:
将where条件括号中与返回值一一进行比较
- 使用[not] exists关键字
select 列名 from 表名 where exists (select语句);
后面查询语句返回结果集为空就不执行前面的查询语句,反之不为空执行。
from子句使用子查询
在from子句中使用子查询:子查询语句出现在from子句中。
把一个子查询当做一个临时表使用。
合并查询
为了合并多个select的执行结果,可以使用集合操作符 union,union all。
使用union 和union all时,前后查询的结果集中,字段需要一致。
- union操作符用于取得两个结果集的并集。当使用该操作符时,
会自动去掉结果集中的重复行。 - union all 操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。