數據庫是為更方便有效地管理信息而存在的人們,希望數據庫可以隨時提供所需要的數據信息。因此,對用戶來說,數據查詢是數據
庫最重要的功能。本章將講述數據查詢的實現方法。
在數據庫中,數據查詢是通過SELECT 語句來完成的。SELECT 語句可以從數據庫中按用戶要求檢索數據,並將查詢結果以表格的形式返回。我們在“Transact-SQL 語言”章節及前面的章節中已經初步接觸到了SELECT 語句的一些用法,在本章中將分類講述其具體用法。
本節講述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 ( [,...
您正在看的SQLserver教程是:SQL Server數據庫技術(58)。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()以上參數與對應的函數有相同的含義。
您正在看的SQLserver教程是:SQL Server數據庫技術(58)。這些函數均會忽略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 文檔。
文章整理:學網 http://www.xue5.com (本站) [1] [2] [3] [4] [5]
- 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)個字節。