最近一来因工作上的事情比较闹心,没心事再研究 SQLServer2005 的体系结构;一来关于体系结构确实过于复杂,远远不如应用来的直接明了,所以暂时搁笔。
出于工作上的需要,对应用开发需要更多的了解,所以把心事暂时放到这方面。
先从最简单的 SQL 入手来分析一下 SQL 的执行步骤,为什么了解执行步骤,其实与 JOIN 后的 ON 条件和 WHERE 条件容易混淆有关系。
是先执行 ON 还是先执行 WHERE ,很大程度上会决定 SQL 的结果集正确与否。
CREATE TABLE Customers
(
CustomerID  CHAR(5)     NOT NULL PRIMARY KEY,
City        VARCHAR(10) NOT NULL
);
CREATE TABLE Orders
(
OrderID     INT     NOT NULL PRIMARY KEY,
CustomerID  CHAR(5) NULL REFERENCES Customers(CustomerID)
);
INSERT INTO Customers VALUES('FISSA','Madrid');
INSERT INTO Customers VALUES('FRNDO','Madrid');
INSERT INTO Customers VALUES('KRLOS','Madrid');
INSERT INTO Customers VALUES('MRPHS','Zion');
INSERT INTO Orders VALUES(1,'FRNDO');
INSERT INTO Orders VALUES(2,'FRNDO');
INSERT INTO Orders VALUES(3,'KRLOS');
INSERT INTO Orders VALUES(4,'KRLOS');
INSERT INTO Orders VALUES(5,'KRLOS');
INSERT INTO Orders VALUES(6,'MRPHS');
INSERT INTO Orders VALUES(7,NULL);
 
试看看以上两个语句有什么不同,你就会发现很有趣的现象。
SELECT C.CustomerID,COUNT(O.OrderID) AS NumOrders
FROM Customers C
LEFT OUTER JOIN Orders O
ON C.CustomerID=O.CustomerID
WHERE C.City='Madrid'
GROUP BY C.CustomerID
HAVING COUNT(O.OrderID)<3
ORDER BY NumOrders;
SELECT C.CustomerID,COUNT(O.OrderID) AS NumOrders
FROM Customers C
LEFT OUTER JOIN Orders O
ON C.CustomerID=O.CustomerID
AND C.City='Madrid'
GROUP BY C.CustomerID
HAVING COUNT(O.OrderID)<3
ORDER BY NumOrders;
 
--Step1 ,首先对 FROM 后面的表进行笛卡尔乘积,生成虚表 STEP1
WITH STEP1
AS
(
SELECT C.CustomerID C_CustomerID,C.City C_City,O.OrderID O_OrderID,O.CustomerID O_CustomerID
FROM Customers C,Orders O
)
SELECT * FROM STEP1
 
--Step2 ,再次应用 ON 语句中的条件,如果没有外关联的话,这里的 ON 和 WHERE 实际上是没有什么差别的,生成虚表 STEP2
WITH STEP2
AS
(
SELECT C.CustomerID C_CustomerID,C.City C_City,O.OrderID O_OrderID,O.CustomerID O_CustomerID
FROM Customers C
JOIN Orders O
ON C.CustomerID=O.CustomerID
)
SELECT * FROM STEP2
 
--Step3 ,如果指定了 OUTER JOIN , SQL 会自动把 STEP2 表中未匹配的行作为外部行添加到 STEP3 中,此处找到了 CustomerID=FISSA,City=Madrid ,这个没有订单但又有相关名字的用户
WITH STEP3
AS
(
SELECT C.CustomerID C_CustomerID,C.City C_City,O.OrderID O_OrderID,O.CustomerID O_CustomerID
FROM Customers C
LEFT OUTER JOIN Orders O
ON C.CustomerID=O.CustomerID
)
SELECT * FROM STEP3
 
--Step4 ,应用 WHERE 条件,过滤不符合条件的记录
AS
(
SELECT C.CustomerID C_CustomerID,C.City C_City,O.OrderID O_OrderID,O.CustomerID O_CustomerID
FROM Customers C
LEFT OUTER JOIN Orders O
ON C.CustomerID=O.CustomerID
WHERE C.City='Madrid'
)
SELECT * FROM STEP4
 
--Step5 ,对以上的结果集进行分组
WITH STEP5
AS
(
SELECT C.CustomerID,COUNT(O.OrderID) AS NumOrders
FROM Customers C
LEFT OUTER JOIN Orders O
ON C.CustomerID=O.CustomerID
WHERE C.City='Madrid'
GROUP BY C.CustomerID
)
SELECT * FROM STEP5
 
--Step6 ,处理 CUBE 、 ROLLUP 之类的语句,此处无此需求
SELECT * FROM STEP6
 
--Step7 处理 Having 筛选器,与 WHERE 条件有些类似
WITH STEP7
AS
(
SELECT C.CustomerID,COUNT(O.OrderID) AS NumOrders
FROM Customers C
LEFT OUTER JOIN Orders O
ON C.CustomerID=O.CustomerID
WHERE C.City='Madrid'
GROUP BY C.CustomerID
HAVING COUNT(O.OrderID)<3
)
SELECT * FROM STEP7
 
--Step8 ,处理 SELECT 列表,即别名转换把 COUNT(O.OrderID) 转换成 NumOrders
SELECT * FROM STEP8
 
--Step9 ,应用 DISTINCT 语句,此处无此需求
SELECT * FROM STEP9
 
--Step10 ,应用 ORDER BY 语句进行排序
SELECT C.CustomerID,COUNT(O.OrderID) AS NumOrders
FROM Customers C
LEFT OUTER JOIN Orders O
ON C.CustomerID=O.CustomerID
WHERE C.City='Madrid'
GROUP BY C.CustomerID
HAVING COUNT(O.OrderID)<3
ORDER BY NumOrders
 
--Step11 ,执行 TOP 选项,此处无此需求
SELECT * FROM STEP11
 
 

关于SQLServer2005的学习笔记——SQL查询解析步骤相关推荐

  1. oracle SQL以结尾函数,Oracle学习笔记--SQL查询和SQL函数(转) -- 迷失de天空 -- 编程爱好者......

    A: 数据定义语言: 用于改变数据库结构,包括创建,修改,删除数据库对象 创建表: Create Table 表名 ( 列名 列类型, 列名 列类型, -- ) 例: Create Table ven ...

  2. Antlr4之简单的sql查询解析demo

    当前版本:jdk1.8.antlr4.8 1. 声明 当前内容主要为测试和使用Antlr4,并设计简单的SQL查询解析(本人解析IoTDB源码中发现其中使用了Antlr4来实现对sql执行的解析) 1 ...

  3. 大数据HiveSQL学习笔记三-查询基础语法以及常用函数

    大数据HiveSQL学习笔记三-查询基础语法以及常用函数 一.基础语法 1.SELECT -列名- FROM -表名- WHERE -筛选条件- 如:需要根据城市,性别找出匹配的10个用户 user_ ...

  4. Linux学习笔记---移植官方linux步骤(二)

    目录 修改网络驱动 修改 LAN8720 的复位 以及网络时钟 引脚驱动 修改fec1和fec2节点pinctrl-0属性 修改LAN8720A的PHY地址 修改 fec_main.c 文件 配置 L ...

  5. Linux学习笔记---移植官方linux步骤(一)

    使用的开发板是正点原子IMX6U-MINI  EMMC512M的开发板,这个板子也是移植的NXP官方linux,所以这里就直接从NXP官方的linux移植. 这里所说的移植,其实不是自己编写驱动文件等 ...

  6. Linux学习笔记---移植官方uboot步骤(二)

    在上一篇 Linux学习笔记---移植官方uboot步骤(一) 自己的uboot已经编译成功了,接下来继续移植LCD驱动和网络驱动. 修改LCD驱动 修改配置参数 打开my_uboot/board/f ...

  7. Linux学习笔记---移植官方uboot步骤(一)

    目录 编写shell脚本 修改MakeFile文件 重命名shell脚本 添加默认配置文件 修改默认配置文件 准备需要的板级文件夹 重命名.C文件 修改Makefile 修改imximage.cfg配 ...

  8. Qt学习笔记-SQL的基本操作【创建、查询、添加、索引等】

    程序运行截图如下: 代码如下: connection.h #ifndef CONNECTION_H #define CONNECTION_H#include <QMessageBox> # ...

  9. 小菜鸡的学习笔记——sql注入之sqli-lab边学边练

    结合sqli-lab靶场的sql注入学习笔记<持续更新> 第一关 Way1:字符型联合注入 Way2:报错型注入 第二关:get数值型联合注入 第三关:字符型闭合注入 第四关:字符型闭合注 ...

最新文章

  1. getdc 与getwindowDc的区别,loadbitmap 与loadimage的区别
  2. mysql约束深入了解_MySQL 的约束
  3. 如何兼容html在不同分辨力的问题,现代教育技术练习题
  4. python字符串取消转义_python取消转义,除了r还有什么?可以调用函数取消转义吗?...
  5. 顶社区创始人:解读顶社区的背后的事
  6. 1002:A+B 输入输出练习III 分数: 2
  7. atitit.导航的实现最佳实践and声明式编程
  8. 万稞pw80线切割编程软件_线切割的老司机们,你们知道绘图编程软件AUTOP是怎么来的吗?...
  9. 目标检测之FPN网络详解
  10. logistic回归分析优点_数据统计的理解和应用(十二)多因素logistic回归案例分析...
  11. Python版蚊子大作战源代码,超解压的灭蚊小游戏,多种道具
  12. 如何保证服装ERP项目成功施行
  13. centos7安装jdk1.8.0并配置JAVA_HOME环境变量
  14. JS中的debugger调试(谷歌浏览器)
  15. C语言实现将彩色BMP位图转化为二值图
  16. 如何做一个能赚钱的技术公众号?
  17. 由酷6员工猝死想到的:IT民工 我该拿什么拯救你
  18. linux服务器移动硬盘挂载,linux挂载命令mount及U盘、移动硬盘的挂载
  19. 如何隐藏并禁止查看U盘
  20. 【Python】字符串是如何比较大小的?

热门文章

  1. 大数据之-Hadoop_组成---大数据之hadoop工作笔记0013
  2. OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
  3. ASP.Net学习笔记001--ASP.Net简介1
  4. 随想录(hls加速技术)
  5. ucc编译器(入门)
  6. 嵌入式操作系统内核原理和开发(线程状态)
  7. 双模sa_七句话讲清NSA单模与SA+NSA双模手机的真实区别
  8. java窗体输入数据怎么存,java编程之计算矩阵对角线和(从对话窗体输入数据)...
  9. thinkphp5 异步调用方法_详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
  10. 河南省2020年计算机高考真题,2020年最新版对口高考试卷(计算机).docx