最近一来因工作上的事情比较闹心,没心事再研究
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
之类的语句,此处无此需求
--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
--Step9
,应用
DISTINCT
语句,此处无此需求
--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
选项,此处无此需求
分享到:
相关推荐
SQL Server 2005深入内幕——开发人员,最大的赢家:SQL Server 2005全新的开发特性.pdf
笔记是本人学习SQLServer一段时间后重新整理出来的,适合有一些入门基础的人学习。 ├─01 安装及使用 │ SQLServer2005安装及使用.txt │ ├─02 常用函数 │ function.sql │ ├─03 建表、建库 │ create.sql ...
SQL server 2008
资源名称:SQL Server 2012王者归来——基础、安全、开发及性能优化内容简介:本书由浅入深,全面细致地讲述了SQL Server 2012的功能特性和开发应用。从SQL Server数据库基础到数据库安全,再到SQL Server开发及...
sql server 2005学习笔记之触发器 很全 说的很详细
SQL SERVER 2008 学习笔记:日常维护、深入管理、性能优化。
SQL server 2005 学习笔记,完全适合新手从最基础开始学习!
sql server 2005学习笔记,word文档形式!
sqlserver个人学习笔记
这个学习笔记是观看郝斌老师的视频自己的一点心得
Sql Server——Sql性能优化Sql Server——Sql性能优化Sql Server——Sql性能优化Sql Server——Sql性能优化Sql Server——Sql性能优化Sql Server——Sql性能优化Sql Server——Sql性能优化Sql Server——Sql性能优化
SQLserver 数据库学习笔记 欢迎大家下载学习,共同进步啊
sql server 2000完全实战——数据转换报务(dts)
学习sql server 和sql 的两本经典的著作: 《sql server 2005 技术内幕 T-SQL查询》 《sql server 2005 技术内幕 T-SQL程序设计》 网上大多的资源都是英文的,好容易找到中文的了,上传上来和大家分享。 这两本书都...
Microsoft SQL Server 2005 Backward Compatibility Components (Microsoft SQL Server 2005 向后兼容组件) SQL Server Backward Compatibility 包中包含 最新版本的 Data Transformation Services 2000 运行时 ...
SQL Server 2008 学习笔记
sqlserver2005学习笔记之触发器简介.pdf
Oracle SQLServer数据库 留在备用 培训资料
连接SQL SERVER 2005/2008失败——解决方案
SQL Server 2008存储结构——GAM和SGAM、PFS结构、IAM结构、DCM&BCM;