SQL Server 查詢處置中的各個階段(SQL履行次序)示例。本站提示廣大學習愛好者:(SQL Server 查詢處置中的各個階段(SQL履行次序)示例)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server 查詢處置中的各個階段(SQL履行次序)示例正文
在年夜數編程說話中,代碼按編碼次序被處置,然則在SQL說話中,第一個被處置的子句是FROM子句,雖然SELECT語句第一個湧現,然則簡直老是最初被處置。
每一個步調都邑發生一個虛擬表,該虛擬表被用作下一個步調的輸出。這些虛擬表對換用者(客戶端運用法式或許內部查詢)弗成用。只是最初一步生成的表才會前往 給挪用者。假如沒有在查詢中指定某一子句,將跳過響應的步調。上面是對運用於SQL server 2000和SQL Server 2005的各個邏輯步調的簡略描寫。
(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_condition>
(10)ORDER BY <order_by_list>
邏輯查詢處置階段簡介
1.FROM:對FROM子句中的前兩個表履行笛卡爾積(Cartesian product)(穿插聯接),生成虛擬表VT1
2.ON:對VT1運用ON挑選器。只要那些使<join_condition>為真的行才被拔出VT2。
3.OUTER(JOIN):如 果指定了OUTER JOIN(絕對於CROSS JOIN 或(INNER JOIN),保存表(preserved 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挑選器。只要使<having_condition>為true的組才會被拔出VT7.
8.SELECT:處置SELECT列表,處置各類聚積函數,並發生VT8.
9.DISTINCT:將反復的行從VT8中移除,發生VT9.
10.ORDER BY:將VT9中的行按ORDER BY 子句中的列列表排序,生成游標(VC10).
11.TOP:從VC10的開端處選擇指定命量或比例的行,生成表VT11,並前往挪用者。
注:步調10,按ORDER BY子句中的列列表排序上步前往的行,前往游標VC10.這一步是第一步也是獨一一步可使用SELECT列表中的列別號的步調。這一步分歧於其它步調的 是,它不前往有用的表,而是前往一個游標。SQL是基於聚集實際的。聚集不會事後對它的行排序,它只是成員的邏輯聚集,成員的次序可有可無。對表停止排序 的查詢可以前往一個對象,包括按特定物理次序組織的行。ANSI把這類對象稱為游標。懂得這一步是准確懂得SQL的基本。
由於這一步不前往表(而是前往游標),應用了ORDER BY子句的查詢不克不及用作表表達式。表表達式包含:視圖、內聯表值函數、子查詢、派生表和共用表達式。它的成果必需前往給希冀獲得物理記載的客戶端運用法式。例如,上面的派生表查詢有效,並發生一個毛病:
select *
from(select orderid,customerid from orders order by orderid)
as d
上面的視圖也會發生毛病
create view my_view
as
select *
from orders
order by orderid
毛病信息: Msg 1033, Level 15, State 1, Procedure my_viewasselect, Line 2The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries,and common table expressions, unless TOP or FOR XML is also specified. 在SQL中,表表達式中不許可應用帶有ORDER BY子句的查詢,而在T—SQL中卻有一個破例(運用TOP選項)。
所以要記住,不要為表中的行假定任何特定的次序。換句話說,除非你肯定要有序行,不然不要指定ORDER BY 子句。排序是須要本錢的,SQL Server須要履行有序索引掃描或應用排序運轉符。
推舉一段SQL代碼:行列轉置
/*成績:假定有張先生成就表(tb)以下:
姓名 課程 分數
張三 語文 74
張三 數學 83
張三 物理 93
李四 語文 74
李四 數學 84
李四 物理 94
想釀成(獲得以下成果):
姓名 語文 數學 物理
---- ---- ---- ----
李四 74 84 94
張三 74 83 93
-------------------
*/
create table tb(姓名 varchar(10),課程 varchar(10),分數 int)
insert into tb values('張三' , '語文' , 74)
insert into tb values('張三' , '數學' , 83)
insert into tb values('張三' , '物理' , 93)
insert into tb values('李四' , '語文' , 74)
insert into tb values('李四' , '數學' , 84)
insert into tb values('李四' , '物理' , 94)
go
--SQL SERVER 2000 靜態SQL,指課程只要語文、數學、物理這三門課程。(以下同)
select 姓名 as 姓名 ,
max(case 課程 when '語文' then 分數 else 0 end) 語文,
max(case 課程 when '數學' then 分數 else 0 end) 數學,
max(case 課程 when '物理' then 分數 else 0 end) 物理
from tb
group by 姓名