【MySQL_学习笔记】2021.8.17
- 非关联子查询
SELECT * FROM student; SELECT * FROM punish
SELECT * FROM student WHERE student_id IN ( SELECT student_id FROM punish WHERE points=5)
备注:非相关子查询的执行顺序是先内后外,内层查询执行得到结果后,再执行外层查询
SELECT * FROM income WHERE funs_id IN ( SELECT funs_id FROM income GROUP BY funs_id HAVING SUM(money)>50000)
备注:子查询与外层查询使用的表可以是同一张表
- 关联子查询
(1)非关联子查询是指两层查询互不依赖,即使删除外面的查询,里面的查询也能执行;
(2)关联子查询是指内层查询依赖于外层,如果删除外面的查询,里面的查询无法执行;
SELECT student_name, total_points FROM student WHERE total_points != ( SELECT SUM(points) FROM punish WHERE punish.student_id = student.student_id )
SQL关联查询的执行过程:
1. 先判断是否为关联子查询;
2. 若是非关联,则先里后外;若是关联,则先运行外层的查询、检查第一条记录;
3. 外层查询暂停在第一条上,并使用该记录的信息,进入内层查询并执行;
4. 将内层查询结果返回外层,供其判断第一条记录是否符合条件,符合则显示;
5. 外层查询重启,检查第二条记录,如此反复......
关联子查询与非关联子查询执行顺序的区别:
1. 非关联子查询:先内后外,内层执行完毕得到一个列表,然后执行外层
2. 关联子查询:先外后内。外层找一条记录,就执行一次子查询;然后外层再找一条记录,接下来再执行一次子查询......
SELECT funs_id AS 用户ID, gift_level AS 礼物类型, pay_time AS 支付时间, money AS 支付金额, money/(SELECT SUM(money) FROM income AS i2 WHERE i2.funs_id = i1.funs_id) AS 总额比例 FROM income AS i1
在同一张表上应用子查询的过程:
1. 先写外层查询,即最终要显示哪个表的哪些字段
2. 发现要用到表中没有的信息(例如总计金额),于是在需要的地方写一个子查询
3. 用 AS 给两层查询中的同一张表各起一个别名,从而在需要时能够分清

浙公网安备 33010602011771号