sql server 7.0 入門(mén) (3)
發(fā)布時(shí)間:2008-08-13 閱讀數(shù): 次 來(lái)源:網(wǎng)樂(lè)原科技
數(shù)據(jù)排序
ORDER BY子句按指定的順序?qū)?shù)據(jù)排序(ordering data)。它要求一個(gè)列名字列表或非負(fù)整數(shù)列表來(lái)指定列的位置。分別用ASC代表升序,DESC代表降序,默認(rèn)為ASC。
限制返回行的數(shù)目
不使用WHERE子句而限制結(jié)果中的行數(shù)是可能的。“TOP”子句能按指定數(shù)目或百分值來(lái)限制行數(shù)。
數(shù)據(jù)分組和計(jì)算聚合函數(shù)
聚合(aggregate)函數(shù)計(jì)算表中數(shù)據(jù)的總和。SQL Server提供以下的聚合函數(shù):
· AVG 這個(gè)函數(shù)計(jì)算平均值。語(yǔ)法如下:
AVG ([ALL | DISTINCT] expression)
關(guān)鍵字DISTINCT只用來(lái)計(jì)算不同值的平均值,如果有許多重復(fù)值,這些值只計(jì)算一次,默認(rèn)為ALL。
Expression可以是涉及一列或多列的算術(shù)表達(dá)式。
· MIN 這個(gè)函數(shù)查找所提供表達(dá)式中的最小值。語(yǔ)法如下:
MIN (expression)
· MAX 此函數(shù)的功能是在提供的表達(dá)式中查找最大值。語(yǔ)法如下:
MAX (expression)
注意: 如果地字符串類(lèi)型使用MIN和MAX,則輸出依賴(lài)于為SQL Server定義的順序。MIN和MAX不能在位上使用。
· SUM SUM計(jì)算所有數(shù)據(jù)值的和。語(yǔ)法如下:
SUM ([ALL | DISTINCT] expression)
注意:SUM和AVG只能用于數(shù)值數(shù)據(jù)類(lèi)型。
· COUNT 計(jì)算表達(dá)式值的數(shù)目。語(yǔ)法如下:
COUNT ([ALL | DISTINCT] expression)
COUNT有另一種用法,它可以返回被選擇的行數(shù)。
如:SELECT NumRows = COUNT (*) FROM titles
聚合函數(shù)忽略所有空值,但COUNT(*)除外。盡管所有聚合函數(shù)的計(jì)算基于無(wú)空值的情況,然而COUNT(*)計(jì)算所有的行(包括有空值的行)。
1. GROUP BY子句
GROUP BY子句在被定義的數(shù)據(jù)的基礎(chǔ)上建立比較小的組,并且對(duì)每一個(gè)組進(jìn)行聚合函數(shù)計(jì)算。換句話說(shuō),它產(chǎn)生每一組的總體信息。GROUP BY可以把多于一列當(dāng)成組合列(Grouping Columns)。它總結(jié)組合列中不重復(fù)值的信息。
使用了GROUP BY子句的選擇列表中只能包含以下項(xiàng):
· 常量值。
· 組合列。
· 表達(dá)式。每個(gè)表達(dá)式為每組返回一個(gè)值(如聚合函數(shù))。如果一列除了在組合列中外,還在選擇列表中,則它有多個(gè)值給組合列的每一個(gè)不重復(fù)值,這種結(jié)構(gòu)類(lèi)型是不允許的。
2. GROUP BY和HAVING
HAVING子句用來(lái)向使用GROUP BY子句的查詢(xún)中增加數(shù)據(jù)過(guò)濾準(zhǔn)則。HAVING的用法和SELECT中的WHERE子句一樣。在一個(gè)包含GROUP BY子句的查詢(xún)中使用WHERE子句是可以的。HAVING和WHERE有相同的語(yǔ)法。HAVING和WHERE的不同這處是:
· 在WHERE子句中,在分組進(jìn)行以前,去除不滿(mǎn)足條件的行,在HAVING子句中,在分組之后條件被應(yīng)用。
· HAVING可在條件中包含聚合函數(shù),但WHERE不能。
注意:GROUP BY和HAVING子句不能使用文本或圖像數(shù)據(jù)類(lèi)型。
3. COMPUTE BY子句
COMPUTE BY子句可以得到詳細(xì)或總的記錄。它把數(shù)據(jù)分成較小的組,然后為每組建立詳細(xì)記錄結(jié)果數(shù)據(jù)集(象SELECT),它也可為每組產(chǎn)生總的記錄(象GROUP BY)。
在COMPUT BY中,定義BY子句不是必要的。如果沒(méi)有定義BY子句,則認(rèn)為整個(gè)表為一個(gè)組,并且只有兩個(gè)結(jié)果數(shù)據(jù)集產(chǎn)生,一個(gè)擁有所有詳細(xì)記錄,另一個(gè)只有一行,它擁有總記錄。
注意:當(dāng)在COMPUTE中使用BY時(shí),則要求在所有組合列中包含ORDER BY。
Cube和Rollup操作
CUBE和ROLLUP操作可比簡(jiǎn)單的GROUP BY產(chǎn)生更多的聚合值。在產(chǎn)生交叉標(biāo)簽報(bào)告(cross tab reports)時(shí),這些操作非常有用。如果查詢(xún)使用n個(gè)組合列,則有2n個(gè)計(jì)算聚合的組合。
從多個(gè)表中訪問(wèn)數(shù)據(jù)
我們已討論了如何訪問(wèn)單個(gè)表中的數(shù)據(jù)。從多個(gè)表中訪問(wèn)數(shù)據(jù)也是可能的。從多個(gè)表中訪問(wèn)數(shù)據(jù)稱(chēng)為連接表(joining a table)。
1、 CROSS JOIN(笛卡爾積)
CROSS JOIN是簡(jiǎn)單地、不加任何約束條件地把表組合。CROSS JOIN后結(jié)果的行數(shù)是連接前兩個(gè)表行數(shù)的乘積。如果對(duì)兩個(gè)分別有好幾千行的表進(jìn)行連接,則結(jié)果是不可想象的。
2、 INNER JOIN
INNER JOIN是組合兩個(gè)表最常用的方法。INNER JOIN是基于一個(gè)判別式進(jìn)行的,這個(gè)判別式稱(chēng)為連接條件。連接條件和WHERE子句一起定義。連接條件由來(lái)自?xún)蓚€(gè)表中的列組成,并使用一個(gè)比較條件來(lái)對(duì)列的值進(jìn)行比較。通過(guò)比較的值包含在結(jié)果數(shù)據(jù)集中,以下是Inner JOIN的語(yǔ)法:
語(yǔ)法1:(ANSI 92)
Select <select_list>
FROM <table1> INNER JOIN <table2>
ON <table1>.<column name> = <table2>.<column name>
語(yǔ)法2:
Select <select_list>
FROM <table1>,<table2> WHERE <table1>.<column name> = <table2>.<column name>
在FROM 子句中可為表定義別名,并在任何地方都可用別名代替真名。
注意:如果作為連接條件的列中有空值,則空值不能和任何值匹配,因此結(jié)果中不包含有空值的行。
3、 Left Outer JOIN
在Inner JOIN中,只有在兩個(gè)表中匹配的行才能在結(jié)果數(shù)據(jù)集中。但在Left Outer JOIN中,所有左邊表中的行都出現(xiàn)在結(jié)果數(shù)據(jù)集中,如果左邊表中的某一行在右邊表中沒(méi)有匹配的行,則以空值取代右邊表中的值和它連接。
語(yǔ)法如下:(ANSI 92)
Select <select_list>
FROM <table1> LEFT OUTER JOIN <table2>
ON <table1>.<column name> = <table2>.<column name>
4、 Right Outer JOIN
Right Out JOIN和Left Outer JOIN相似,不同的是把右邊的表作為外部表(所有右邊表中的行包含在結(jié)果數(shù)據(jù)集中)。
語(yǔ)法如下:
Select <select_list>
FROM <table1> RIGHT OUTER JOIN <table2>
ON <table1>.<column name> = <table2>.<column name>
5、 Full Outer JOIN
在Full Outer JOIN中,所有兩個(gè)表中的行都包含在結(jié)果數(shù)據(jù)集中。
語(yǔ)法如下:
Select <select_list>
FROM <table1> FULL OUTER JOIN <table2>
ON <table1>.<column name> = <table2>.<column name>
Case語(yǔ)句
當(dāng)對(duì)不同條件產(chǎn)生不同的結(jié)果值時(shí),可使用Case語(yǔ)句。
Case語(yǔ)句計(jì)算所有定義的條件,并按條件是否為真而返回結(jié)果。
語(yǔ)法如下:
CASE [<input_expression>]
WHEN <when_expression> THEN <result_expression>
[ELSE <else_expression>]
END
Input_expression是任何有效的SQL Server表達(dá)式或布爾表達(dá)式。
When_expression是任何有效的SQL Server表達(dá)式或布爾表達(dá)式。這個(gè)表達(dá)式和Input_expression比較,如果Input_expression沒(méi)有定義,則When_expression應(yīng)該是一個(gè)布爾表達(dá)式。
Result_expression是任何有效的SQL Server表達(dá)式。如果When_expression和Input_expression的比較返回TRUE(如果定義了Input_expression)或When_expression的值為T(mén)RUE,則計(jì)算表達(dá)式,并返回其結(jié)果。否則計(jì)算Else_expression中的表達(dá)式,并返回其結(jié)果。
例如:
SELECT au_fname,au_lname,
State=CASE state
WHEN ‘CA’ THEN ‘California’
WHEN ‘KS’ THEN ‘Kansas’
END
FROM authors
UNION
UNION語(yǔ)句把兩個(gè)或多個(gè)查詢(xún)的結(jié)果組合成一個(gè)結(jié)果集。
語(yǔ)法如下:
SELECT <select_list>
FROM <table_list>
WHERE <join_condition>
UNION [ALL]
SELECT <table_list>
FROM <table_list>
WHERE <join_condition>
ALL關(guān)鍵字指定重復(fù)的數(shù)據(jù)也將包含在最終結(jié)果數(shù)據(jù)集中。如果需要,一個(gè)查詢(xún)中可以有許多UNION語(yǔ)句。所有Select_list應(yīng)該有相同數(shù)目的列,且是相同或兼容的數(shù)據(jù)類(lèi)型。
Go命令 Go命令用來(lái)標(biāo)志一個(gè)查詢(xún)批處理(query batch)的結(jié)束。查詢(xún)批處理是TSQL語(yǔ)句的集合,這些語(yǔ)句集合在一起執(zhí)行。Go與Osql或SQL Server Query Analyzer一起使用。