MySQL 03
1.和插入配合的查询
2.聚合查询
1.聚合函数
2.分组查询 group by
3.where/having
3.联合查询(多表查询)
笛卡尔积:本质上排列组合
列数是列数之和,行数是行数之积 (如果拿两个大表进行笛卡尔积,开销就会很大)
select * from 表1,表2
笛卡尔积得到的结果,绝大多数都是无效数据(需要连接条件)
1.笛卡尔乘积
2.指定连接条件
3.指定其他条件
4.针对列进行精简/表达式运算/聚合查询
&&和&
第一个可以按照短路求值,第二个不行
&如何确定是按位与还是逻辑与?? 看两遍是boolean类型还是整数类型
多表联合查询还有另一种写法
select * from 表1 join 表2 on 连接条件
1.计算的笛卡尔积
聚合之后,如果不对列进行调整,就只得到组的第一条记录
select student.name,sum(score.score) as total from student,score where student.id = score.student_id group by student.name;
也可以选择join on 再进行join on 这样逻辑更清晰
框架式起到一种约束的作用的,因为程序员的水平不同
外连接也是多表查询的一种体现形式
上面的手法称之为"内连接"
多数情况下内连接和外连接查询结果没啥区别
特殊情况下才会有所区别
内连接
select * from student,score where student.id = score.student.Id;
join写法在join执勤可以加上一个inner
外连接:左外连接,右外连接
select * from student left join score on student.id = score.studentId ;
select * from student right join score on student.id = score.studentId ;
当两个表的记录不能一一对应就能够看出来差别了
对于内连接,得到的结果必须是两个表都存在的数据
左外连接(加上左边的表)
右外连接(右表为主,会保证右表数据都出现)
全外连接(左右都全出现)但是mysql不支持全外连接
自连接(代价相当高)
有的时候想进行条件查询,想进行之间的条件,此时就可以通过自连接,把行转成列
子查询 :套娃,将多个简单的sql合并成一个复杂的sql操作
不建议使用
select name from student where name != ... and class_id = (select class_id from student where name = ...)
合并查询 - 把两个查询的结果集合,合并成一个集合
(要求列数和类型匹配,列名不影响,最后结果就是第一个select的列名)
union会自动对查询的结果进行去重操作,union all 就不会
重点:约束+聚合查询+联合查询
子查询+合并查询了解即可