一、SELECT

select [ALL|DISTINCT] select_list[into new table]FROM table_source[where serch_conditaion][GROUP BY group_by_exPRession][Having serch_conditaion][Order by order_expression[ASC|DESC]]--從上面的語(yǔ)句可以看出SELECT 查詢語(yǔ)句共有5個(gè)子句 其中SELECT/FROM 為必選語(yǔ)句--SELECT 子句:用來(lái)指定由查詢返回的列--ALL|DISTINCT:用來(lái)指定對(duì)查詢結(jié)果集,相同行的處理方式,ALL-為所有 DISTINCT:保留一條記錄--select_list:用來(lái)顯示要顯示的目標(biāo)列,全部可以用 * 代替,不是全部每個(gè)列字段用,分割--into new table:用來(lái)創(chuàng)建一個(gè)新的臨時(shí)表--FROM table_source:指定查詢的數(shù)據(jù)源--where serch_conditaion:用來(lái)限定返回行的搜索條件--GROUP BY group_by_expression]:用來(lái)指定查到結(jié)果的分組條件--Having serch_conditaion:用來(lái)指定組成或聚合的搜索條件--Order by order_expression[ASC|DESC]:用來(lái)指定結(jié)果集的排序方式

二、PIVOT 行轉(zhuǎn)列
注意:PIVOT、UNPIVOT是SQL Server 2005的語(yǔ)法,使用需修改數(shù)據(jù)庫(kù)兼容級(jí)別在數(shù)據(jù)庫(kù)屬性->選項(xiàng)->兼容級(jí)別改為 90
PIVOT用于將列值旋轉(zhuǎn)為列名(即行轉(zhuǎn)列),在SQL Server2000可以用聚合函數(shù)配合CASE語(yǔ)句實(shí)現(xiàn)
PIVOT的一般語(yǔ)法是:PIVOT(聚合函數(shù)(列) FOR 列 in (…) )AS P
完整語(yǔ)法:
table_source --數(shù)據(jù)源
PIVOT(
聚合函數(shù)(value_column) --統(tǒng)計(jì)轉(zhuǎn)化行值的聚合函數(shù)值
FOR pivot_column --需要轉(zhuǎn)化的行列名
IN(<column_list>) --行值得結(jié)合
)
典型實(shí)例:

1、建立表格ifobject_id('tb')isnotnulldroptabletbgocreate table tb (姓名varchar(10),課程varchar(10),分?jǐn)?shù)int)insert into tb values ('張三','語(yǔ)文',74)insert into tb values ('張三','數(shù)學(xué)',83)insert into tb values ('張三','物理',93)insertintotbvalues ('李四','語(yǔ)文',74)insert into tb values ('李四','數(shù)學(xué)',84)insert into tb values ('李四','物理',94)goselect * from tbgo姓名 課程 分?jǐn)?shù)---------- ---------- -----------張三 語(yǔ)文 74張三 數(shù)學(xué) 83張三 物理 93李四 語(yǔ)文 74李四 數(shù)學(xué) 84李四 物理 94 2、使用SQL Server 2000靜態(tài)SQL--cselect姓名, max(case 課程 when '語(yǔ)文' then 分?jǐn)?shù) else 0 end)語(yǔ)文, max(case 課程 when '數(shù)學(xué)' then 分?jǐn)?shù) else 0 end)數(shù)學(xué), max(case 課程 when '物理' then 分?jǐn)?shù) else 0 end)物理from tbgroup by 姓名姓名 語(yǔ)文 數(shù)學(xué) 物理---------- ----------- ----------- -----------李四 74 84 94張三 74 83 93 3、使用SQL Server 2005靜態(tài)SQLselect*fromtb pivot(max(分?jǐn)?shù))for課程in(語(yǔ)文,數(shù)學(xué),物理))a
三、
UNPIVOT用于將列明轉(zhuǎn)為列值(即列轉(zhuǎn)行),在SQL Server 2000可以用UNION來(lái)實(shí)現(xiàn)
完整語(yǔ)法:
table_source --數(shù)據(jù)源 轉(zhuǎn)化后的表結(jié)構(gòu)查詢 例如:select 姓名,課程,分?jǐn)?shù) from tb1
UNPIVOT(
value_column --列值(本身列名的值 如:語(yǔ)文 列 值 83 ) 例如:分?jǐn)?shù)
FOR pivot_column --列名 (集合列轉(zhuǎn)成行后的名字 例如:課程)
IN(<column_list>) --集合參數(shù)(例如:[語(yǔ)文],[數(shù)學(xué)],[物理])
)
示例:

create table tb(姓名varchar(10),語(yǔ)文int,數(shù)學(xué)int,物理int)insert into tb values('張三',74,83,93)insert into tb values('李四',74,84,94)goselect *from tbgo姓名 語(yǔ)文 數(shù)學(xué) 物理---------- ----------- ----------- -----------張三 74 83 93李四 74 84 94 2、使用SQL Server 2000靜態(tài)SQL--SQL SERVER 2000靜態(tài)SQL。select*from( select 姓名,課程='語(yǔ)文',分?jǐn)?shù)=語(yǔ)文 from tb union all select姓名,課程='數(shù)學(xué)',分?jǐn)?shù)=數(shù)學(xué) from tb union all select姓名,課程='物理',分?jǐn)?shù)=物理 from tb) torder b y 姓名,case 課程 when '語(yǔ)文' then 1 when '數(shù)學(xué)' then 2 when '物理' then 3 end姓名 課程 分?jǐn)?shù)---------- ---- -----------李四 語(yǔ)文 74李四 數(shù)學(xué) 84李四 物理 94張三 語(yǔ)文 74張三 數(shù)學(xué) 83張三 物理 932、使用SQL Server 2005靜態(tài)SQL--SQL SERVER 2005動(dòng)態(tài)SQLselect 姓名,課程,分?jǐn)?shù) from tb unpivot ( 分?jǐn)?shù) for 課程 in([語(yǔ)文],[數(shù)學(xué)],[物理])) t
四、merge 用于2張表更新的常用關(guān)鍵字
基本語(yǔ)法:
MERGE table --要匹配的目標(biāo)表 ausing scourtb --查詢的源數(shù)據(jù)或者元數(shù)據(jù)表名 bon conditaion --元數(shù)據(jù)與目標(biāo)表的匹配條件whenmatchedthen --匹配成功updateseta.字段=X --一般匹配成功都是執(zhí)行更新whennotmatchedthen --匹配不成功insert(A字段)values(對(duì)應(yīng)的值); --執(zhí)行插入 向目標(biāo)表插入元數(shù)據(jù)的新數(shù)據(jù)WHEN NOT MATCHED BY SOURCE THENDELETE; -- 目標(biāo)表有,源表沒有,目標(biāo)表該數(shù)據(jù)刪除.
示例:
create table employee(empid integer,fname nvarchar(20),lname nvarchar(20))insert into employeeselect 2021110,'小','張' insert into employeeselect 2021110,'小','李' create table test(id integer,num integer) insert into testselect 2021110,2 insert into testselect 2,2 期望結(jié)果語(yǔ)句:select * from employee2021110,'大','張'2021110,'大','李'2,'大','大'

SQL語(yǔ)句實(shí)現(xiàn):

merge into employee a using test b on b.id = a.empid when matched then update set a.fname= '大' when not matched then insert values (id,'大','大'); end exec test_mergeselect * from employee /*empid fname lname----------- -------------------- --------------------2021110 大 張2021110 大 李2 大 大 (3 行受影響)

五、sql STUFF用法
1、作用
刪除指定長(zhǎng)度的字符,并在指定的起點(diǎn)處插入另一組字符。
2、語(yǔ)法
STUFF ( character_expression , start , length ,character_expression )
3、示例
以下示例在第一個(gè)字符串 abcdef 中刪除從第 2 個(gè)位置(字符 b)開始的三個(gè)字符,然后在刪除的起始位置插入第二個(gè)字符串,從而創(chuàng)建并返回一個(gè)字符串
SELECT STUFF('abcdef', 2, 3, 'ijklmn')GO
下面是結(jié)果集
aijklmnef
4、參數(shù)character_expression
一個(gè)字符數(shù)據(jù)表達(dá)式。character_expression 可以是常量、變量,也可以是字符列或二進(jìn)制數(shù)據(jù)列。
start
一個(gè)整數(shù)值,指定刪除和插入的開始位置。如果 start 或 length 為負(fù),則返回空字符串。如果 start 比第一個(gè) character_expression長(zhǎng),則返回空字符串。start 可以是 bigint 類型。
length
一個(gè)整數(shù),指定要?jiǎng)h除的字符數(shù)。如果 length 比第一個(gè) character_expression長(zhǎng),則最多刪除到最后一個(gè) character_expression 中的最后一個(gè)字符。length 可以是 bigint 類型。
5、返回類型如果 character_expression 是受支持的字符數(shù)據(jù)類型,則返回字符數(shù)據(jù)。如果 character_expression 是一個(gè)受支持的 binary 數(shù)據(jù)類型,則返回二進(jìn)制數(shù)據(jù)。
6、備注如果結(jié)果值大于返回類型支持的最大值,則產(chǎn)生錯(cuò)誤。
六、sql for xml path用法
一.FOR XML PATH 簡(jiǎn)單介紹
那么還是首先來(lái)介紹一下FOR XML PATH ,假設(shè)現(xiàn)在有一張興趣愛好表(hobby)用來(lái)存放興趣愛好,表結(jié)構(gòu)如下:
接下來(lái)我們來(lái)看應(yīng)用FOR XML PATH的查詢結(jié)果語(yǔ)句如下:
SELECT*FROM@hobbyFORXMLPATH結(jié)果:


<row><hobbyID>1</hobbyID><hName>爬山</hName></row><row><hobbyID>2</hobbyID><hName>游泳</hName></row><row><hobbyID>3</hobbyID><hName>美食</hName></row>


由此可見FOR XML PATH 可以將查詢結(jié)果根據(jù)行輸出成XML各式!
那么,如何改變XML行節(jié)點(diǎn)的名稱呢?代碼如下:
SELECT*FROM@hobbyFORXMLPATH('MyHobby')結(jié)果一定也可想而知了吧?沒錯(cuò)原來(lái)的行節(jié)點(diǎn)<row> 變成了我們?cè)赑ATH后面括號(hào)()中,自定義的名稱<MyHobby>,結(jié)果如下:


<MyHobby><hobbyID>1</hobbyID><hName>爬山</hName></MyHobby><MyHobby><hobbyID>2</hobbyID><hName>游泳</hName></MyHobby>新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注