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

如果虛表2爲空, EXISTS 虛表2也就爲false, 不返回到SELECT, 而p1指向下一條記錄. 如果虛表2非空, 也就是有記錄, 那麼EXISTS 虛表2爲true, 返回到SELECT並把p1指向的那條記錄添加進主SQL語句的虛表1當中. (這也是爲什麼嵌套的SQL語句SELECT後面一般爲*的原因, 因爲它EXISTS返回的 只是true或false, 字段名沒有意義, 用*就可以, 當然用別的也不會錯.)

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

嵌套就像:

for(int i= 0; i < m; i ++){
    for(int j = 0; j < n; j ++){
    }
}

April 9th, 2016

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章