容易被忽略的事----sql语句中select语句的执行顺序

关于Sql中Select语句的执行顺序,一直很少注意这个问题,对于关键字的使用也很随意,至于效率问题,因为表中的数据量都不是很大,所以也不是很在意。

今天在一次面试的时候自己见到了,感觉没一点的印象,所以也就没有答上来,现在整理一下吧,希望提醒自己,也能够帮到其他的朋友。如下:

(8)   SELECT (9)DISTINCT
(11) <TOP_specification> <select_list>
(1)   FROM <left_table>
(3)   <join_type> JOIN <right_table>
(2)   ON <join_condition>
(4)   WHERE <where_condition>
(5)   GROUP BY <group_by_list>
(6)   WITH {CUBE | ROLLUP}
(7)   HAVING <having_condition>
(10) ORDER BY <order_by_list>

每个步骤产生一个虚拟表,该虚拟表被用作下一个步骤的输入。只有最后一步生成的表返回给调用者。如果没有某一子句,则跳过相应的步骤。

1. FROM:对FROM子句中的前两个表执行笛卡尔积,生成虚拟表VT1。

2. ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。

3. OUTER(JOIN):如果指定了OUTER JOIN,保留表中未找到匹配的行将作为外部行添加到VT2,生成VT3。

如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。

4. 对VT3应用WHERE筛选器。只有使<where_condition>为TRUE的行才被插入VT4。

5. GROUP BY:按GROUP BY 子句中的列列表对VT4中的行分组,生成VT5。

6. CUBE|ROLLUP:把超组插入VT5,生成VT6。

7. HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为TRUE的组才会被插入VT7。

8. SELECT:处理SELECT列表,产生VT8。

9. DISTINCT:将重复的行从VT8中移除,产生VT9。

10. ORDER BY:将VT9中的行按ORDER BY子句中的列列表排序,生成一个有序表(VC10)。

11. TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回给调用者。

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【飞翔的小伟】,谢谢!

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

时间: 2024-08-02 02:47:44

容易被忽略的事----sql语句中select语句的执行顺序的相关文章

SQL语句中SELECT语句的执行顺序

SELECT语句的执行的逻辑查询处理步骤: 执行顺序 语句 8 SELECT 9 DISTINCT 11 <TOP_specification> <select_list> 1 FROM <left_table> 3 <join_type> JOIN <right_table> 2 ON <join_condition> 4 WHERE <where_condition> 5 GROUP BY<group_by_li

join和on语句中select语句选择公共列的区别

对多个表进行join时,在select语句中,如果使用using语句,则using语句中选中的列,在select语句中不能指定限定词,否则会报ORA-25154 查看emp表 SQL> select * from emp; EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- -

MYSQL语句中SELECT语句及其子句的执行顺序

SELECT语句的执行的逻辑查询处理步骤:(8)SELECT (9)DISTINCT(11)<TOP_specification> <select_list>(1)FROM <left_table>(3) <join_type> JOIN <right_table>(2) ON <join_condition>(4)WHERE <where_condition>(5)GROUP BY <group_by_list&g

sql server中select语句需要申请的锁

以NA_TrafficMemberOrderRelation表为例,表的索引如下: index_id name cols 1 PK__NA_Traff__FB6751642649A903 TrafficMemberOrderRelationId 26 IX_NA_TrafficMemberOrderRelation_usermobile UserMobile 下面的查询语句,正常情况下会先使用IX_NA_TrafficMemberOrderRelation_usermobile索引进行查找,再返

SQL Server中DML语句要申请的锁

对于select语句: 1.当采用表扫描时,会直接锁定page,而不是锁定具体的某条记录,所以会有这些锁: A.数据库S锁 B.表的IS锁 C.页的S锁 2.当采用索引来查找数据时,会锁定具体的记录,所以会有这些锁: A.数据库S锁 B.索引中page的IS锁 C.索引中page中的key的S锁 D.表的IS锁 E.页的IS锁 F.RID的S锁 3.对于读过的页面,会加一个IS锁. 对于使用的索引,会对key加上S锁,对索引key所在的页面会加上IS锁. 在查询过程中,会对每一条读到的记录或ke

[22]SQL INSERT INTO SELECT 语句

[22]SQL INSERT INTO SELECT 语句 INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中.目标表中任何已存在的行都不会受影响. SQL INSERT INTO SELECT 语法 我们可以从一个表中复制所有的列插入到另一个已存在的表中: INSERT INTO table2 SELECT * FROM table1; 或者我们可以只复制希望的列插入到另一个已存在的表中: INSERT INTO table2 (column_name

查询语句中select from where group by having order by的执行顺序

查询语句中select from where group by having order by的执行顺序 1.查询中用到的关键词主要包含六个,并且他们的顺序依次为 select--from--where--group by--having--order by 其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序 与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行 from--where--group by--having--select--order by,

MySql语句中select可以嵌套么,字段的重命名可以用中文么

今天文档中看到的查询语句,SELECT后面又跟了一个SELECT嵌套,而且把字段重命名为中文,请问可以这样做么 MySql语句中select可以嵌套么,字段的重命名可以用中文么 >> mysql 这个答案描述的挺清楚的:http://www.goodpm.net/postreply/mysql/1010000007432443/MySql语句中select可以嵌套么字段的重命名可以用中文么.html

SQL基础语法—select语句

1 select语句介绍 select语句是值从现存的一个或多个表中查看满足条件的数据,其基本语法如下: Syntax: SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] select_expr [