【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 给两层查询中的同一张表各起一个别名,从而在需要时能够分清

posted @ 2021-08-22 22:41  ZzzRed  阅读(64)  评论(0)    收藏  举报