SQL语句的各个关键字的解析过程详细总结
LEFT OUTER JOIN dbo.Orders AS O
FRNDO Madrid 4 KRLOS
FRNDO Madrid 5 KRLOS
(5-1)计算表达式 计算SELECT 子句中的表达式,生成VT5-1
FRNDO Madrid 7 NULL
KRLOS Madrid 3 KRLOS
customerid city
FISSA Madrid 6 MRPHS
orderid customerid
SELECT C.customerid, COUNT(O.orderid) AS numorders
KRLOS Madrid
KRLOS Madrid 1 FRNDO
1 FRNDO
KRLOS Madrid 5 KRLOS
FISSA Madrid 5 KRLOS
FRNDO Madrid 3 KRLOS
FISSA Madrid 3 KRLOS
FISSA Madrid 1 FRNDO
KRLOS Madrid 4 KRLOS
Step 1-J1:执行笛卡尔积(CROSS JOIN)笛卡尔积会把左右两个表每一行所有可能的组合都列出来生成表VT1-J1,如果左表有m列,右表有n列,那么笛卡尔积之后生成的VT1-J1表将会有m×n列。
FISSA Madrid 2 FRNDO
查询结果为:MRPHS Zion 1 FRNDO
ON C.customerid = O.customeridMRPHS Zion
FRNDO Madrid 1 FRNDO
(1-J1)笛卡尔积 这个步骤会计算两个相关联表的笛卡尔积(CROSS JOIN) ,生成虚拟表VT1-J1。FISSA Madrid
FRNDO Madrid 1 FRNDO
FROM子句FROM子句标识了需要查询的表,如果指定了表操作,会从左到右的处理,每一个基于一个或者两个表的表操作都会返回一个输出表。左边表的输出结果会作为下一个表操作的输入结果。例如,交表相关的操作有 (1-J1)笛卡尔积,(1-J2)ON过滤器,(1-J3)添加外部列。FROM句子生成虚拟表VT1。
7 NULL
KRLOS Madrid 4 KRLOS
KRLOS Madrid 5 KRLOS
(1-J2)ON过滤 这个步骤基于虚拟表VT1-J1这一个虚拟表进行过滤,过滤出所有满足ON 谓词条件的列,生成虚拟表VT1-J2。3. GROUP BY 这个子句会把VT2中生成的表按照GROUP BY中的列进行分组。生成VT3表。
4 KRLOS
WHERE C.city = 'Madrid'FRNDO Madrid 6 MRPHS
FRNDO Madrid 2 FRNDO
4. HAVING 这个子句对VT3表中的不同的组进行过滤,满足HAVING条件的子句被加入到VT4表中。(1-J3)添加外部行 如果使用了外连接,保留表中的不符合ON条件的列也会被加入到VT1-J2中,作为外部行,生成虚拟表VT1-J3。
复制代码 代码如下:
KRLOS Madrid 3 KRLOS
创建一个Orders表,插入如下数据:
MRPHS Zion 5 KRLOS
Step 1-J1这个步骤等价于执行:
FISSA Madrid 4 KRLOS
MRPHS Zion 6 MRPHS
FISSA 0
ORDER BY numordersFROM dbo.Customers AS C
假如我们想要查询来自Madrid的,订单数小于3的客户,并把他们的订单数显示出来,结果按照订单数从小到大进行排序。
SELECT * from Customers C CROSS JOIN Orders O
执行结果为:(共有4×7列)
FRNDO Madrid 2 FRNDO
5 KRLOS
6 MRPHS
Step 1-J2:应用ON过滤,(JOIN 条件)ON过滤条件是sql的三个过滤条件(ON,WHERE,HAVING)中最先执行的,ON过滤条件应用于前一步生成的虚拟表(VT1-J1),满足ON过滤条件的行会被加入到虚拟表VT1-J2中。在应用了ON 过滤之后,生成的VT1-J2表如下所示:
2 FRNDO
FRNDO 2
下面我们会详细的讲述sql是怎样计算出这个结果的:
FISSA Madrid 7 NULL
MRPHS Zion 3 KRLOS
ORDER BY 从VT5-3中的表中,根据ORDER BY 子句的条件对结果进行排序,生成VC6表。SQL语句的解析顺序
简单的说一个sql语句是按照如下的顺序解析的:
由于最近需要做一些sql query性能提升的研究,因此研究了一下sql语句的解决过程。在园子里看了下,大家写了很多相关的文章,大家的侧重点各有不同。本文是我在看了各种资料后手机总结的,会详细的,一步一步的讲述一个sql语句的各个关键字的解析过程,欢迎大家互相学习。
C.customerid C.city O.orderid O.customerid
1. FROM FROM后面的表标识了这条语句要查询的数据源。和一些子句如,(1-J1)笛卡尔积,(1-J2)ON过滤,(1-J3)添加外部列,所要应用的对象。FROM过程之后会生成一个虚拟表VT1。KRLOS Madrid 6 MRPHS
C.customerid C.city O.orderid O.customerid
MRPHS Zion 2 FRNDO
FRNDO Madrid
MRPHS Zion 7 NULL
KRLOS Madrid 2 FRNDO
GROUP BY C.customerid客户,订单的查询例子
首先创建一个Customers表,插入如下数据:
customerid numorders
(5-2)DISTINCT 寻找VT5-1中的重复列,并删掉,生成VT5-2MRPHS Zion 4 KRLOS
5. SELECT 这个子句对SELECT子句中的元素进行处理,生成VT5表。3 KRLOS
KRLOS Madrid 7 NULL
HAVING COUNT(O.orderid) < 32. WHERE 对VT1过程中生成的临时表进行过滤,满足where子句的列被插入到VT2表中。
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/sql/mssql/2836.shtml
相关文章
热门TAG
命令 权重 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 服务器 网站流量 实例解析 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows SEO优化 蜘蛛 搜索引擎 网站收录 JSP最新文章
-
sql server 关于设置null的一
时间:2020-12-28
-
详解SQL游标的用法
时间:2020-12-27
-
vs code连接sql server数据库步
时间:2020-12-27
-
图书管理系统的sqlserver数
时间:2020-12-25
-
详解SQL 通配符
时间:2020-12-25
-
sql四大排名函数之ROW_NUM
时间:2020-12-25
-
SQLServer数据库处于恢复挂
时间:2020-12-24
-
Win10 64位安装个人版SQL20
时间:2020-12-24
热门文章
-
sqlserver中查询横表变竖表的sql语句简析
时间:2020-12-08
-
关于SQL Server查询语句的使用
时间:2020-12-13
-
SQL Server简单模式下误删除堆表记录恢复方
时间:2020-12-12
-
MSSQL教程_mssql数据库教程_MSSQL基础教程_第
时间:2020-12-13
-
详解SQL游标的用法
时间:2020-12-27
-
sql server 关于设置null的一些建议
时间:2020-12-28
-
jdbc连接sql server数据库问题分析
时间:2020-12-10
-
mssql关于一个表格结构的另外一种显示(表
时间:2020-12-11
-
SQL Server数据库入门学习总结
时间:2020-12-10
-
使用SqlBulkCopy时应注意Sqlserver表中使用缺
时间:2020-12-09
