關於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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於SQLServer2005的學習筆記——子查詢SQLServer筆記
- 關於SQLServer2005的學習筆記(一)——前言SQLServer筆記
- 關於SQLServer2005的學習筆記——生日問題SQLServer筆記
- 關於SQLServer2005的學習筆記——分析函式SQLServer筆記函式
- 關於SQLServer2005的學習筆記——XML的處理SQLServer筆記XML
- 關於SQLServer2005的學習筆記——樹形結構SQLServer筆記
- JS開發步驟學習筆記JS筆記
- 關於SQLServer2005的學習筆記——自定義分組的實現SQLServer筆記
- 關於SQLServer2005的學習筆記——異常捕獲及處理SQLServer筆記
- 子查詢學習筆記1筆記
- MYSQL學習筆記26: 多表查詢|子查詢MySql筆記
- 關於MySQL8的WITH查詢學習MySql
- kettle學習筆記(四)——kettle輸入步驟筆記
- 關於SQLServer2005的學習筆記——臨時表、表變數和CTESQLServer筆記變數
- 關於SQLServer2005的學習筆記——多觸發器執行問題SQLServer筆記觸發器
- (MySQL學習筆記)分頁查詢MySql筆記
- MYSQL學習筆記25: 多表查詢(子查詢)[標量子查詢,列子查詢]MySql筆記
- 關於http(自己的學習筆記)HTTP筆記
- oracle學習筆記(十一) 高階查詢Oracle筆記
- 關於SQLServer2005的學習筆記——CTE遞迴和模擬測試資料SQLServer筆記遞迴
- 關於SQLServer2005的學習筆記——約束、Check、觸發器的執行順序SQLServer筆記觸發器
- swift 關於 toolbar 學習筆記Swift筆記
- SQL Server 資料庫查詢死鎖的處理步驟SQLServer資料庫
- Myth 關於Git的學習筆記Git筆記
- 資料庫查詢步驟資料庫
- mysql,where條件查詢等學習筆記MySql筆記
- 資料庫學習筆記之查詢表資料庫筆記
- Oracle學習筆記整理之日期查詢篇Oracle筆記
- MYSQL學習筆記24: 多表查詢(聯合查詢,Union, Union All)MySql筆記
- SQL學習筆記SQL筆記
- Oracle中SQL語句解析的步驟OracleSQL
- 第一個完整的spring查詢功能學習筆記【Spring工程學習筆記(二)】Spring筆記
- 學習SAP的步驟
- 學習java的步驟Java
- ES[7.6.x]學習筆記(十)聚合查詢筆記
- MYSQL學習筆記6: DQL條件查詢(where)MySql筆記
- MYSQL學習筆記8: DQL分組查詢(group by)MySql筆記
- SQL學習(三) 複雜查詢SQL