SQL 语句的解析过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 语句的解析过程相关的知识,希望对你有一定的参考价值。

参考技术A 五、 SELECT 子句

尽管出现在sql语句的最前面,SELECT在第五步的时候才被处理,SELECT子句返回的表会最终返回给调用者。这个子句包含三个子阶段:(5-1)计算表达式,(5-2) 处理DISTINCT,(5-3)应用TOP过滤。

1、 计算表达式

SELECT子句中的表达式可以返回或者操作前一步表中返回的基本列。如果这个sql语句是一个聚合查询,在Step 3之后,你只能使用GROUP BY中的列,对不属于GROUP集合中的列必须使用聚合运算。不属于FROM表中基本列的必须为其起一个别名,如YEAR(orderdate) AS orderyear。

注意:在SELECT子句中创建的别名,不能在之前的Step中使用,即使在SELECT子句中也不能。原因是sql的很多操作是同时操作(all at once operation),至于什么是all-at-once operation这里就不再介绍了。因此,SELECT子句中创建的别名只能在后面的子句中使用,如ORDER BY。例如:SELECT YEAR(orderdate) AS orderyear . . . ORDER BY orderyear。

在这个例子中:

SELECT C.customerid, COUNT(O.orderid) AS numorders

结果会得到一个虚拟表VT5-1:

C.customerid numorders

FIFSSA 0

FRNDO 2

2、应用DISTINCT子句

如果sql语句中使用了DISTINCT,sql会把重复列去掉,生成虚拟表VT5-2。

3、应用TOP选项

TOP选项是T-SQL提供的一个功能,用来表示显示多少行。基于ORDER BY子句定义的顺序,指定个数的列会被查询出来。这个过程生成虚拟表VT5-3。

正如上文提到的,这一步依赖于ORDER BY定义的顺序来决定哪些列应该显示在前面。如果你没有指定结果的ORDER BY顺序,也没有使用WITH TIES子句,每一次的返回结果可能会不一致。

在我们的例子中,Step 5-3被省略了,因为我们没有使用TOP关键字。

六、ORDER BY子句

前一步返回的虚拟表在这一步被排序,根据ORDER BY子句指定的顺序,返回游标VC6。ORDER BY子句也是唯一一个可以使用SELECT子句创建的别名的地方。

注意:这一步和之前不同的地方在于,这一步返回的结果是一个游标,而不是表。sql是基于集合理论的,一个集合没有对他的行定义顺序,它只是一个成员的逻辑集合,因此成员的顺序并不重要。带有ORDER BY子句的sql返回一个按照特定序列组织每一行的对象。ANSI 把这样的一个对象叫游标。理解这一点对你了解sql很重要。

上面的步骤如图所示:

mysql之sql语句执行过程

1.SQL语句执行过程

   1.客户端发送一条sql查询语句给服务器;

    2.服务器通过权限检查之后,首先会检查查询缓存,如果命中了缓存,则立即返回 存储在缓存中的结果,否则进入下一步;

    3.服务器端进行sql解析,预处理,再由查询优化器根据该sql所涉及的数据表的统计信息进行计算,生成对应的执行计划;

    4.mySQL根据查询优化器生成的执行计划,调用存储引擎的API来执行查询;

     5.将查询结果返回给客户端;   

技术图片

 

2.SQL语句执行过程的注意事项

1.在执行查询时所使用过存储引擎就是该数据库使用的存储引擎

2.sql执行的最大瓶颈在大于磁盘的IO,即数据的读取:不同SQL语句的写法,会造成不同的执行计划的执行,而不同的执行计划在IO上面临完全不一样的数据级,从而造成性能差距;

3.所以说:sql优化其实就是让查询优化器根据程序员的计划选择匹配的执行计划,来减少查询中产生的IO

以上是关于SQL 语句的解析过程的主要内容,如果未能解决你的问题,请参考以下文章

C# 解析 SQL 语句以查找存储过程中使用的所有 INSERT/UPDATE/DELETE 表

利用mysql存储过程循环插入新数据并更新

存储过程EXECUTE IMMEDIATE V_SQL执行很慢或出不来,如果把V_SQL语句拿出来单独执行很快,这是为啥?

Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js

bat执行sqlplus语句,省去@xx.sql过程

项目开发中使用存储过程和直接使用SQL语句的区别