SQL Select查詢原理--查詢語句執行原則(基礎)
原文地址:點擊打開鏈接
1.單表查詢:根據WHERE條件過濾表中的記錄,形成中間表(這個中間表對用戶是不可見的);然後根據SELECT的選擇列選擇相應的列進行返回最終結果。
1)簡單的單表查詢
SELECT 字段 FROM 表名 WHERE 條件表達式
那它們是按什麼順序執行呢?分析器會先看語句的第一個詞,當它發現第一個詞是SELECT關鍵字的時候,它會跳到FROM關鍵字,然後通過FROM關鍵字找到表名並把表裝入內存。接著是找WHERE關鍵字,如果找不到則返回到SELECT找字段解析,如果找到WHERE,則分析其中的條件,完成後再回到SELECT分析字段。最後形成一張我們要的虛表。
WHERE關鍵字後麵的是條件表達式。如果學過C語言等編程語言就會知道,條件表達式計算完成後,會有一個返回值,即非0或0,非0即為真(true),0即為假(false)。同理WHERE後麵的條件也有一個返回值,真或假,來確定接下來執不執行SELECT。
例:
SELECT * FROM STUDENT WHERE SNO = '1';
分析器先找到關鍵字SELECT,然後跳到FROM關鍵字將STUDENT表導入內存,並通過指針p1找到第一條記錄,接著找到WHERE關鍵字計算它的條件表達式,如果為真那麼把這條記錄裝到一個虛表當中,p1再指向下一條記錄。如果為假那麼p1直接指向下一條記錄,而不進行其它操作。一直檢索完整個表,並把虛表返回給用戶。
再說EXISTS謂詞,EXISTS謂詞也是條件表達式的一部分。當然它也有一個返回值(true或false)。
例:
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這一列。
嵌套就像:
for(int i = 0,i < n, ++i) for(int j = 0, j < n, ++j)
2,兩表連接查詢:對兩表求積(笛卡爾積)並用ON條件和連接連接類型進行過濾形成中間表;然後根據WHERE條件過濾中間表的記錄,並根據SELECT指定的列返回查詢結果。
3.多表連接查詢:先對第一個和第二個表按照兩表連接做查詢,然後用查詢結果和第三個表做連接查詢,以此類推,直到所有的表都連接上為止,最終形成一個中間的結果表,然後根據WHERE條件過濾中間表的記錄,並根據SELECT指定的列返回查詢結果.
4.不同類型的連接查詢什麼時候用
查兩表關聯列相等的數據用內連接。
左表的連接列是右表的子集時用右外連接。
右表的連接列是左表的子集時用左外連接。
左表的連接列和右表的連接列彼此有交集但彼此互不為子集時候用全外。
求差操作的時候用聯合查詢。
多個表查詢的時候,這些不同的連接類型可以寫到一塊。
ON隻進行連接操作,WHERE隻過濾中間表的記錄
拓展:點擊打開鏈接
最後更新:2017-04-03 16:49:18