




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
SQLServer2005數(shù)據(jù)庫(kù)程序設(shè)計(jì)語(yǔ)言第7章數(shù)據(jù)操作7.1用SELECT語(yǔ)句查詢記錄1、檢索數(shù)據(jù)2、數(shù)據(jù)分組與匯總3、其它操作1、檢索數(shù)據(jù)1.1使用SELECT語(yǔ)句檢索數(shù)據(jù)1.2過(guò)濾數(shù)據(jù)1.3設(shè)置結(jié)果集格式1.4需要考慮的性能問(wèn)題1.5推薦操作1.1使用SELECT語(yǔ)句檢索數(shù)據(jù)1.1.1使用SELECT語(yǔ)句1.1.2指定列1.1.3使用WHERE子句指定行SELECT[ALL|DISTINCT][TOPn]<選擇列表>
[FROM]{<表資源>}[,…n]
[WHERE]<搜索條件>[GROUPBY]{<分組表達(dá)式>}[,…n][HAVING]<搜索條件>[ORDERBY]{<字段名[ASC|DESC]>}[,…n]基本語(yǔ)法使用SELECT語(yǔ)句用[]括起來(lái)的是可選項(xiàng),SELECT是必需的選擇列表指定了要返回的列WHERE子句指定限制查詢的條件
在搜索條件中,可以使用比較操作符、字符串、邏輯操作符來(lái)限制返回的行數(shù)1.1.1使用SELECT語(yǔ)句使用SELECT語(yǔ)句(續(xù))FROM子句知道了返回的行和列所屬的表DISTINCT選項(xiàng)從結(jié)果集中消除了重復(fù)的行,TOPn選項(xiàng)限定了要返回的行數(shù)GROUPBY子句是對(duì)結(jié)果集進(jìn)行分組HAVING子句是在分組的時(shí)候,對(duì)字段或表達(dá)式指定搜索條件ORDERBY子句對(duì)結(jié)果集按某種條件進(jìn)行排序
1.1.1使用SELECT語(yǔ)句指定列1.1.2指定列在選擇列表中指定要從表中返回的列在選擇列表中可以包含字段名、表達(dá)式、所選關(guān)鍵字或要賦值的局部變量。其語(yǔ)法為<選擇列表>::=
{*|{表名|視圖名|表的別名}.*
|{字段名|表達(dá)式
|$IDENTITY|$ROWGUID}
[[AS]字段別名]
|字段別名=表達(dá)式
}[,...n]指定要檢索的字段時(shí),請(qǐng)注意選擇列表將按照指定順序查找并顯示所查詢的字段不同的字段名用“,”分開在選擇列表中,避免或盡量少使用符號(hào)“*”。該符號(hào)代表選擇表中所有的字段
查詢指定列通過(guò)指定SELECT子句的<目標(biāo)表達(dá)式>來(lái)完成例1、查詢?nèi)w學(xué)生的學(xué)號(hào)和姓名。
SELECT例2、查詢?nèi)w學(xué)生的姓名、學(xué)號(hào)、年齡。
SELECTSno,SnameFROMStudentSname,Sno,Sage
FROM
Student Student(Sno,Sname,Ssex,Sage,Sdept)<目標(biāo)列表達(dá)式>中各個(gè)列的先后順序可以與表中的順序不一致。用戶可以根據(jù)應(yīng)用的需要改變列的顯示順序。本例中先列出姓名,再列學(xué)號(hào)和年齡。查詢?nèi)苛小?”:表示“所有的屬性”。例3給出所有學(xué)生的信息。
selectSno,Sname,Ssex,Sage,Sdept fromStudentselect*fromStudent等價(jià)于:Student(Sno,Sname,Ssex,Sage,Sdept)查詢經(jīng)過(guò)計(jì)算的值select子句的<目標(biāo)列表達(dá)式>不僅可以是表中的屬性列,也可以是表達(dá)式selectSNAME,2011-SagefromStudent例4給出所有學(xué)生的姓名及其出生年份。Student(Sno,Sname,Ssex,Sage,Sdept)例5給出所有學(xué)生姓名、出生年份和所在系編號(hào),要求用小寫字母表示所有系名。selectSname,’YearofBirth’,2011-Sagefrom,
LOWER(Sdept)STUDENT
<目標(biāo)表達(dá)式>不僅可以是算術(shù)表達(dá)式,還可以是字符串常量、函數(shù)。使用WHERE子句指定行1.1.3使用WHERE子句指定行通過(guò)使用WHERE子句,可以得到基于搜索條件的行<搜索條件>::=
{[NOT]<斷言>|(<搜索條件>)}
[{AND|OR}[NOT]{<斷言>|(<搜索條件>)}]
}[,...n]<斷言>列出了可以在WHERE子句中包含的表達(dá)式列表使用WHERE子句指定行時(shí),請(qǐng)注意在所有數(shù)據(jù)類型為char、nchar、varchar、nvarchar、text、datetime和smalldatetime
的數(shù)據(jù)周圍,必須使用單引號(hào)(‘)在使用SELECT語(yǔ)句時(shí),盡量使用WHERE語(yǔ)句限制將要返回的行使用WHERE子句指定行(續(xù))employeeidlastnamefirstnametitle5BuchananStevenSalesManagerUSEnorthwindSELECTemployeeid,lastname,firstname,titleFROMemployeesWHEREemployeeid=5GO示例1.1.3使用WHERE子句指定行1、檢索數(shù)據(jù)1.1使用SELECT語(yǔ)句檢索數(shù)據(jù)1.2過(guò)濾數(shù)據(jù)1.3設(shè)置結(jié)果集格式1.4需要考慮的性能問(wèn)題1.5推薦操作過(guò)濾數(shù)據(jù)1.2過(guò)濾數(shù)據(jù)過(guò)濾的類型搜索條件使用比較運(yùn)算符=、>、<、>=、<=、<>使用字符串比較符LIKE和NOTLIKE使用邏輯運(yùn)算符AND、OR檢索一定范圍內(nèi)的值BETWEEN和NOTBETWEEN使用值列表作為搜索條件IN和NOTIN檢索未知值ISNULL和ISNOTNULL使用比較運(yùn)算符1.2.1使用比較運(yùn)算符使用比較操作符來(lái)比較表中的值與指定的值或表達(dá)式的值USEnorthwindSELECTlastname,cityFROMemployeesWHEREcountry='USA'GO使用字符串比較符1.2.2使用字符串比較符在比較字符串時(shí),可以使用LIKE和通配符來(lái)查找需要的行通配符的種類通配符描述%0或多個(gè)字符串_任何單個(gè)的字符[]在指定區(qū)域或集合內(nèi)的任何單個(gè)字符[^]不在指定區(qū)域或集合內(nèi)的任何單個(gè)字符使用字符串比較符(續(xù))1.2.2使用字符串比較符表達(dá)式LIKE'%EEN'LIKE'_EEN'LIKE'[CK]'LIKE'[S-V]'LIKE'99[0-9][0-9]'LIKE'[A-Z][0-9][FM]'LIKE'M[^C]'LIKE'5_\%'ESCAPE'\'使用邏輯運(yùn)算符1.2.3使用邏輯運(yùn)算符用邏輯操作符AND、OR和NOT
來(lái)連接一系列的表達(dá)式,及優(yōu)化查詢過(guò)程。使用邏輯運(yùn)算符時(shí),遵循下列原則使用AND返回滿足所有條件的行使用OR返回滿足任一條件的行使用NOT返回不滿足條件的行有多個(gè)表達(dá)式時(shí),使用圓括號(hào)為表達(dá)式分組改變表達(dá)式求值順序增加表達(dá)式的可讀性使用邏輯運(yùn)算符(續(xù))搜索條件的順序MicrosoftSQLServer首先求NOT表達(dá)式的值,然后是AND,最后是OR當(dāng)表達(dá)式中所有的操作符優(yōu)先級(jí)相同時(shí),求值順序由左到右1.2.3使用邏輯運(yùn)算符(productnameLIKE'T%'ORproductid=46)
AND(unitprice>16.00)(productnameLIKE'T%')OR(productid=46ANDunitprice>16.00)
檢索一定范圍內(nèi)的值使用BETWEEN來(lái)查詢?cè)谝欢ǚ秶鷥?nèi)的值,使用BETWEEN時(shí),注意SQLServer返回的結(jié)果集中,包含范圍內(nèi)的邊緣值盡量使用BETWEEN,而不用AND和比較操作符表示的表達(dá)式(>=xAND<=y)。要使結(jié)果集不包含邊緣值,則使用(>xAND<y)要返回不在指定區(qū)域的行時(shí),使用NOTBETWEEN1.2.4檢索一定范圍內(nèi)的值unitpriceBETWEEN10AND20使用值列表作為搜索條件1.2.5使用值列表作為搜索條件使用IN語(yǔ)句指定一個(gè)值的列表作為查詢條件。使用IN時(shí),注意使用IN搜索條件和使用由OR操作符連起來(lái)的一系列比較操作符,其效果是等價(jià)的在搜索條件中不能包含NULL值,這將返回不可預(yù)測(cè)的結(jié)果集使用NOTIN搜索條件來(lái)返回值不在指定列表中的行。使用NOT會(huì)降低數(shù)據(jù)檢索速度countryIN('Japan','Italy')country='Japan‘orcountry='Italy'檢索未知值1.2.6檢索未知值輸入數(shù)據(jù)時(shí),沒有指定一個(gè)字段的值,且此字段沒有定義默認(rèn)值的值,稱此字段含有空值(NULL)使用ISNULL搜索條件來(lái)查詢某指定列沒任何信息的行。需要返回含有空值的行時(shí),注意把空值和任何表達(dá)式比較都會(huì)失敗,因?yàn)榭罩挡坏扔谌魏伪磉_(dá)式在CREATETABLE語(yǔ)句里,定義一個(gè)字段是否允許空值的存在使用ISNOTNULL來(lái)查詢指定列中非空的行ScoreISNULL1、檢索數(shù)據(jù)1.1使用SELECT語(yǔ)句檢索數(shù)據(jù)1.2過(guò)濾數(shù)據(jù)1.3設(shè)置結(jié)果集格式1.4需要考慮的性能問(wèn)題1.5推薦操作設(shè)置結(jié)果集格式對(duì)數(shù)據(jù)進(jìn)行排序消除重復(fù)行改變列名使用字面值FOR子句UNION[ALL]1.3設(shè)置結(jié)果集格式對(duì)數(shù)據(jù)進(jìn)行排序1.3.1對(duì)數(shù)據(jù)進(jìn)行排序使用ORDERBY子句為結(jié)果集中的行排序時(shí),有升序和降序兩種。使用ORDERBY時(shí),注意在安裝SQLServer時(shí),排序順序已指定除非使用ORDERBY指定順序,SQLServer并不主動(dòng)為結(jié)果集中的行排序SQLServer缺省地按升序排列ORDERBY子句中指定的列并不一定要出現(xiàn)在選擇列表中可以按照字段名、計(jì)算出的值或表達(dá)式進(jìn)行排序可以在ORDERBY子句中引用某字段在選擇列表中的位置而進(jìn)行排序ORDERBY子句不能用于數(shù)據(jù)類型text、ntext或image字段對(duì)數(shù)據(jù)進(jìn)行排序(續(xù))USEnorthwindSELECTproductid,productname,categoryid,unitpriceFROMproductsORDERBYcategoryid,unitpriceDESCGOproductidproductnamecategoryidunitprice38CotedeBlaye1263.500043IpohCoffee146.00002Chang119.0000…………63Vegie-spread243.90008NorthwoodsCranberrySauce240.000061Siropd'érable228.5000…………示例1.3.1對(duì)數(shù)據(jù)進(jìn)行排序消除重復(fù)行1.3.2消除重復(fù)行用DISTINCT可以消除重復(fù)行,使結(jié)果集列出惟一的值。使用DISTINCT時(shí),注意除非指定DISTINCT子句,否則SELECT語(yǔ)句將返回所有滿足搜索條件的行選擇列表中所有列的組合值將決定其惟一性包含任何惟一組合值的行都將被檢索到并被返回到結(jié)果集中除非使用了ORDERBY子句,否則DISTINCT子句將按隨機(jī)的順序顯示結(jié)果集中的行消除重復(fù)行(續(xù))USEnorthwindSELECTDISTINCTcountryFROMsuppliersORDERBYcountryGOcountryAustraliaBrazilCanadaDenmarkFinlandFranceGermanyItalyJapanNetherlandsNorwaySingaporeSpainSwedenUKUSA示例1.3.2消除重復(fù)行改變列名1.3.3改變列名為了提高可讀性,可以為選擇列表中的字段名起別名改變字段名時(shí),應(yīng)注意缺省情況下,結(jié)果集所顯示的字段名,就是在CREATETABLE語(yǔ)句中指定的字段名如果字段名中有空格,或字段名不符合SQLServer命名規(guī)則,用單引號(hào)來(lái)標(biāo)識(shí)這個(gè)字段名可以為經(jīng)過(guò)計(jì)算的包含函數(shù)、字符符號(hào)的字段起別名字段名中至多可以包含128個(gè)字符改變列名(續(xù))USEnorthwindSELECTfirstnameASFirst,lastnameLast ,'EmployeeID:'=employeeidFROMemployeesFirstLastEmployeeID:NancyDavolio1AndrewFuller2JanetLeverling3MargaretPeacock4StevenBuchanan5MichaelSuyama6RobertKing7LauraCallahan8AnneDodsworth91.3.3改變列名示例使用字面值1.3.4使用字面值使用字面值可以增加結(jié)果集的可讀性,符號(hào)可能是字母、數(shù)字或標(biāo)識(shí),它們被用作特定的值。其語(yǔ)法為SELECT字段名
|’字符串符號(hào)’[,字段名
|’字符串符號(hào)’…]
FROM表名USEnorthwindSELECTfirstname,lastname ,'Identificationnumber:',employeeidFROMemployees
GOFOR子句FOR子句用來(lái)指定BROWSE或XML選項(xiàng),主要在應(yīng)用程序的開發(fā)中經(jīng)常使用。FOR子句生成XML的詳細(xì)使用介紹請(qǐng)參考第24章。本節(jié)通過(guò)一個(gè)使用FOR子句的示例,簡(jiǎn)單說(shuō)明其一般的功能。1.3.5FOR子句USEnorthwindSELECTcountryFROMsuppliersORDERBYcountryforxmlautoGO示例UNION[ALL]將兩個(gè)或更多查詢的結(jié)果合并為單個(gè)結(jié)果集,該結(jié)果集包含聯(lián)合查詢中的所有查詢的全部行。UNION運(yùn)算不同于使用聯(lián)接合并兩個(gè)表中的列的運(yùn)算。1.3.6UNION[ALL]USEAdventureWorksSELECTProductModelID,NameFROMProduction.ProductModelUNIONSELECTProductModelID,NameFROMdbo.ProductModel2ORDERBYName;使用UNION合并兩個(gè)查詢結(jié)果集的基本規(guī)則:所有查詢中的列數(shù)和列的順序必須相同。數(shù)據(jù)類型必須兼容。需要考慮的性能問(wèn)題非邏輯操作會(huì)降低查詢速度
比如:NOTBETWEEN、NOTIN和ISNOTNULL
LIKE搜索條件會(huì)降低查詢速度使用精確查詢或在一定范圍的查詢可能會(huì)提高數(shù)據(jù)查詢速度ORDERBY子句可能降低數(shù)據(jù)查詢速度
因?yàn)镾QLServer在返回第一行前,必須對(duì)結(jié)果集中所有的行進(jìn)行計(jì)算并排序1.4需要考慮的性能問(wèn)題推薦操作使用DISTINCT子句消除結(jié)果集中重復(fù)的行通過(guò)改變字段名和使用字面值來(lái)提高結(jié)果集的可讀性提出問(wèn)題我們遇到了下面的問(wèn)題:我們擁有桌子和椅子兩種產(chǎn)品,每種產(chǎn)品都有紅色和藍(lán)色兩種顏色。每種顏色的桌子有多少庫(kù)存,每種顏色的椅子有多少庫(kù)存。椅子有多少庫(kù)存,不論它是什么顏色;桌子有多少庫(kù)存,不論它是什么顏色。紅色的商品一共有多少庫(kù)存,藍(lán)色的商品一共有多少庫(kù)存。這個(gè)時(shí)候大家發(fā)現(xiàn),我們需要的是以不同商品種類和顏色進(jìn)行排列組合的小計(jì)報(bào)表。2、數(shù)據(jù)分組與匯總使用TOPn列出前n個(gè)記錄使用TABLESAMPLE限制結(jié)果集使用聚合函數(shù)GROUPBY的基礎(chǔ)知識(shí)在結(jié)果集中生成匯總值使用COMPUTE和COMPUTEBY子句推薦操作使用TOPn
列出前n個(gè)記錄2.1使用TOPn列出前n個(gè)記錄關(guān)鍵字TOPn
只列出結(jié)果集中前n
個(gè)或前n%的記錄。使用TOPn
或TOPnPERCENT時(shí),應(yīng)注意在ORDERBY子句中指定值的范圍關(guān)鍵字TOP后使用無(wú)符號(hào)的整數(shù)如果TOPnPERCENT生成小數(shù),則SQLServer將把這個(gè)數(shù)取整可以在結(jié)果集中用WITHTIES子句包含那些值相等的記錄,這時(shí)結(jié)果集中可以包含任意數(shù)目的行部分語(yǔ)法:SELECT[ALL|DISTINCT]
[TOPn[PERCENT][WITHTIES]]
<select_list>……要求:--1、檢索出SC表中的所有成績(jī)記錄--2、檢索出SC表中的前5條成績(jī)記錄--3、檢索出SC表中的前50%的成績(jī)記錄--4、檢索出SC表中的前5%的成績(jī)記錄。注意觀察有幾條記錄。? --5、檢索出SC表中成績(jī)前5名的學(xué)生學(xué)號(hào)--6、檢索出SC表中成績(jī)前5名的學(xué)生學(xué)號(hào)使用TOPn
列出前n個(gè)記錄2.1使用TOPn列出前n個(gè)記錄限制結(jié)果集大小的另一種方法是在執(zhí)行一個(gè)語(yǔ)句之前執(zhí)行SETROWCOUNTn語(yǔ)句。SETROWCOUNT與TOP的不同之處在于:TOP子句適用于指定了該子句的單個(gè)SELECT語(yǔ)句。在執(zhí)行另一個(gè)SETROWCOUNT語(yǔ)句之前,SETROWCOUNT會(huì)一直有效,例如執(zhí)行
SETROWCOUNT0
將會(huì)關(guān)閉此選項(xiàng)。SETROWCOUNTn使用TOPn列出前n個(gè)記錄使用TABLESAMPLE限制結(jié)果集使用聚合函數(shù)GROUPBY的基礎(chǔ)知識(shí)在結(jié)果集中生成匯總值使用COMPUTE和COMPUTEBY子句推薦操作2、數(shù)據(jù)分組與匯總使用TABLESAMPLE限制結(jié)果集2.2使用TABLESAMPLE限制結(jié)果集
TABLESAMPLE子句將從FROM子句中的表返回的行數(shù)限制到樣本數(shù)或行數(shù)的某一百分比。不能對(duì)視圖使用TABLESAMPLE。部分語(yǔ)法:TABLESAMPLE[SYSTEM](sample_number[PERCENT|ROWS])--執(zhí)行幾次代碼,所得到的結(jié)果是不同的USEAdventureWorks;GOSELECTcount(*)FROMSales.CustomerTABLESAMPLESYSTEM(10PERCENT);使用TOPn列出前n個(gè)記錄使用TABLESAMPLE限制結(jié)果集使用聚合函數(shù)GROUPBY的基礎(chǔ)知識(shí)在結(jié)果集中生成匯總值使用COMPUTE和COMPUTEBY子句推薦操作2、數(shù)據(jù)分組與匯總使用聚合函數(shù)(續(xù))2.3使用聚合函數(shù)計(jì)算諸如平均值和總和的函數(shù)稱為聚合函數(shù)SQLServer對(duì)整個(gè)表或表里某個(gè)組中的字段進(jìn)行匯總、計(jì)算,然后生成單個(gè)的值可以在SELECT語(yǔ)句中單獨(dú)使用聚合函數(shù),也可以與語(yǔ)句GROUPBY聯(lián)合使用除了COUNT(*)函數(shù),如果記錄集中沒有滿足WHERE子句的記錄,則所有函數(shù)返回空值,COUNT(*)返回0字段的數(shù)據(jù)類型決定了可以用在該字段上的聚合函數(shù)類型如:SUM和AVG只能用在數(shù)據(jù)類型代表數(shù)字的字段上使用含有空值的聚合函數(shù)空值能使聚合函數(shù)產(chǎn)生意想不到的結(jié)果對(duì)包含空值的字段使用聚合函數(shù)時(shí),應(yīng)注意SQLServer的聚合函數(shù)(COUNT(*)除外)將忽略字段中的空值COUNT(*)將計(jì)算所有的行,即使每個(gè)字段都含有空值2.3.1使用含有空值的聚合函數(shù)createtabletable1(snochar(5),agetinyint)insertintotable1values('95001',null)insertintotable1values('95002',null)insertintotable1values(null,null)insertintotable1values('95003',null)--以下返回的結(jié)果分別是什么selectcount(*)fromtable1selectcount(sno)fromtable1selectcount(age)fromtable1selectavg(age)fromtable1ISNULL()的使用
selectavg(salary)fromavg_testselectavg(isnull(salary,0))fromavg_test常見的聚合函數(shù)及其描述聚合函數(shù)描述AVG 返回組中值的平均值。空值將被忽略。COUNT 表達(dá)式中值的數(shù)目COUNT(*)所選擇的行的數(shù)目MAX返回表達(dá)式的最大值。MAX忽略任何空值。對(duì)于字符列,MAX查找排序序列的最大值。MIN返回表達(dá)式的最小值。MIN忽略任何空值。對(duì)于字符列,MIN查找排序序列的最低值。SUM返回表達(dá)式中所有值的和,或只返回DISTINCT值。SUM只能用于數(shù)字列。空值將被忽略。GROUPING是一個(gè)聚合函數(shù),它產(chǎn)生一個(gè)附加的列,當(dāng)用CUBE或ROLLUP運(yùn)算符添加行時(shí),附加的列輸出值為1,當(dāng)所添加的行不是由CUBE或ROLLUP產(chǎn)生時(shí),附加列值為0。僅在與包含CUBE或ROLLUP運(yùn)算符的GROUPBY子句相聯(lián)系的選擇列表中才允許分組。分組用于區(qū)分由CUBE和ROLLUP返回的空值和標(biāo)準(zhǔn)的空值。作為CUBE或ROLLUP操作結(jié)果返回的NULL是NULL的特殊應(yīng)用。它在結(jié)果集內(nèi)作為列的占位符,意思是"全體"。使用TOPn列出前n個(gè)記錄使用TABLESAMPLE限制結(jié)果集使用聚合函數(shù)GROUPBY的基礎(chǔ)知識(shí)在結(jié)果集中生成匯總值使用COMPUTE和COMPUTEBY子句推薦操作2、數(shù)據(jù)分組與匯總GROUPBY的基礎(chǔ)知識(shí)使用GROUPBY子句聯(lián)合使用GROUPBY子句和HAVING子句2.4GROUPBY的基礎(chǔ)知識(shí)GROUPBY子句包含以下組件:一個(gè)或多個(gè)自由聚合的表達(dá)式。通常是對(duì)分組列的引用。ALL關(guān)鍵字(可選),該關(guān)鍵字指定返回由GROUPBY子句產(chǎn)生的所有組,即使某些組沒有符合搜索條件的行。CUBE或ROLLUP(注意:在GROUPBYALL子句中,不允許使用CUBE和ROLLUP選項(xiàng)。)HAVING子句(注意:不要聯(lián)合使用關(guān)鍵字ALL和HAVING子句。因?yàn)镠AVING子句會(huì)忽略ALL關(guān)鍵字,并返回只符合HAVING條件的組)--下面的例子給出了針對(duì)所有type和pub_id的唯一組合進(jìn)行分類并統(tǒng)計(jì)計(jì)算的情況。usepubsgoselecttype,pub_id,avg(price)'avg_price',sum(price)'sum_price'fromtitleswheretypein('business','trad_cook')groupbyalltype,pub_idorderbytype使用GROUPBY子句2.4.1使用GROUPBY子句聯(lián)合使用聚合函數(shù)和GROUPBY子句,能夠把表中的記錄分組,并對(duì)組中數(shù)據(jù)進(jìn)行匯總。使用
GROUPBY子句時(shí),應(yīng)注意SQLServer將為每一組計(jì)算一個(gè)匯總值,并把匯總值保存在一個(gè)字段中對(duì)于指定的一組,SQLServer只生成一條記錄,不返回詳細(xì)信息SQLServer只對(duì)滿足WHERE子句的記錄進(jìn)行分組和匯總GROUPBY子句的字段列表至多包含8060個(gè)字節(jié)不要對(duì)可包含空值的字段使用GROUPBY子句,因?yàn)榭罩狄矊⒈划?dāng)作一組ALL關(guān)鍵字(可選),該關(guān)鍵字指定返回由
GROUPBY子句產(chǎn)生的所有組,即使某些組沒有符合搜索條件的行。createtablep1(snochar(3),sexchar(8),ageint)insertintop1values('001','m',20)insertintop1values(null,null,null)insertintop1values(null,null,null)selectcount(sno)fromp1groupbysno不要對(duì)可包含空值的字段使用GROUPBY子句,因?yàn)榭罩狄矊⒈划?dāng)作一組使用GROUPBY子句(續(xù))SELECTproductid,orderid
,quantityFROMorderhist
GOSELECTproductid,SUM(quantity)AStotal_quantityFROMorderhistGROUPBYproductid
GOproductidtotal_quantity115235345productidorderidquantity11511102110222531153230productidtotal_quantity235只對(duì)滿足WHERE子句的行分組SELECTproductid,SUM(quantity)AStotal_quantityFROMorderhistWHEREproductid=2GROUPBYproductid
GO示例1示例22.4.1使用GROUPBY子句聯(lián)合使用GROUPBY子句和HAVING子句2.4.2聯(lián)合使用GROUPBY子句和HAVING子句在分組的同時(shí),對(duì)字段或表達(dá)式指定搜索條件使用
HAVING子句時(shí),應(yīng)注意只在使用GROUPBY子句的同時(shí),使用HAVING子句來(lái)限制分組可以引用任何出現(xiàn)在選擇列表中的字段不要聯(lián)合使用關(guān)鍵字ALL和HAVING子句。因?yàn)镠AVING子句會(huì)忽略ALL關(guān)鍵字,并返回只符合HAVING條件的組聯(lián)合使用GROUPBY子句和HAVING子句(續(xù))SELECTproductid,orderid,quantityFROMorderhist
GOSELECTproductid,SUM(quantity)AStotal_quantityFROMorderhistGROUPBYproductidHAVINGSUM(quantity)>=30
GOproductidtotal_quantity235345productidorderidquantity115111021102225311532302.4.2聯(lián)合使用GROUPBY子句和HAVING子句使用TOPn列出前n個(gè)記錄使用TABLESAMPLE限制結(jié)果集使用聚合函數(shù)GROUPBY的基礎(chǔ)知識(shí)在結(jié)果集中生成匯總值使用COMPUTE和COMPUTEBY子句推薦操作2、數(shù)據(jù)分組與匯總在結(jié)果集中生成匯總值使用帶有CUBE運(yùn)算符的GROUPBY子句使用帶有ROLLUP運(yùn)算符的GROUPBY子句使用GROUPING函數(shù)2.5在結(jié)果集中生成匯總值使用帶有CUBE運(yùn)算符的GROUPBY子句2.5.2使用帶有CUBE運(yùn)算符的GROUPBY子句使用帶有CUBE運(yùn)算符的GROUPBY子句創(chuàng)建并匯總所有可能的基于GROUPBY子句分組的組合。使用帶有CUBE運(yùn)算符的GROUPBY子句用于提供標(biāo)準(zhǔn)的關(guān)系型格式的數(shù)據(jù)。selectitem,color,sum(quantity)fromcpgroupbyitem,colorwithcubechair、blue的詳細(xì)值chair、red的詳細(xì)值匯總chair的所有記錄table、blue的詳細(xì)值table、red的詳細(xì)值匯總table的所有記錄總計(jì)匯總bule的所有記錄匯總red的所有記錄每種產(chǎn)品的每種顏色的總數(shù)量,每種產(chǎn)品的所有顏色的總數(shù)量,每種顏色的所有產(chǎn)品的總數(shù)量,所有產(chǎn)品所有顏色的總數(shù)量。使用帶有CUBE運(yùn)算符的GROUPBY子句2.5.2使用帶有CUBE運(yùn)算符的GROUPBY子句使用
GROUPBY子句和CUBE操作符時(shí),應(yīng)注意如果在GROUPBY子句中有
n個(gè)字段或表達(dá)式,SQLServer將在結(jié)果集中返回2n種可能的組合結(jié)果集中含有NULL的記錄代表該記錄由CUBE操作符生成(注意此NULL不是基本表中的實(shí)際空值)不能同時(shí)使用關(guān)鍵字ALL和操作符CUBE使用帶有ROLLUP運(yùn)算符的GROUPBY子句2.5.1使用帶有ROLLUP運(yùn)算符的GROUPBY子句ROLLUP運(yùn)算符的功能類似于CUBE運(yùn)算符。使用帶有ROLLUP運(yùn)算符的GROUPBY子句匯總分組值使用帶有ROLLUP運(yùn)算符的GROUPBY子句用于提供標(biāo)準(zhǔn)的關(guān)系型格式的數(shù)據(jù)。selectitem,color,sum(quantity)fromcpgroupbyitem,colorwithrollupchair、blue的詳細(xì)值chair、red的詳細(xì)值匯總chair的所有記錄table、blue的詳細(xì)值table、red的詳細(xì)值匯總table的所有記錄總計(jì)每種產(chǎn)品的每種顏色的總數(shù)量,每種產(chǎn)品的所有顏色的總數(shù)量,所有產(chǎn)品所有顏色的總數(shù)量。使用帶有ROLLUP運(yùn)算符的GROUPBY子句2.5.1使用帶有ROLLUP運(yùn)算符的GROUPBY子句使用
GROUPBY子句和ROLLUP操作符時(shí),應(yīng)注意SQLServer將在結(jié)果集中增加一行,這行將顯示總和或平均值之類的匯總值,新增的行以NULL標(biāo)識(shí)不能同時(shí)使用關(guān)鍵字ALL和操作符ROLLUP使用GROUPING函數(shù)2.5.3使用GROUPING函數(shù)如何區(qū)分CUBE操作或ROLLUP運(yùn)算符所生成的NULL值和從實(shí)際數(shù)據(jù)中返回的NULL值?使用GROUPING區(qū)分空值如果列中的值來(lái)自事實(shí)數(shù)據(jù),則GROUPING函數(shù)返回0;如果列中的值是CUBE操作或ROLLUP操作所生成的NULL,則返回1。在CUBE或ROLLUP操作中,所生成的NULL代表全體值。insertintocpvalues('table',null,202)insertintocpvalues('table',null,180)selectitem,grouping(item),color,grouping(color),sum(quantity)fromcpgroupbyitem,colorwithcube使用帶有CUBE運(yùn)算符的GROUPBY子句CUBE操作符比ROLLUP操作符
多產(chǎn)生兩個(gè)匯總值SELECTproductid,orderid,SUM(quantity)AStotal_quantityFROMorderhistGROUPBYproductid,orderidWITHCUBEORDERBYproductid,orderid
GO描述總數(shù)對(duì)
orderid1中的所有行匯總對(duì)
orderid2中的所有行匯總只對(duì)productid1中的行匯總productid1、
orderid1的具體值productid1、
orderid2的具體值只對(duì)
productid2中的行匯總productid2、
orderid1的具體值productid2、orderid2的具體值只對(duì)
productid3中的行匯總productid3、
orderid1的具體值productid3、orderid2的具體值productidorderidtotal_quantityNULLNULL95NULL130NULL2651NULL1511512102NULL35211022253NULL4531153230示例描述使用帶有ROLLUP運(yùn)算符的GROUPBY子句SELECTproductid,orderid,SUM(quantity)AStotal_quantityFROMorderhistGROUPBYproductid,orderidWITHROLLUPORDERBYproductid,orderid
GOproductidorderidtotal_quantityNULLNULL951NULL1511512102NULL35211022253NULL4531153230示例總數(shù)只對(duì)productid1中的行匯總productid1、
orderid1的具體值productid1、
orderid2的具體值只對(duì)
productid2中的行匯總productid2、
orderid1的具體值productid2、orderid
2的具體值只對(duì)
productid3中的行匯總productid3、orderid
1的具體值productid3、orderid2的具體值1代表前一字段的匯總值0代表前一字段的具體值95306515510351025451530使用GROUPING函數(shù)(續(xù))SELECTproductid,GROUPING(productid),orderid,GROUPING(orderid),SUM(quantity)AStotal_quantityFROMorderhistGROUPBYproductid,orderidWITHCUBEORDERBYproductid,orderid
GOproductidNULLNULLNULL111222333111000000000orderidNULL12NULL12NULL12NULL12100100100100total_quantity示例問(wèn)題:ROLLUP和CUBE的區(qū)別在什么地方?CUBE生成的結(jié)果集顯示了所選列中值的所有組合的聚合;ROLLUP生成的結(jié)果集顯示了所選列中值的某一層次結(jié)構(gòu)的聚合。使用TOPn列出前n個(gè)記錄使用TABLESAMPLE限制結(jié)果集使用聚合函數(shù)GROUPBY的基礎(chǔ)知識(shí)在結(jié)果集中生成匯總值使用COMPUTE和COMPUTEBY子句推薦操作2、數(shù)據(jù)分組與匯總使用COMPUTE和COMPUTEBY子句2.6使用COMPUTE和COMPUTEBY子句生成某一列的明細(xì)值和匯總值的報(bào)表為組中的子集生成明細(xì)值和匯總值的報(bào)表使用COMPUTE和COMPUTEBY子句(續(xù))COMPUTEBYCOMPUTESELECTproductid,orderid,quantityFROMorderhistORDERBYproductid,orderidCOMPUTESUM(quantity)BYproductidCOMPUTESUM(qua
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 6 讓我們的學(xué)校更美好第一課時(shí)教學(xué)設(shè)計(jì)-2023-2024學(xué)年道德與法治三年級(jí)上冊(cè)(部編版)
- 14《斜面》教學(xué)設(shè)計(jì)-2023-2024學(xué)年科學(xué)五年級(jí)下冊(cè)人教鄂教版
- 九年級(jí)化學(xué)下冊(cè) 第10單元 課題1《常見的酸和堿》教學(xué)設(shè)計(jì) (新版)新人教版
- Unit 2 No Rules No Order 大單元整體教學(xué)設(shè)計(jì)-2024-2025學(xué)年人教版英語(yǔ)七年級(jí)下冊(cè)
- 團(tuán)隊(duì)建設(shè)與入職培訓(xùn)1
- 三年級(jí)語(yǔ)文下冊(cè) 第三單元 12《一幅名揚(yáng)中外的畫》教學(xué)設(shè)計(jì) 新人教版
- 知識(shí)付費(fèi)產(chǎn)業(yè)發(fā)展
- 七年級(jí)地理上冊(cè) 3.3《世界的語(yǔ)言與宗教》教學(xué)設(shè)計(jì) 湘教版
- 七年級(jí)生物上冊(cè) 4.4.1《物質(zhì)運(yùn)輸?shù)妮d體》教學(xué)設(shè)計(jì) 魯科版五四制
- 《8 水果拼盤》(教學(xué)設(shè)計(jì))-2023-2024學(xué)年五年級(jí)下冊(cè)綜合實(shí)踐活動(dòng)長(zhǎng)春版
- MOOC 數(shù)字邏輯電路實(shí)驗(yàn)-東南大學(xué) 中國(guó)大學(xué)慕課答案
- 活動(dòng)一:文明好寶寶(語(yǔ)言活動(dòng))課件
- 2005雷克薩斯gs430gs300原廠維修手冊(cè)中文sa
- 中學(xué)生問(wèn)題行為及其對(duì)策
- 風(fēng)險(xiǎn)管理師國(guó)家職業(yè)技能標(biāo)準(zhǔn)
- 電氣系統(tǒng)設(shè)計(jì)方案
- Python語(yǔ)言實(shí)用教程第10章-科學(xué)計(jì)算課件
- 入團(tuán)志愿書(2016版本)(可編輯打印標(biāo)準(zhǔn)A4) (1)
- 無(wú)心磨床調(diào)整要訣
- 紅色喜慶卡通中小學(xué)期末考試頒獎(jiǎng)典禮PPT模板
- 集裝箱整箱海運(yùn)業(yè)務(wù)操作流程
評(píng)論
0/150
提交評(píng)論