分组函数

功能:用作统计使用,又称为聚合函数或统计函数或组函数
分类:sum 求和、avg平均值、max、min、count计算个数
特点
1、sum,avg用于处理数值型,max,min,count可以处于任何类型

2、以上分组函数都忽略null值

3、可以和distinct搭配实现去重

4、count函数的单独介绍

5、和分组函数一同查询的字段要求是group by后的字段
6、count计算非空的值

分组查询

语法:
select 聚合函数(max,min这些),列(要求出现在group by后面)
from 表
【where 筛选条件】
group by 分组的列表
【order by】子句
注意: 聚合与分组必须成对出现

特点:
1、分组查询中的筛选条件分为两类(筛选的数据源不同
数据源 位置 关键字
分组前筛选: 原始表 group by子句前面 where
分组后筛选: 分组后的结果集 group by子句后面 having

①分组函数做条件,肯定是放在having子句中
②能用分组前筛选的,优先考虑用分组前筛选

2、group by子句支持单个字段分组,多个字段分组,
(多个字段之间用逗号隔开无顺序要求),表达式或函数(用的较少)

3、可添加排序(放在group by后)

连接查询

含义:又称多表查询,当查询的字段来自多个表,就会用到连接查询

笛卡尔乘积现象:表1有m行,表2有n行,结果=m*n行

发生原因:没有有效的连接条件
如何避免:添加有效的连接条件

sql99标准【推荐】:支持内连接+外连接(左外,右外)+交叉连接

按功能分类:
内连接:等值连接,非等值连接,自连接
外连接:左外连接,右外连接,全外连接
交叉连接

语法:
select 查询列表
from 表1 别名 【连接类型】
join 表2 别名 on 【连接条件】
on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】

分类:
内连接:inner
外连接:左外 left 【outer】、右外 right 【outer】、全外 full 【outer】
交叉连接:cross

内连接

语法:

select 查询列表

from 表1 别名

inner join 表2 别名

on 连接条件;

分类:等值、非等值、自连接

特点:

①添加排序、分组、筛选

②inner可以省略

③筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读

④inner join连接和sql92语法中的等值连接效果一样,都是查询多表的交集

外连接

应用场景:用于查找一个表中有,另一个表中没有的记录

特点:

1、外连接的查询结果为主表中所有的记录

如果从表中有和它匹配的,则显示匹配的值

如果从表中没有和它匹配的,则显示null

外连接查询结果=内连接结果+主表中有而从表中没有的记录

2、左外连接:left jon左边的是主表

右外连接:right join右边的是主表

3、左外和右外交换两个表的顺序,可以实现同样的效果

4、全外连接=内连接结果+表1有但表2没有+表2有但表1没有

mysql having 可以直接使用聚合结果 mysql 聚合函数不用group by_外连接

进阶7:子查询

含义:出现在其他语句内部的select语句,称为子查询或内查询
外部的查询语句,称为主查询或外查询

分类:
按子查询出现的位置:
select后面:仅仅支持标量子查询
from后面:支持表子查询
where或者having后面:标量子查询,列子查询,行子查询
exists后面(相关子查询):表子查询
按结果集的行列数不同:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集有一行多列)
表子查询(结果集一般为多行多列)