SQLSERVER SELECT(zt)

zhouwf0726發表於2019-03-23

今天查詢SQLSERVER的HINTS的時候找到的文件,寫得比較詳細,記錄一下。

http://www.cndw.com/tech/data/2006041339438.asp


本節講述SELECT 語句完整的語法結構,這是一個非常冗長、枯燥的過程。讀者可以跳過本節,從第二節開始閱讀,而將本節作為理解、編寫查詢語句的語法參考資料。 SELECT 語句完整的語法結構如下:
SELECT statement ::=

[ ORDER BY { order_by_expression | column_position [ ASC | DESC ] } [,...n] ]
[ COMPUTE { { AVG | COUNT | MAX | MIN | SUM } (expression) } [,...n]
[ BY expression [,...n] ] ]
[ FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }
[ , XMLDATA ]
[ , ELEMENTS ]
[ , BINARY base64 ] }
[ OPTION ( [,...n]) ]
::=
{ | () }
[UNION [ALL] ) [...n] ]
::=
SELECT [ ALL | DISTINCT ]
[ {TOP integer | TOP integer PERCENT} [ WITH TIES] ]

[ INTO new_table ]
[ FROM {} [,...n] ]
[ WHERE ]
[ GROUP BY [ALL] group_by_expression [,...n]
[ WITH { CUBE | ROLLUP } ] ]
[ HAVING ]
由於SELECT 語句特別複雜,上述結構還不能完全說明其用法,因此我們將它拆分為若干部分來講述。

10.1.1 SELECT 子句
SELECT 子句指定需要通過查詢返回的表的列,其語法如下:
SELECT [ ALL | DISTINCT ]
[ TOP n [PERCENT] [ WITH TIES] ]

::=
{ *
| { table_name | view_name | table_alias }.*
| { column_name | expression | IDENTITYCOL | ROWGUIDCOL }
[ [AS] column_alias ]
| column_alias = expression
} [,...n]
各引數說明如下:

  • ALL
    指明查詢結果中可以顯示值相同的列。ALL 是系統預設的。
  • DISTINCT
    指明查詢結果中如果有值相同的列,則只顯示其中的一列。對DISTINCT 選項來說, Null 值被認為是相同的值。
  • TOP n [PERCENT]
    指定返回查詢結果的前n 行資料。如果PERCENT 關鍵字指定的話,則返回查詢結果的前百分之n 行資料。
  • WITH TIES
    此選項只能在使用了ORDER BY 子句後才能使用當指定此項時,除了返回由TOP n (PERCENT) 指定的資料行外,還要返回與TOP n (PERCENT) 返回的最後一行記錄中由ORDER BY 子句指定的列的列值相同的資料行。
  • select_list
    select_list 是所要查詢的表的列的集合,多個列之間用逗號分開。
  • * 萬用字元,返回所有物件的所有列。
  • table_name | view_name | table_alias.*
    限制萬用字元*的作用範圍。凡是帶*的項,均返回其中所有的列。
  • column_name
    指定返回的列名
  • expression
    表示式可以為列名、常量、函式或它們的組合。
  • IDENTITYCOL
    返回IDENTITY 列。如果FROM 子句中有多個表含有IDENTITY 列,則在IDENTTYCOL 選項前必須加上表名,如Table1.IDENTITYCOL。
  • ROWGUIDCOL
    返回表的ROWGUIDCOL 列。同IDENTITYCOL 選項相同,當要指定多個ROWGUIDCOL 列時,選項前必須加上表名,如Table1. ROWGUIDCOL。
  • column_alias
    在返回的查詢結果中用此別名替代列的原名。column_alias 可用於ORDER BY 子句,但不能用於WHERE GROUP BY 或HAVING 子句如果查詢是遊標宣告命令DECLARE CURSOR 的一部分,則column_alias 還不能用於FOR UPDATE 子句(有關遊標的介紹請參見“遊標和檢視”章節)。

10.1.2 INTO 子句
INTO 子句用於把查詢結果存放到一個新建的表中。SELECT...INTO 句式不能與COMPUTE 子句一起使用。其語法如下:
INTO new_table
引數new_table 指定了新建的表的名稱。新表的列由SELECT 子句中指定的列構成,新表中的資料行是由WHERE 子句指定的。但如果SELECT 子句中指定了計算列,在新表中對應的列則不是計算列,而是一個實際儲存在表中的列,其中的資料由執行SELECT...INTO 語句時計算得出。如果資料庫的“Select into/bulk copy” 選項設定為“True/On”,則可以用INTO 子句建立表和臨時表,反之,則只能建立臨時表。

10.1.3 FROM 子句
FROM 子句指定需要進行資料查詢的表。只要SELECT 子句中有要查詢的列,就必須使用FROM 子句。其語法如下:
FROM {} [,...n]
::=
table_name [ [AS] table_alias ] [ WITH ( [,...n]) ]
| view_name [ [AS] table_alias ]
| rowset_function [ [AS] table_alias ]
| OPENXML
| derived_table [AS] table_alias [ (column_alias [,...n] ) ]
|
::=
ON
| CROSS JOIN
|
::=
[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]
[ ]
JOIN
各引數說明如下:

  • table_source
    指明SELECT 語句要用到的表、檢視等資料來源。
  • table_name [ [AS] table_alias ]
    指明表名和表的別名。
  • view_name [ [AS] table_alias ]
    指明檢視名稱和檢視的別名。
  • rowset_function [ [AS] table_alias ]
    指明行統計函式和統計列的名稱。
  • OPENXML
    提供一個XML 文件的行集合檢視。
  • WITH (
    [,...n])
    指定一個或多個表提示。通常SQL Server 的查詢優化器會自動選取最優執行計劃,除非是特別有經驗的使用者,否則最好不用此選項。關於表提示table_hint 的設,定請參見下一章的“刪除資料”部分。
  • derived_table [AS] table_alias
    指定一個子查詢,從資料庫中返回資料行。
  • column_alias
    指明列的別名,用以替換查詢結果中的列名。
  • joined_table
    指定由連線查詢生成的查詢結果。有關連線與連線查詢的介紹參見本章的相關章節。
  • join_type
    指定連線查詢操作的型別。
  • INNER
    指定返回兩個表中所有匹配的行。如果沒有join_type 選項,此選項就為系統預設。
  • LEFT [OUTER]
    返回連線查詢左邊的表中所有的相應記錄,而右表中對應於左表無記錄的部分,用NULL 值表示。
  • RIGHT [OUTER]
    返回連線查詢右邊的表中所有的相應記錄,而左表中對應於右表無記錄的部分,用NULL 值表示。
  • FULL [OUTER]
    返回連線的兩個表中的所有記錄。無對應記錄的部分用NULL 值表示。
  • join_hint
    指定一個連線提示或運演算法則。如果指定了此選項,則INNER LEFT RIGHT 或FULL選項必須明確指定。通常SQL Server 的查詢優化器會自動選取最優執行計劃,除非是特別有經驗的使用者,否則最好不用此選項。
    join_hint 的語法如下:
    ::= { LOOP | HASH | MERGE | REMOTE }
    其中LOOP | HASH | MERGE 選項指定查詢優化器中的連線是迴圈、雜湊或合併的。REMOTE 選項指定連線操作由右邊的表完成。當左表的資料行少於右表,才能使用REMOTE 選項。當左表和右表都是本地表時,此選項不必使用。
  • JOIN
    指明特定的表或檢視將要被連線。
  • ON
    指定連線的條件。
  • CROSS JOIN
    返回兩個表交叉查詢的結果。
10.1.4 WHERE 子句
WHERE 子句指定資料檢索的條件,以限制返回的資料行。其語法如下:
WHERE |
::=
column_name { *= | =* } column_name
各引數說明如下:
search_condition
通過由謂詞構成的條件來限制返回的查詢結果。
old_outer_join
指定一個外連線。此選項是不標準的,但使用方便。它用“*=” 操作符表示左連線,用“=*” 操作符表示右連線。此選項與在FROM 子句中指定外連線都是可行的方法,但二者只能擇其一。

注意:如果在WHERE子句中指定一個值為FALSE的條件,則可以用SELECT...INTO語句來建立一個表名不同,但結構和資料型別均和原表相同的表。

10.1.5 GROUP BY 子句
GROUP BY 子句指定查詢結果的分組條件。其語法如下;
GROUP BY [ALL] group_by_expression [,...n]
[ WITH { CUBE | ROLLUP } ]
各引數說明如下:

  • ALL
    返回所有可能的查詢結果組合,即使此組合中沒有任何滿足WHERE 子句的資料。分組的統計列如果不滿足查詢條件,則將由NULL 值構成其資料。ALL 選項不能與CUBE或ROLLUP 選項同時使用。
    GROUP BY ALL is not supported in queries that access remote tables.
  • group_by_expression
    指明分組條件。group_by_expression 通常是一個列名,但不能是列的別名。資料型別為TEXT、 NTEXT、 IMAGE 或BIT 型別的列不能作為分組條件。
  • CUBE
    除了返回由GROUP BY 子句指定的列外,還返回按組統計的行。返回的結果先按分組的第一個條件列排序顯示,再按第二個條件列排序顯示以此類推。統計行包括了GROUPBY 子句指定的列的各種組合的資料統計。
  • ROLLUP
    與CUBE 不同的是,此選項對GROUP BY 子句中的列順序敏感,它只返回第一個分組條件指定的列的統計行。改變列的順序會使返回的結果的行數發生變化。

使用Distinct選項的統計函式,如AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、和SUM(DISTINCT column_name)等,不能在使用CUBE或ROLLUP選項時使用。

10.1.6 HAVING 子句
HAVING 子句指定分組搜尋條件。HAVING 子句通常與GROUP BY 子句一起使用。TEXT、 NTEXT 和IMAGE 資料型別不能用於HAVING 子句。其語法如下:
HAVING
HAVING 子句與WHERE 子句很相似,其區別在於其作用的物件不同。WHERE 子句作用於表和檢視,HAVING 子句作用於組。

10.1.7 UNION 操作符
UNION 操作符將兩個或兩個以上的查詢結果合併為一個結果集。它與使用連線查詢合併兩個表的列是不同的。使用UNION 操作符合並查詢結果需要遵循兩個基本規則:

  • 列的數目和順序在所有查詢中必須是一致的;
  • 資料型別必須相容。
    其語法如下:
    | ()
    UNION [ALL]
    )
    [UNION [ALL] ) [...n] ]
    各引數說明如下:
  • | ()
    指明查詢的詳細說明或查詢表示式。
  • UNION
    合併操作符。
  • ALL
    合併所有資料行到結果中,包括值重複的資料行。如果不指定此選項,則重複的資料行只顯示一行。

10.1.8 ORDER BY 子句

ORDER BY 子句指定查詢結果的排序方式。其語法如下:
ORDER BY {order_by_expression [ ASC | DESC ] } [,...n]
各引數說明如下:

  • order_by_expression
    指定排序的規則。order_by_expression 可以是表或檢視的列的名稱或別名。如果SELECT 語句中沒有使用DISTINCT 選項或UNION 操作符。那麼ORDER BY 子句中可以包含select list 中沒有出現的列名。或別名ORDER BY 子句中也不能使用TEXT、 NTEXT 和 IMAGE 資料型別。
  • ASC
    指明查詢結果按升序排列。這是系統預設值。
  • DESC
    指明查詢結果按降序排列。
    注意:Null值被作為最小的值。

10.1.9 COMPUTE 子句
COMPUTE 子句在查詢結果的末尾生成一個彙總資料行。其語法如下:
COMPUTE
{ { AVG | COUNT | MAX | MIN | STDEV | STDEVP |VAR | VARP | SUM }
(expression) } [,...n]
[ BY expression [,...n] ]
各引數說明如下:
AVG | COUNT | MAX | MIN | STDEV | STDEVP | VAR | VARP | SUM()以上引數與對應的函式有相同的含義。這些函式均會忽略NULL 值,且DISTINCT選項不能在此使用。
expression
指定需要統計的列的名稱。此列必須包含於SELECT 列表中,且不能用別名。COMPUTE子句中也不能使用TEXT、 NTEXT 和IMAGE 資料型別。
BY expression
在查詢結果中生成分類統計的行。如果使用此選,項則必須同時使用ORDER BY 子句。expression 是對應的ORDER BY 子句中的order_by_expression 的子集或全集。
注意:在SELECT子句中使用統計函式,會覆蓋COMPUTE子句中的相應選項。在SELECTINTO語句中不能使用COMPUTE子句。

10.1.10 FOR BROWSE 子句
FOR BROWSE 子句用於讀取另外的使用者正在進行新增、刪除或更新記錄的表。其語法如下:
FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }
[ , XMLDATA ]
[ , ELEMENTS ]
[ , BINARY base64 ]
}
各引數說明如下:
BROWSE
BROWSE 選項指明當檢視在使用DB-Library 的客戶機應用程式中的資料時,可以更新資料。
使用此子句時對所操作的表有一些限制:
表必須包含一個timestamp 型別的時間標識列;
表必須有一個惟一索引。
注意:
在SELECT語句中:FOR BROWSE子句必須是SELECT語句的最後子句;FOR BROWSE子句不能與UNION操作符同時使用;FOR BROWSE子句不能與表提示HOLDLOCK選項同時使用。

  • XML
    XML 選項指明查詢結果以XML 文件模式返回XML。 模式分為RAW、 AUTO、 EXPLICIT 三種。
  • RAW
    將查詢結果每一行轉換為以一個普通識別符號作為元素標識XML 文件。
  • AUTO
    以簡單巢狀的XML 樹方式返回查詢結果。
  • EXPLICIT
    指定查詢結果的XML 樹的形式被明確定義的。
  • XMLDATA
    返回概要資訊。它是附加在文件上返回的。
  • ELEMENTS
    指明列將以子元素的方式返回。
  • BINARY base 64
    指定查詢返回的以base64 格式編碼的二進位制資料。
  • 10.1.11 OPTION 子句
    OPTION 子句用於指定在整個查詢過程中的查詢提示(Query Hint)。通常,使用者不必使用OPTION 子句,因為查詢優化器會自動選擇一個最佳的查詢計劃。OPTION 子句必須由最外層的主查詢來指定。各查詢提示之間應使用逗號隔開。其語法如下:
    OPTION ( [,...n] )
    ::=
    { { HASH | ORDER } GROUP
    | { CONCAT | HASH | MERGE } UNION
    | { LOOP | MERGE | HASH } JOIN
    | FAST number_rows
    | FORCE ORDER
    | MAXDOP number
    | ROBUST PLAN
    | KEEP PLAN
    | KEEPFIXED PLAN
    | EXPAND VIEWS
    }
    各引數說明如下:
  • {HASH | ORDER} GROUP
    指定在GROUP BY 或COMPUTE 子句中指定的查詢使用雜湊法或排序法。所謂雜湊法是指為儲存和檢索資料項或資料,把搜尋關鍵字轉換為一個地址的一種方法。該方法常作為資料集內的記錄的一種演算法,可以使記錄分組均勻,減少搜尋時間。
  • {MERGE | HASH | CONCAT} UNION
    指定所有的UNION 操作符采用合併(Merge)、雜湊(Hash) 或連線(Concatenate)的方法執行操作。如果指定了多個UNION 提示,查詢優化器會挑選一個最佳的提示方案。
  • {LOOP | MERGE | HASH |} JOIN
    指定查詢過程中的所有連線操作採取迴圈連線(Loop Join)、合併連線(Merge Join)或雜湊連線(Hash Join) 的方法。如果指定了多個JOIN 提示,查詢優化器會挑選一個最佳的提示方案。
  • FAST number_rows
    指定查詢優化只用於迅速返回前number_rows 行資料,在number_rows 行以後的資料採用原查詢方法。
  • FORCE ORDER
    指定在查詢語法中說明的連線順序在查詢優化的過程中保持不變。
  • MAXDOP number
    忽略由Sp_configure 設定的針對查詢的最大並行執行緒數目。
  • ROBUST PLAN
    強制查詢優化器嘗試使用最大行容量的計劃。
  • KEEP PLAN
    強制查詢優化器放鬆重新編譯查詢的閾值。指定此選項可以讓一個表被多次更新而不必頻繁地重新編譯查詢。
  • KEEPFIXED PLAN
    強制查詢優化器不重新編譯查詢。這樣只有當表的概要改變或執行Sp_recompile 儲存過程時,才會重新編譯查詢。
  • EXPAND VIEWS
    擴充套件索引化檢視(當一個檢視的名稱在查詢文字中被檢視定義替換時稱這個檢視被擴充套件了),並且查詢優化器不再將索引化檢視作為查詢的某部分的替代品。如果檢視使用了WITH (NOEXPAND) 說明,則不能被擴充套件。
注意:SELECT語句中各子句的排列次序是很重要的,子句必須依相應的次序來使用。
當用SELECT命令讀取TEXT和IMAGE型別資料時,一次所能讀取的資料受限於@@TE-XTSIZE全域性變數的值。
可以用SET TEXTSIZE命令來更改它。@@TEXTSIZE的初始值為4K,最大為231-1(2,147,483,647)個位元組。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/756652/viewspace-242451/,如需轉載,請註明出處,否則將追究法律責任。

相關文章