SQL嵌套语句执行顺序
首先我們要了解一下SQL語句的執行過程。?
SELECT 字段?
FROM 表名?
WHERE 條件表達式?
那它們是按什么順序執行呢?分析器會先看語句的第一個詞,當它發現第一個詞是SELECT關鍵字的時候,它會跳到FROM關鍵字,然后通過FROM關鍵字找到表名并把表裝入內存。接著是找WHERE關鍵字,如果找不到則返回到SELECT找字段解析,如果找到WHERE,則分析其中的條件,完成后再回到SELECT分析字段。最后形成一張我們要的虛表。?
其它的先不說了,只說WHERE。?
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)
?
?
http://blog.csdn.net/java166/article/details/4089728
轉載于:https://www.cnblogs.com/bulemaple/articles/2830996.html
總結
以上是生活随笔為你收集整理的SQL嵌套语句执行顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Perl,Python,Ruby,Jav
- 下一篇: win7下虚拟显示器完成记(virtua