1. 程式人生 > >SQL入門之SQL關鍵詞的執行順序

SQL入門之SQL關鍵詞的執行順序

SQL(Structured Query Language)結構化查詢語言執行,在我剛接觸的時候始終不明白它的執行順序因為它並不是按照我們寫的那樣執行,當了解了它的執行順序後感覺寫起來也清晰多了。

 (8)SELECT (9)DISTINCT (11)<TOP NUM><SELECT LIST>
 (1)FROM [LEFT_TABLE]
 (3)<JOIN_TYPE> JOIN <RIGHT_TABLE>
 (2)ON <JOIN_CONDITION>
 (4)WHERE <WHERE_CONDITION>
 (5)GROUP BY <GROUP_BY_LIST>
 (6)WITH <CUBE | ROLLUP>
 (7)HAVING <HAVING_CONDITON>
 (10)ORDER BY <ORDER_BY_LIST>
  1. FROM : 對於FROM子句中的前兩個表執行笛卡爾積(A_TABLE*B_TABLE)交叉連線,生成虛擬表VT1
  2. ON:對VT1應用ON篩選器。只有那些使<join_condition>真的行才被插入VT2.
  3. OUTER(JOIN) : 如果指定了OUTER JOIN 或(INNER JOIN),保留表(perserved table : 左外連結把左表標記為保留表,右外連結包右表標記為保留表,全外連線把兩個表都標記為保留表)中未找到匹配的行將作為外部行新增到VT2,生成VT3.如果FROM子句包含兩個以上的表,則對上一個連結生成的結果表和下個表重複執行步驟1到步驟3,直到處理完所有表為止。
  4. WHERE :對VT3應用where篩選器。只有<where_condition>為true的行才被插入VT4.
  5. GROUP BY : 按照group by 子句中的列列表對VT4中的行進行分組,生成VT5.
  6. CUBE | ROLLUP : 把超組(suppergroups)插入VT5,生成VT6.
  7. HAVING : 對VT6應用篩選器。只有<having_condition>為true的組才會被插入VT7.
  8. SELECT : 處理SELECT列表,產生VT8.
  9. DISTINCT : 將重複的行從VT8中移除,產生VT9.
  10. ORDER BY : 將VT9中的行按order by子句中的列列表排序,生成遊標(類似序列號)(VC10)
    __注意:該步驟是第一步也是唯一一步可以使用SELECT列表中的列別名的步驟。這一步驟區別於其他步驟的是該 步驟返回的不是有效的表而是返回一個遊標。SQL是基於集合理論的。集合理論不會預先對它進行排序,它只是成員的邏輯集合,成員的順序無關緊要。對錶進行排序的查詢可以返回一個物件,包含按特定物理順序組織的行。ANSI把這種物件成為遊標。因為這一步不返回表(而是返回遊標),所以使用了ORDER BY 子句的查詢不能用作 表表達式內聯表值函式、子查詢、派生表和共用表示式) 如:select * from (select id , name from stu order by orderid(返回的不是表而是遊標)) as t 該語句將丟擲錯誤 __
  11. TOP:從VC10的開始處選擇指定數量或比例的行,生成表VT11,並返回呼叫者。