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中的全部元组都处理完毕