1. 程式人生 > >SQL Select查詢原理--查詢語句執行原則(基礎)

SQL Select查詢原理--查詢語句執行原則(基礎)

1.單表查詢:根據WHERE條件過濾表中的記錄,形成中間表(這個中間表對使用者是不可見的);然後根據SELECT的選擇列選擇相應的列進行返回最終結果。

SELECT 欄位   
FROM 表名   
WHERE 條件表示式  

那它們是按什麼順序執行呢?
分析器會先看語句的第一個詞,當它發現第一個詞是SELECT關鍵字的時候,它會跳到FROM關鍵字,然後通過FROM關鍵字找到表名並把表裝入記憶體。接著是找WHERE關鍵字,如果找不到則返回到SELECT找欄位解析,如果找到WHERE,則分析其中的條件,完成後再回到SELECT分析欄位。最後形成一張我們要的虛表。
WHERE關鍵字後面的是條件表示式。如果學過C語言等程式語言就會知道,條件表示式計算完成後,會有一個返回值,即非0或0,非0即為真(true),0即為假(false)。同理WHERE後面的條件也有一個返回值,真或假,來確定接下來執不執行SELECT。

2.相關子查詢的執行順序

SELECT Sname   
FROM Student   
WHERE EXISTS   
(SELECT *   
FROM SC   
WHERE SC.Sno = Student.Sno AND SC.Cno = '1');  

這是一個SQL語句的巢狀使用,但和上面說的SQL語句的執行過程也是相同的。巢狀的意思也就是說當分析主SQL語句(外面的那個SELECT)到WHERE關鍵字的時候,又進入了另一個SQL語句中。那麼也就是說,分析器先找到表Student並裝入記憶體,一個指標(例如p1)指向Student表中的第一條記錄。然後進入WHERE裡分析裡面的SQL語句,再把SC表裝入記憶體,另一個指標(例如p2)指向SC表中的第一條記錄,分析WHERE後面的條件表示式,依次進行分析,最後分析出一個虛表2,也就變成

SELECT Sname   
FROM Student   
WHERE EXISTS 虛表2  

如果虛表為空表,EXISTS 虛表2 也就為false,不返回到SELECT,而p1指向下一條記錄。如果虛表2不為空也就是有記錄,那麼EXISTS 虛表2 為true同,返回到SELECT並把p1指向的記錄新增到主SQL語句的虛表1當中。(這也是為什麼巢狀的SQL語句SELECT 後面為一般為 星號 的原因,因為它EXISTS返回的只是真或假,欄位的名沒有意義,用*星號 就行,當然用別的也不會錯。 )

注意,這裡雖然巢狀的SQL語句分析完了,但主SQL語句只執行了一遍,也就是說p1指向Student的第一條記錄,p1還要再指向Student表的下一條記錄並分析,這樣又進入了巢狀中的SQL語句,同上面說的一樣分析。當p1也到了Student表的結尾,整個SQL語句結束。返回虛表1Sname這一列。