第一篇:Sql Server2005 Transact-SQL 新兵器學(xué)習(xí)總結(jié)之-公用表表達(dá)式(CTE)
公用表表達(dá)式是Sql Server2005新增加的一個非常好用的功能。
公用表表達(dá)式(CTE)可以認(rèn)為是在單個 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 語句的執(zhí)行范圍內(nèi)定義的臨時(shí)結(jié)果集。
CTE 與派生表類似,具體表現(xiàn)在不存儲為對象,并且只在查詢期間有效。與派生表的不同之處在于,CTE 可自引用,還可在同一查詢中引用多次。
CTE可用于:
1.創(chuàng)建遞歸查詢(我個人認(rèn)為CTE最好用的地方)2.在同一語句中多次引用生成的表 CTE優(yōu)點(diǎn): 使用 CTE 可以獲得提高可讀性和輕松維護(hù)復(fù)雜查詢的優(yōu)點(diǎn)。
查詢可以分為單獨(dú)塊、簡單塊、邏輯生成塊。之后,這些簡單塊可用于生成更復(fù)雜的臨時(shí) CTE,直到生成最終結(jié)果集。
CTE可使用的范圍:
可以在用戶定義的例程(如函數(shù)、存儲過程、觸發(fā)器或視圖)中定義 CTE。
下面看一個簡單的CTE例題:
把test表中salary最大的id記錄保存在test_CTE中,再調(diào)用
with test_CTE(id,salary)as(select id ,max(salary)from test group by id)select * from test_cte
由上面例題可以看出:
CTE 由表示 CTE 的表達(dá)式名稱、可選列列表和定義 CET 的查詢組成。
定義 CTE 后,http://mmm.qqq23.com 可以在 SELECT、INSERT、UPDATE 或 DELETE 語句中對其進(jìn)行引用,就像引用表或視圖一樣。簡單的說CTE可以替代臨時(shí)表和表變量的功能。
我個人認(rèn)為cte最好用的地方是創(chuàng)建遞歸查詢,下面演示一下這功能: 現(xiàn)有一數(shù)據(jù)結(jié)構(gòu)如下:
這些數(shù)據(jù)存放在表Co_ItemNameSet中,表結(jié)構(gòu)和部分?jǐn)?shù)據(jù)如下: ItemId ParentItemId ItemName 2 0 管理費(fèi)用 3 0 銷售費(fèi)用 4 0 財(cái)務(wù)費(fèi)用 5 0 生產(chǎn)成本 35 5 材料 36 5 人工 37 5 制造費(fèi)用 38 35 原材料 39 35 主要材料 40 35 間輔材料 41 36 工資 42 36 福利 43 36 年獎金
現(xiàn)在需求是:我想查詢ItemId=2,也就是管理費(fèi)用和其下屬所有節(jié)點(diǎn)的信息 通過CTE可以很簡單達(dá)到需求要的數(shù)據(jù)
為了體現(xiàn)CTE的方便性,我特意也寫了一個sql2000版本的解決方法,先看看sql2000是怎么解決這個問題的
--sql2000版本 DECLARE @i INT SELECT @i=2;http://www.tmdps.cn /* 使用臨時(shí)表作為堆棧來跟蹤所有正在處理中的項(xiàng)目(已經(jīng)開始但尚未結(jié)束)。某個項(xiàng)目一旦處理完畢,將被從堆棧中刪除。當(dāng)發(fā)現(xiàn)新的項(xiàng)目時(shí),這些項(xiàng)目將被添加到堆棧中。*/
CREATE TABLE #tem([ItemId] [INT] NOT NULL, [level] INT);/* 存放結(jié)果 */
CREATE TABLE #list([ItemId] [INT] NOT NULL, [ParentItemId] [INT] NOT NULL DEFAULT((0)), [ItemName] [nvarchar](100)NOT NULL DEFAULT(''), [level] INT);
INSERT INTO #tem([ItemId],[level])SELECT ItemId, 1 FROM Co_ItemNameSet WHERE itemid=@i
INSERT INTO #list([ItemId],[ParentItemId],[ItemName],[level])SELECT ItemId, ParentItemId, ItemName ,1 FROM Co_ItemNameSet WHERE itemid=@i
DECLARE @level INT SELECT @level=1
DECLARE @current INT SELECT @current=0
/* 當(dāng) @level 大于 0 時(shí),執(zhí)行以下步驟:
1.如果當(dāng)前級別(@level)的堆棧中有項(xiàng)目,就選擇其中一個,并稱之為 @current。2.從堆棧中刪除該項(xiàng)目以免重復(fù)處理它,然后將其所有子項(xiàng)目添加到堆棧的下一級(@level + 1)中。
3.如果有子項(xiàng)目(IF @@ROWCOUNT > 0),則下降一級處理它們(@level = @level + 1);否則,繼續(xù)在當(dāng)前級別上處理。
4.最后,如果在當(dāng)前級別的堆棧中沒有待處理的項(xiàng)目,則返回到上一級,看上一級是否有待處理的項(xiàng)目(@level = @level-1)。當(dāng)再沒有上一級時(shí),則完畢。*/
WHILE(@level>0)BEGIN
SELECT @current=ItemId FROM #tem WHERE [level]=@level
IF @@ROWCOUNT>0
BEGIN
--從堆棧中刪除該項(xiàng)目以免重復(fù)處理它
DELETE FROM #tem WHERE [level]=@level and ItemId=@current
--將其所有子項(xiàng)目添加到堆棧的下一級(@level + 1)中。
INSERT INTO #tem([ItemId],[level])SELECT [ItemId],@level+
1FROM Co_ItemNameSet WHERE ParentItemId=@current
--將其所有子項(xiàng)目添加
INSERT INTO #list([ItemId],[ParentItemId],[ItemName],[level])SELECT [ItemId],[ParentItemId],[ItemName] ,@level+1
FROM Co_ItemNameSet WHERE ParentItemId=@current
IF @@rowcount>0
BEGIN
SELECT @level=@level+1
END
END
ELSE
BEGIN
SELECT @level=@level-1
END END--顯示結(jié)果
SELECT * FROM #list
DROP TABLE #tem DROP TABLE #list go
結(jié)果如下:
ItemId ParentItemId ItemName level 2 0 管理費(fèi)用 1 52 2 汽車費(fèi)用 2 55 2 招聘費(fèi) 2 56 2 排污費(fèi) 2 53 52 燃料 3 54 52 輪胎 3
大家看到sql2000解決這個問題比較麻煩,要實(shí)現(xiàn)這需求編寫的代碼比較多,比較復(fù)雜 現(xiàn)在好了,在sql2005中通過CTE的遞歸特點(diǎn)可以2步就實(shí)現(xiàn).得到同樣的結(jié)果,sql2005的CTE代碼簡單了許多.這就是CTE支持遞歸查詢的魅力。請看下面的代碼:
--sql2005版本 DECLARE @i INT SELECT @i=2;
WITH Co_ItemNameSet_CTE(ItemId, ParentItemId, ItemName,Level)AS(SELECT ItemId, ParentItemId, ItemName ,1 AS [Level]
FROM Co_ItemNameSet WHERE itemid=@i
UNION ALL
SELECT c.ItemId, c.ParentItemId, c.ItemName ,[Level] + 1 FROM Co_ItemNameSet c INNER JOIN Co_ItemNameSet_CTE ct ON c.ParentItemId=ct.ItemId)
SELECT * FROM Co_ItemNameSet_CTE go
Sql Server2005 Transact-SQL 新兵器學(xué)習(xí)總結(jié)之-TOP 運(yùn)算符
TOP 運(yùn)算符介紹:
TOP 運(yùn)算符在Sql Server2005得到了增強(qiáng),可以使用任何數(shù)值表達(dá)式(如變量名),而不是僅使用整數(shù)來指定該運(yùn)算符返回的行數(shù)。TOP 現(xiàn)在還可以在 INSERT、UPDATE 和 DELETE 語句中指定。TOP 運(yùn)算符的幾個使用總結(jié):
1.TOP 表達(dá)式可用在 SELECT、INSERT、UPDATE 和 DELETE 語句中。2.Top表達(dá)式可以是常量,變量,子查詢
3.取代set rowcount,可以防止鎖升級,提高效率
特別提示: 與INSERT、UPDATE 或 DELETE 一起使用的 TOP 表達(dá)式中被引用行將不按任何順序排列。
TOP n 隨機(jī)返回 n 行。
例如,下面的 INSERT 語句包含 ORDER BY 子句,但該子句并不影響由 INSERT 語句直接引用的行。請看例題:
有1個test表,表結(jié)構(gòu)和表中數(shù)據(jù)如下: select * from test
id salary manid 100 6500 100 200 5500 200 101 6600 100 102 6200 100 103 5100 100 104 6700 100 201 5800 200 202 4200 200 執(zhí)行下面的語句:
declare @t table(id int,salary int,manid int)
INSERT TOP(2)INTO @t SELECT id, salary, manid from test ORDER BY salary asc
select * from @t
結(jié)果如下:
id salary manid 100 6500 100 200 5500 200
上個查詢中的 ORDER BY 子句僅引用嵌套 SELECT 語句返回的行。INSERT 語句選擇 SELECT 語句返回的任意兩行。
若要確保插入 SELECT 子查詢返回的前兩行,可以按如下寫該查詢。
declare @t table(id int,salary int,manid int)
INSERT INTO @t
SELECT TOP(2)id, salary, manid from test ORDER BY salary asc
select * from @t
結(jié)果如下:
id salary manid 202 4200 200 103 5100 100
TOP 運(yùn)算符在Sql Server2005得到了增強(qiáng),Top表達(dá)式可以是常量,變量,子查詢
下面我們再來看另個例題:
create table test2([no] int , n nvarchar(100))
insert into test2([no],n)select 1,'a' union select 2,'b' union select 3,'c' union
select 3,'c2' union
select 2,'b2' union
select 2,'b3' go
select * from test2 order by [no] asc go
結(jié)果如下: no n 1 a 2 b 2 b2 2 b3 3 c 3 c2
1.利用top變量,篩選no最小的2行
--利用top變量,篩選no最小的2行 declare @i int select @i = 2 select top(@i)* from test2 order by [no] asc go
結(jié)果如下: no n 1 a 2 b 我們可以看到,在Sql Server2005中top后面跟的可以是變量了,而在Sql Server2000中必須是常量才可以
要在Sql Server2000實(shí)現(xiàn)上述功能比較麻煩,需要用到動態(tài)sql語句,請看下面代碼:
--Sql Server2000版本 declare @i int select @i = 2
declare @sql nvarchar(255)select @sql=''
select @sql='select top('+ convert(nvarchar(100),@i)+')* from test2 order by [no] asc' exec(@sql)
2.利用top子查詢來篩選 select top(select count([no])from test2 where [no]=3)* from test2 order by [no] asc go
結(jié)果如下: no n 1 a 2 b
3.WITH TIES參數(shù):
指定從基本結(jié)果集中返回更多的行,返回的行與TOP n(PERCENT)行中的最后一行在ORDER BY 列中具有相同的值。
只有在指定ORDER BY 子句之后才能指定TOP WITH TIES。
--返回no前2行,并還返回no=2的行 select top(2)WITH TIES * from test2 order by [no] asc go
第二篇:中小學(xué)信息技術(shù)“在Excell中制作圖表”的講授新課與歸納總結(jié)之學(xué)習(xí)總結(jié)
中小學(xué)信息技術(shù)“在Excell中制作圖表”的講授新課與歸納總結(jié)
學(xué)習(xí)總結(jié)
我聽了溫曉捷老師主講的中小學(xué)信息技術(shù)《“在Excell中制作圖表”的講授新課與歸納總結(jié)》。知道了這節(jié)課是從課堂教學(xué)中的主要環(huán)節(jié)——教授新課;如何分段掌控課堂教學(xué)時(shí)間;教學(xué)過程與師生互動的對應(yīng)關(guān)系;“總結(jié)歸納”教學(xué)環(huán)節(jié)的意義;常用的“總結(jié)歸納”形式;“課后作業(yè)”的三個功能。六個角度對課堂教學(xué)五個環(huán)節(jié)中的講授新課、歸納總結(jié)和布置課后作業(yè)進(jìn)行了探討。并且對這節(jié)課做了相關(guān)的筆記。
然后看了宋東艷老師設(shè)計(jì)的《 Excel中制作圖表》一課,詳細(xì)的介紹教學(xué)的各個環(huán)節(jié)和總結(jié)歸納的形式和意義。本課的教學(xué)始終圍繞著“圖表的作用和圖表類型的選擇”教學(xué)重點(diǎn)展開。通過一環(huán)套一環(huán)的教學(xué)活動及恰當(dāng)?shù)娜蝿?wù)設(shè)計(jì),將圖表的作用闡述的明白清晰,讓學(xué)生很清楚地掌握了柱型圖、餅圖、折線圖常用的范圍。很好地調(diào)動了學(xué)生的學(xué)習(xí)積極性和興趣,充分說明教師對學(xué)生情況十分了解,能依據(jù)學(xué)生特點(diǎn),選用適當(dāng)?shù)慕虒W(xué)手段,因此收到了良好的教學(xué)效果。從而使自己地溫曉捷老師的專題講座有了進(jìn)一步的理解。
同時(shí)我與一起的學(xué)員進(jìn)入了交流,且回答了“思考與活動”板塊的相關(guān)問題。總之通過聽講、析案、交流、回答問題,感覺對本講座的認(rèn)識提高了一個層次,且提高自己的教育理論水平,讓自己的遠(yuǎn)程培訓(xùn)走入了一新的階段。