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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:
最近一来因工作上的事情比较闹心,没心事再研究 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
相关文章
|
9天前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
52 3
|
10天前
|
SQL 监控 数据库
SQL数据库还原详解:步骤、方法与实践指南c1b.0335pw.com
在现代信息技术的浪潮中,数据库管理系统(DBMS)已成为各类组织和企业不可或缺的核心组件。随着数据的不断积累和业务需求的日益增长,数据库的备份与还原成为了确保数据安全与业务连续性的重要手段。本文将深入探讨SQL数据库还原的各个方面,帮助读者理解并掌握数据库还原的核心概念、步骤和方法。一、数据库还原概
|
3天前
|
SQL 监控 数据库
SQL语句是否都需要解析及其相关技巧和方法
在数据库管理中,SQL(结构化查询语言)语句的使用无处不在,它们负责数据的查询、插入、更新和删除等操作
|
10天前
|
SQL 网络安全 数据库
机房电脑下载并安装SQL Server的详细步骤
在机房电脑上下载并安装SQL Server是一个常见的任务,特别是对于学习数据库管理或进行相关项目开发的学生和开发者来说
|
11天前
|
SQL Oracle 关系型数据库
SQL如何添加字段记录:详细步骤与技巧
在数据库管理中,经常需要向已有的表中添加新的字段(列)或向表中插入新的记录
|
11天前
|
SQL 存储 缓存
SQL计算班级语文平均分:详细步骤与技巧
在数据库管理和分析中,经常需要计算某个班级在特定科目上的平均分
|
11天前
|
SQL 存储 数据库
SQL语句是否都需要解析及其相关技巧与方法
在数据库管理系统中,SQL(Structured Query Language)语句作为与数据库交互的桥梁,其执行过程往往涉及到一个或多个解析阶段
|
3天前
|
SQL 数据可视化 BI
SQL语句及查询结果解析:技巧与方法
在数据库管理和数据分析中,SQL语句扮演着至关重要的角色
|
9天前
|
SQL 监控 关系型数据库
SQL错误代码1303解析与处理方法
在SQL编程和数据库管理中,遇到错误代码是常有的事,其中错误代码1303在不同数据库系统中可能代表不同的含义
|
9天前
|
SQL 存储 关系型数据库
SQL默认索引是什么:深入解析与技巧
在SQL数据库中,索引是一种用于提高查询性能的重要数据结构

推荐镜像

更多