MySQL,SQL语句执行顺序

1.SQL执行顺序:

select 考生姓名, max(总成绩) as max总成绩 
from tb_Grade 
where 考生姓名 is not null 
group by 考生姓名 
having max(总成绩) > 600 
order by max总成绩 

(1). 首先执行 FROM 子句, 从 tb_Grade 表组装数据源的数据 

(2). 执行 WHERE 子句, 筛选 tb_Grade 表中所有数据不为 NULL 的数据 
(3). 执行 GROUP BY 子句, 把 tb_Grade 表按 "学生姓名" 列进行分组 
(4). 计算 max() 聚集函数, 按 "总成绩" 求出总成绩中最大的一些数值 
(5). 执行 HAVING 子句, 筛选课程的总成绩大于 600 分的. 

(6)执行select 把满足条件的考生姓名和总成绩选出,并给予别名

(7). 执行 ORDER BY 子句, 把最后的结果按 "Max 成绩" 进行排序. 

2.子查询:

2.1 不相关子查询

    SELECT Sno,Sname,Sdept
    	FROM Student
   	WHERE Sdept  IN
                  (SELECT Sdept
                   FROM Student
                   WHERE Sname= ‘ 刘晨 ’);

  

子查询的查询条件不依赖于父查询
由里向外 逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。 

2.2 相关子查询

子查询的查询条件依赖于父查询,首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表,然后再取外层表的下一个元组,重复这一过程,直至外层表全部检查完为止

 

2.3 执行顺序:

查询选修了课程名为“信息系统”的学生学号和姓名
SELECT Sno,Sname 
FROM    Student                                 ③ 最后在Student关系中取出Sno和Sname

WHERE Sno  IN
       ( SELECT Sno                              ② 然后在SC关系中找出选修了3号课程的学生学号

                FROM    SC
                WHERE  Cno IN
                     ( SELECT Cno 
                       FROM Course
                       WHERE Cname= ‘信息系统’  ① 首先在Course关系中找出“信息系统”的课程号,结果为3号课程

                     )
              );

 

3.表连接执行顺序:

首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。
表2全部查找完后,再找表1中第二个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。
重复上述操作,直到表1中的全部元组都处理完毕 

posted @ 2020-12-29 12:21  暖暖-木木  阅读(135)  评论(0编辑  收藏  举报