关于SQLServer2005的学习笔记——SQL查询解析步骤
来源:互联网 发布:win10 tensorflow 编辑:程序博客网 时间:2024/05/17 22:19
先从最简单的 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
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/baoqiangwang/archive/2010/01/08/5155423.aspx
- 关于SQLServer2005的学习笔记——SQL查询解析步骤
- 关于SQLServer2005的学习笔记——SQL查询解析步骤
- 关于SQLServer2005的学习笔记——SQL查询解析步骤
- 关于SQLServer2005的学习笔记——子查询
- 关于SQLServer2005的学习笔记——XML的处理
- 关于SQLServer2005的学习笔记——XML的处理
- 关于SQLServer2005的学习笔记——XML的处理
- 关于SQLServer2005的学习笔记——XML的处理
- 关于SQLServer2005的学习笔记(一)——前言
- 关于SQLServer2005 的学习笔记(一)——前言
- 关于SQLServer2005的学习笔记——分析函数
- 关于SQLServer2005的学习笔记——树形结构问题
- 关于SQLServer2005的学习笔记——生日问题
- 关于SQLServer2005的学习笔记——生日问题
- 关于SQLServer2005的学习笔记——系统触发器
- 关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序
- 关于SQLServer2005的学习笔记——约束、Check、触发器的执行顺序
- 关于SQLServer2005的学习笔记——自定义分组的实现
- oracle全文索引之停用词的通配符功能
- Struts 从零开始 三、连接数据库实例
- 怎么解决:不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接。?
- 随即选择文章例子
- 不错的关于Oracle 全文索引的文章
- 关于SQLServer2005的学习笔记——SQL查询解析步骤
- 常用的Windows PowerShell 命令
- 错误处理(Error-Handling):为何、何时、如何(rev#2)
- Statement 的 execute(sql) 方法的返回值
- 收集常用正则表达式
- 安新家了
- adb 的使用
- 《Java面向对象编程》—数组的相关事项
- 《Programming ASP.NET》(中文版)笔记一——第四章:基本控件