SQL 不同於與其他程式語言的最明顯特徵是處理程式碼的順序。在大數程式語言中,程式碼依編碼順序被處理,但是在SQL語言中,第一個被處理的子句是FROM子句,儘管SELECT語句第一個出現,但幾乎總是最後被處理。
每個步驟都會產生虛擬表,該虛擬表被用作下一個步驟的輸入。這些虛擬表對呼叫者(客戶端應用程式或外部查詢)不可用。只是最後一步產生的表才會回傳 給呼叫者。如果沒有在查詢中指定某一子句,將會跳過對應的步驟。以下是應用於SQL server 2000和SQL Server 2005的各個邏輯步驟的簡單描述。
Code highlighting produced by Actipro CodeHighlighter (freeware)
-->(8)SELECT (9)DISTINCT (11)
#'
(10 )ORDER BY
邏輯查詢處理階段簡介 (執行順序)
FROM:對FROM子句中的前兩個表格執行笛卡爾積(Cartesian product)(交叉連結),產生虛擬表VT1
ON:對VT1應用ON篩選器。只有那些使
OUTER(JOIN):如果指定了OUTER JOIN(相對於CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部聯接把左表標記為保留表,右外部聯結右表標記為保留表,完全外部聯接把兩個表都標記為保留表)中未找到匹配的行將作為外部行添加到VT2,生成VT3.如果FROM子句包含兩個以上的表,則對上一個聯接產生的結果表和下一個表重複執行步驟1到步驟3,直到處理完所有的表為止。 # GROUP BY:按GROUP BY子句中的列列表對VT4中的行分組,產生VT5.
CUBE|ROLLUP:將超組(Suppergroups)插入VT5,產生VT6.
HAVING:對VT6應用HAVING篩選器。
ORDER BY:將VT9中的行依ORDER BY 子句中的列列表排序,產生遊標(VC10).
TOP:從VC10的開始處選擇指定數量或比例的行,產生表VT11,並回傳呼叫者。的列別名的步驟。集合,成員的順序無關緊要。
##as
select *
from orders
order by orderid
在SQL中,表格運算式中不允許使用帶有ORDER BY子句的查詢,而在T—SQL中卻有一個例外(應用TOP選項)。
所以要記住,不要為表格中的行假設任何特定的順序。換句話說,除非你確定要有序行,否則不要指定ORDER BY 子句。排序是需要成本的,SQL Server需要執行有序索引掃描或使用排序運行符。
以上是Sql的執行流程說明的詳細內容。更多資訊請關注PHP中文網其他相關文章!