關於SQLServer2005的學習筆記——SQL查詢解析步驟
最近一來因工作上的事情比較鬧心,沒心事再研究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 |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6517/viewspace-624631/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JS開發步驟學習筆記JS筆記
- MYSQL學習筆記26: 多表查詢|子查詢MySql筆記
- 關於MySQL8的WITH查詢學習MySql
- kettle學習筆記(四)——kettle輸入步驟筆記
- (MySQL學習筆記)分頁查詢MySql筆記
- MYSQL學習筆記25: 多表查詢(子查詢)[標量子查詢,列子查詢]MySql筆記
- SQL Server 資料庫查詢死鎖的處理步驟SQLServer資料庫
- 關於http(自己的學習筆記)HTTP筆記
- Myth 關於Git的學習筆記Git筆記
- oracle學習筆記(十一) 高階查詢Oracle筆記
- 第一個完整的spring查詢功能學習筆記【Spring工程學習筆記(二)】Spring筆記
- SQL學習筆記SQL筆記
- 關於dataguard出現問題的檢查步驟
- SpringBoot學習筆記13——MybatisPlus條件查詢Spring Boot筆記MyBatis
- mysql,where條件查詢等學習筆記MySql筆記
- 資料庫學習筆記之查詢表資料庫筆記
- MYSQL學習筆記24: 多表查詢(聯合查詢,Union, Union All)MySql筆記
- SQL學習(三) 複雜查詢SQL
- Spring Data Jpa 的簡單查詢多表查詢HQL,SQL ,動態查詢, QueryDsl ,自定義查詢筆記SpringSQL筆記
- [PyTorch 學習筆記] 3.1 模型建立步驟與 nn.ModulePyTorch筆記模型
- MYSQL學習筆記6: DQL條件查詢(where)MySql筆記
- MYSQL學習筆記8: DQL分組查詢(group by)MySql筆記
- ES[7.6.x]學習筆記(十)聚合查詢筆記
- MySQL學習(三) SQL基礎查詢MySql
- SQL學習之子查詢,基於Oracle下的HR使用者(四)SQLOracle
- 大資料學習筆記之Hadoop安裝步驟詳解大資料筆記Hadoop
- 谷歌收錄批次查詢,谷歌收錄批次查詢的方法步驟谷歌
- spark學習筆記--Spark SQLSpark筆記SQL
- 《SQL 反模式》 學習筆記SQL模式筆記
- 關於django reset_framework學習之路的筆記DjangoFramework筆記
- Mybatis學習筆記 3:Mybatis 多種條件查詢MyBatis筆記
- MYSQL學習筆記11: DQL查詢執行順序MySql筆記
- T-SQL——關於跨庫連線查詢SQL
- 【學習】SQL基礎-007-子查詢SQL
- 關於SQL server2008除錯儲存過程的完整步驟SQLServer除錯儲存過程
- 深度學習學習7步驟深度學習
- XML學習筆記(一):關於字元編碼的理解XML筆記字元
- 關於網路安全的逆向分析方向學習筆記筆記
- MyBatis學習筆記(四)使用map實現查詢和插入MyBatis筆記