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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:
最近一来因工作上的事情比较闹心,没心事再研究 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 
 




本文转自baoqiangwang51CTO博客,原文链接:http://blog.51cto.com/baoqiangwang/310463 ,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
10天前
|
SQL
sql语句加正则 简化查询
sql语句加正则 简化查询
14 0
sql语句加正则 简化查询
|
28天前
|
SQL
sql server链接查询
sql server链接查询
17 1
|
28天前
|
SQL
sql server简单查询
sql server简单查询
14 1
|
1月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
62 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
18天前
|
SQL 关系型数据库 MySQL
mysql一条sql查询出多个统计结果
mysql一条sql查询出多个统计结果
13 0
|
28天前
|
SQL
sql高级查询
sql高级查询
12 0
|
1月前
|
SQL 存储 数据可视化
10个高级的 SQL 查询技巧
10个高级的 SQL 查询技巧
|
4天前
|
人工智能 并行计算 PyTorch
Stable Diffusion 本地部署教程:详细步骤与常见问题解析
【4月更文挑战第12天】本教程详细介绍了如何在本地部署Stable Diffusion模型,包括安装Python 3.8+、CUDA 11.3+、cuDNN、PyTorch和torchvision,克隆仓库,下载预训练模型。配置运行参数后,通过运行`scripts/run_diffusion.py`生成图像。常见问题包括CUDA/CuDNN版本不匹配、显存不足、API密钥问题、模型加载失败和生成质量不佳,可按教程提供的解决办法处理。进阶操作包括使用自定义提示词和批量生成图像。完成这些步骤后,即可开始Stable Diffusion的AI艺术创作。
20 2
|
29天前
|
SQL 数据库
sql server高级查询,看这篇文章就够了
sql server高级查询,看这篇文章就够了
21 0
|
29天前
|
XML Java 数据格式
使用java解析XML文件的步骤
使用java解析XML文件的步骤
10 0

推荐镜像

更多