MySql--多表查询及聚合函数总结
建议先阅读MySql--增删改查表设计总结-CSDN博客
一、聚合函数
1.COUNT(列||*):统计结果的个数。
2.SUM(列):求和。
3.AVG(列):求平均值。
4.MIN(列) 最小值。
5.MAX(列) :最大值。
二、GROUP BY 分组查询
对某一个字段进行分组操作,分组后可以结合聚合函数进行一些运算。
HAVING子句
对GROUP BY的结果进行过滤
三、联合查询(表连接查询)
1.内连接
select * from table1,table2 where table1.xxx=table2.xxx;
select * from table1 join table2 on table1.xxx=table2.xxx;
select * from table1 inner join table2 on table1.xxx=table2.xxx;
2.表连接的执行过程
1.先计算参与表连接的笛卡尔积
2.通过连接条件过滤无效数据
3.加入查询条件得到想要的结果行
4.精简列名得到最终想到查询的列
3.外连接
select * from table1 left join table2 on table1.xxx=table2.xxx;
select * from table1 right join table2 on table1.xxx=table2.xxx;
左外连接以左表为基准,左边的表中所有的数据全部显示,右表中没有对应的记录用NULL填充
右外连接以右表为基准,右边的表中所有的数据全部显示,左表中没有对应的记录用NULL填充
主要应用在两张表数据不一致的场景中。
4.自连接
select * from table1.t1,table1.t2 where t1.xxx=t2.xxx;
把行转换成列,在查询的时候可以用where进行条件过滤,实现行与行之间的比较。
5.子查询
单行子查询 select * from table1 where id=(select id from table2 where clo=xxx);
多行子查询 select * from table1 where id in (select id from table2 where clo=xxx);
内层查询的结果作为外层查询的条件,把多条语句合并为一条执行
子查询可以无限嵌套,层数过多会影响效率。
6.合并查询
select * from table1 union select * from table2;
select * from table1 union all select * from table2;
作用是把两个结果集合并成一个返回。
注意:合并查询时多个查询的查询列表必须匹配,MySql不对结果做校验,写的时候务必注意。
四、SQL语句中各部分的执行顺序
我们自己随便构造一条sql,不一定可以执行,但是相关的关键字都包含:
select distinct id,name,avg(age) from student where class_id=1 join class on student.class_id=class.id group by student.id having avg(age)>0 order by student.id asc limit 100;
FROM -->JION ON -->WHERE -->GROUP BY -->HAVING -->SELECT ---> DISTINCT -->ORDER BY --> LIMIT