亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

SQL點(diǎn)滴9—使用with語句來寫一個(gè)稍微復(fù)雜sql語句,附加和子查詢的性能對比

2019-11-03 08:33:10
字體:
供稿:網(wǎng)友
今天偶爾看到sql中也有with關(guān)鍵字,好歹也寫了幾年的sql語句,居然第一次接觸,無知啊??戳艘晃徊┲鞯奈恼拢约禾砑恿艘恍﹥?nèi)容,做了簡單的總結(jié),這個(gè)語句還是第一次見到,學(xué)習(xí)了。我從簡單到復(fù)雜地寫,希望高手們不要見笑。下面的sql語句設(shè)計(jì)到三個(gè)表,表的內(nèi)容我用txt文件復(fù)制進(jìn)去,這里不妨使用上一個(gè)隨筆介紹的建立端到端的package的方法將這些表導(dǎo)入到數(shù)據(jù)庫中,具體的就不說了。

從這里下載文件employees.txt,customers.txt,orders.txt

參考文章:http://www.cnblogs.com/wwan/archive/2011/02/24/1964279.html

使用package導(dǎo)入數(shù)據(jù):http://www.cnblogs.com/tylerdonet/archive/2011/04/17/2017471.html

簡單的聚合

從orders表中選擇各個(gè)年份共有共有多少客戶訂購了商品

  •  第一種寫法,我們可以寫成這樣
    1select YEAR(o.orderdate) orderyear,COUNT(distinct(custid)) numCusts
    2from Sales.Orders o
    3group by YEAR(o.orderdate)
    4go
    要注意的是如果把group by YEAR(o.orderdata)換成group by orderyear就會(huì)出錯(cuò),這里涉及到sql語句的執(zhí)行順序問題,有時(shí)間再了解一下          
  • 第二種寫法,
    1select orderyear,COUNT(distinct(custid))numCusts
    2from (select YEAR(orderdate) as orderyear,custid from sales.orders) as D
    3group by orderyear
    4go
    在from語句中先得到orderyear,然后再select語句中就不會(huì)出現(xiàn)沒有這個(gè)字段的錯(cuò)誤了
  • 第三種寫法,
    1select orderyear,COUNT(distinct(custid)) numCusts
    2from (select YEAR(orderdate),custid from sales.orders) as D(orderyear,custid)
    3group by orderyear
    4go
    在as D后面加上選擇出的字段,是不是更加的清楚明了呢!
  • 第四種寫法,with出場了
    1with c as(
    2select YEAR(orderdate) orderyear, custid from sales.orders)
    3select orderyear,COUNT(distinct(custid)) numCusts from c group by orderyear
    4go
    with可以使語句更加的經(jīng)湊,下面是權(quán)威解釋?! ?BR>    
    指定臨時(shí)命名的結(jié)果集,這些結(jié)果集稱為公用表表達(dá)式 (CTE)。該表達(dá)式源自簡單查詢,并且在單條 SELECT、INSERT、UPDATE、MERGE 或 DELETE 語句的執(zhí)行范圍內(nèi)定義。該子句也可用在 CREATE VIEW 語句中,作為該語句的 SELECT 定義語句的一部分。公用表表達(dá)式可以包括對自身的引用。這種表達(dá)式稱為遞歸公用表達(dá)式?!              ?/EM>

                                                ----MSDN

  • 第五種寫法,也可以借鑒第三種寫法,這樣使語句更加清楚明了,便于維護(hù)
    1 with c(orderyear,custid) as(
    2  select YEAR(orderdate),custid from sales.orders)
    3  select orderyear,COUNT(distinct(custid)) numCusts from c group by c.orderyear
    4  go
    上面5中寫法都得到相同的結(jié)果,如下圖1:圖1

添加計(jì)算

  • 現(xiàn)在要求要求計(jì)算出訂單表中每年比上一年增加的客戶數(shù)目,這個(gè)稍微復(fù)雜
    1 with yearcount as(
    2  select YEAR(orderdate) orderyear,COUNT(distinct(custid)) numCusts from sales.orders group by YEAR(orderdate))
    3  select cur.orderyear curyear,cur.numCusts curNumCusts,PRv.orderyear prvyear,prv.numCusts prvNumCusts,cur.numCusts-prv.numCusts growth
    4  from yearcount cur left join yearcount prv on cur.orderyear=prv.orderyear+1
    5 go
    這里兩次使用到with結(jié)果集。查詢得到的結(jié)果如下圖2

    圖2

復(fù)雜的計(jì)算

  • 查找客戶id,這些客戶和所有來自美國的雇員至少有一筆交易記錄,查詢語句如下
    1 with TheseEmployees as(
    2 select empid from hr.employees where country='USA'),
    3 CharacteristicFunctions as(
    4 select custid,
    5 case when custid in (select custid from sales.orders as o where o.empid=e.empid) then 1 else 0 end as charfun
    6 from sales.customers as c cross join TheseEmployees as e)
    7 select custid,min(charfun) from CharacteristicFunctions group by custid having min(charfun)=1
    8 go
    這里嵌套with語句,第with語句查找美國雇員的id,第二個(gè)語句使用這個(gè)結(jié)果和擁有客戶的客戶id和擁有關(guān)系標(biāo)識(shí)做笛卡爾積運(yùn)算。最后從這個(gè)笛卡爾積中通過標(biāo)識(shí)找到最終的custid。
    結(jié)果如下圖3

    圖3

這里只有簡單地介紹,沒有深入,高手們不要見笑啊。



---------------------------------------------------------分界線----------------------------------------------------------

with語句和子查詢的性能比較

在博友SingleCat的提醒下,對with語句做一些性能測試,這里使用的測試工具是SQL Server Profile。我選擇了最后一個(gè)語句,因?yàn)檫@個(gè)語句比較復(fù)雜一點(diǎn)。開始的時(shí)候單獨(dú)執(zhí)行一次發(fā)現(xiàn)他們的差別不大,就差幾個(gè)毫秒,后來想讓他們多執(zhí)行幾次,連續(xù)執(zhí)行10

次看看執(zhí)行的結(jié)果。下面貼出測試用的語句。

1 /*with查詢*/
2 declare @withquery varchar(5000)
3 declare @execcount int=0
4 set @withquery='with TheseEmployees as(
5 select empid from hr.employees where country=N''USA''),
6 CharacteristicFunctions as(
7 select custid,
8 case when custid in (select custid from sales.orders as o where o.empid=e.empid) then 1 else 0 end as charfun
9 from sales.customers as c cross join TheseEmployees as e)
10 select custid from CharacteristicFunctions group by custid having min(charfun)=1 order by custid
11 '
12 while @execcount<10
13 begin
14 exec (@withquery);
15 set @execcount=@execcount+1
16 end
17
18 /*子查詢*/
19 declare @subquery varchar(5000)
20 declare @execcount int=0
21 set @subquery='select custid from Sales.Orders where empid in
22 (select empid from HR.Employees where country = N''USA'') group by custid
23 having count(distinct empid)=(select count(*) from HR.Employees where country = N''USA'');
24 '
25 while @execcount<10
26 begin
27 exec (@subquery);
28 set @execcount=@execcount+1
29 end

SQL Server Profile中截圖如下

從圖中可以看到子查詢語句的執(zhí)行時(shí)間要少于with語句,我覺得主要是with查詢中有一個(gè)cross join做了笛卡爾積的關(guān)系,于是又實(shí)驗(yàn)了上面的那個(gè)簡單一點(diǎn)的,下面是測試語句。

1 /*with語句*/
2 declare @withquery varchar(5000)
3 declare @execcount int=0
4 set @withquery='with c(orderyear,custid) as(
5 select YEAR(orderdate),custid from sales.orders)
6 select orderyear,COUNT(distinct(custid)) numCusts from c group by c.orderyear'
7 while @execcount<100
8 begin
9 exec (@withquery);
10 set @execcount=@execcount+1
11 end
12
13 /*子查詢*/
14 declare @subquery varchar(5000)
15 declare @execcount int=0
16 set @subquery='select orderyear,COUNT(distinct(custid)) numCusts
17 from (select YEAR(orderdate),custid from sales.orders) as D(orderyear,custid)
18 group by orderyear'
19 while @execcount<100
20 begin
21 exec (@subquery);
22 set @execcount=@execcount+1
23 end

 

這次做10次查詢還是沒有多大的差距,with語句用10個(gè)duration,子查詢用了11個(gè),有時(shí)候還會(huì)翻過來。于是把執(zhí)行次數(shù)改成100,這次還是子查詢使用的時(shí)間要少,截圖如下

最終結(jié)論,子查詢好比with語句效率高。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产欧美精品一区二区三区-老狼| 亚洲成人久久网| 伊人精品在线观看| 全部免费毛片在线播放一个| jizzjizz.con| 日韩av网址在线观看| 首页欧美精品中文字幕| 美女在线观看www| 国产精品无码2021在线观看| 国产精品777777在线播放| 在线国产一区二区| 男女视频免费网站| 日韩情涩欧美日韩视频| 精品人妻人人做人人爽| 在线理论视频| 椎名由奈av一区二区三区| 亚洲人成电影在线观看天堂色| 国产美女做爰免费视频软件| 99久久国产综合精品女小说| 一区二区三区产品免费精品久久75| 美女的胸无遮挡在线观看| 在线免费观看高清视频| 菠萝蜜一区二区| 日韩国产欧美在线视频| 国产一级成人av| 久久成人一区二区| 神马久久桃色视频| 在线精品亚洲一区二区| 日韩在线视频网| 欧美久久久久久久久中文字幕| 成人羞羞视频播放网站| 欧美性在线视频| 国产又色又爽又黄的| 可以在线看的黄色网址| 久久久久亚洲av无码专区桃色| 国产日韩精品suv| 日日躁天天躁狠狠躁| 久久久久综合网| 欧美视频在线看| 福利精品一区| 浪潮av一区| 国产一区999| 国产精品视频最多的网站| 成人在线小视频| 国产极品久久久久久久久波多结野| jazzjazz国产精品久久| av毛片免费看| 久久久亚洲精选| 国产精品久久久久久一区二区三区| 不卡av免费在线| 国产精品女主播在线观看| 亚洲人成自拍网站| 欧美日韩性视频一区二区三区| 亚洲一区激情| 久久亚洲一区二区三区四区五区高| 国产精品久久久久国产a级| 日本免费网站在线观看| 亚洲一级理论片| 欧美艳星介绍134位艳星| 亚洲女人18毛片水真多| aⅴ在线视频男人的天堂| 欧美高清性hdvideosex| 国产中文字幕在线视频| 欧美一区二区影院| 激情六月丁香婷婷| 唐朝av高清盛宴| 在线观看国产网站| 香蕉青柠影院| 欧美日韩一区二区在线观看| 久久综合视频网| 国产成人一区二区在线| 国产一级免费观看| 成a人片在线观看www视频| 婷婷丁香花五月天| 日本欧美色综合网站免费| 欧美黑人xxxx| 88av看到爽| 国产精品久久久久久久精| 成人免费看片网站| 18以下岁禁止1000部免费| 精品国模一区二区三区| 国产欧美久久久久| 亚洲AV无码片久久精品| 伊人影院中文字幕| 9色在线视频| 国产亚洲精品午夜高清影院| 欧美性天天影视| 91精品婷婷国产综合久久竹菊| 九九热在线免费视频| 国产三级久久久| 高清av免费一区中文字幕| 国产高中女学生第一次| 午夜精品福利一区二区三区av| 九九99精品| 日韩精品―中文字幕| 欧美一区二区公司| 全球av集中精品导航福利| 三级黄色片在线观看| 99视频在线看| 国语对白精品一区二区| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品国模在线| 国产女主播在线播放| 成人国产综合| 99热在线国产| 亚洲高清免费在线| 五月天婷婷久久| 亚洲精品videossex少妇| 三妻四妾完整版在线观看电视剧| 欧美在线视频播放| 国产一区二区在线视频播放| 精品日本美女福利在线观看| 精品一区二区三区免费爱| 樱花草国产18久久久久| 久久久久久久久久久福利| 日本高清成人免费播放| 99在线免费观看| 欧美成人xxxx| 日韩欧美一二区| 北条麻妃一区二区三区在线| 麻豆中文字幕在线观看| 91一区二区三区在线观看| 91精品一区二区三区四区| 中文一区二区完整视频在线观看| 日韩精品在在线一区二区中文| 国产视频不卡在线| 日本免费在线视频观看| 国产视频二区| 欧美婷婷六月丁香综合色| 亚洲97在线观看| 国产一区二区在线视频播放| 欧美福利网址| 亚洲美女av电影| 免费男女羞羞的视频网站中文字幕| 亚洲狠狠婷婷综合久久蜜桃| 久久九九国产精品| www.成人.com| 97公开免费视频| 日韩激情视频在线播放| 精品视频中文字幕| 国产69精品久久久| 97在线视频精品| 国内成人精品| 污版视频在线观看| 麻豆精品在线播放| www成人免费| 97品白浆高清久久久久久| 日日爱66.cn| 战狼4完整免费观看在线播放版| 久久久久久久久久久久国产| 国产亚洲婷婷免费| 久久久久久久av麻豆果冻| 成年人在线观看视频免费| 亚洲一级二级三级在线免费观看| 日韩精品在线观看一区| 成人av地址| 免费久久99精品国产自在现线| 日本中文字幕高清| 中国极品少妇xxxx| 日韩欧美国产一二三区| 欧美一区二区三区四区五区| 精品亚洲一区二区三区四区五区| 亚洲日韩中文字幕| 牛牛精品成人免费视频| 成人一区二区三区| 在线精品视频播放| 国产一区二区视频在线观看免费| 在线看片福利| 亚洲午夜无码久久久久| 19禁羞羞电影院在线观看| 99国产精品久久久久久久久久| 日本成人一级片| 成人福利在线视频| 国产精华一区二区三区| 亚洲调教视频在线观看| 一本一道久久a久久精品综合蜜臀| 国产精品一区二区三区视频网站| 国自产精品手机在线观看视频| 亚洲黄色免费三级| 999在线观看视频| 久久高清精品| 欧美国产日本在线| 久久艹中文字幕| 中文字幕久热精品在线视频| 69av在线| 秋霞精品一区二区三区| 十九岁完整版在线观看好看云免费| 国产视频在线视频| 另类视频在线观看+1080p| 一区二区亚洲精品国产| 亚洲欧美日韩国产一区二区三区| av一区在线| 欧美成人国产| 制服丝袜亚洲播放| 国产野外作爱视频播放| 成人午夜免费影院| 麻豆精品国产传媒av| 亚洲三级电影| 欧美成人在线直播| 亚洲一区不卡| 丰满少妇一区二区| 国产麻豆视频| 欧美视频在线免费看| 伊人影院蕉久552| 真人bbbbbbbbb毛片| 久操免费在线| 色屁屁影院www国产高清麻豆| 91free张津瑜movies| 亚洲一区二区三区在线看| 国产午夜精品免费一区二区三区| 午夜免费久久看| 今天的高清视频免费播放成人| 91精品国产91久久久久久| 要久久爱电视剧全集完整观看| 久久视频免费在线播放| 欧美专区一区| 麻豆一区二区三区精品视频| 91蜜桃视频在线| www色aa色aawww| 久久在线免费视频| 日本加勒比高清在线| 日本在线成人一区二区| 久久99久久99精品免费看小说| 波多野结衣家庭教师视频| 韩国19禁主播vip福利视频| 亚洲一二三区视频在线观看| 99久久免费精品国产72精品九九| 色女人在线视频| 欧美在线性爱视频| 欧美日韩在线播放一区二区| 一区二区三区四区五区视频| 欧美网站大全在线观看| 天天舔天天干天天操| 国产经典av| 杨钰莹一级淫片aaaaaa播放| av在线1区2区| 91久久精品日日躁夜夜躁国产| 久久亚洲成人av| 中文乱码免费一区二区三区下载| 亚洲免费一区三区| 国产日韩欧美黄色| 人人妻人人藻人人爽欧美一区| 亚洲精品在线观看av| 丰满的护士2在线观看高清| 成人午夜伦理影院| 欧美成人免费一级人片100| 亚洲色图综合| 日韩视频免费播放| 国产白浆在线免费观看| 交videos老少配com| 欧美tickling网站挠脚心| 日韩在线视频一区| 欧美另类bbbxxxxx另类| 免费尤物视频| 国产人妻精品一区二区三| 成人免费网站在线观看| 国产九九视频一区二区三区| 国产日韩欧美中文字幕| 小说区视频区图片区| 自拍亚洲图区| 亚洲精品天堂网| 国产又爽又黄ai换脸| 亚洲一区在线观看视频| 91看片就是不一样| 三级小说一区| av有码在线观看| 久久大香伊蕉在人线观看热2| 国产av国片精品| 1024精品一区二区三区| 黑人巨大猛交丰满少妇| 久久婷婷蜜乳一本欲蜜臀| 久久成年人免费电影| 夜鲁夜鲁夜鲁视频在线播放| 粉嫩一区二区| 免费一区二区三区视频导航| 少妇久久久久久被弄到高潮| 国产精品久av福利在线观看| 日韩一级视频在线观看| 99久久精品免费看国产交换| 日韩成人久久久| 午夜视频一区二区三区| 欧美成人免费播放| 国产一区二区在线视频播放| 欧美日韩欧美一区二区| 男人添女荫道口女人有什么感觉| 狠狠操视频网| 色涩视频在线观看| 中文字幕亚洲欧美日韩| 久久精品国产亚洲一区二区三区| 色综合导航网站| 99亚洲男女激情在线观看| 国产69精品久久久久9999小说| 97碰碰碰免费公开在线视频| xfplay资源站色先锋在线观看| av免费在线一区| 嫩草影院在线观看未满十八| 久久久精品黄色| 国产无套粉嫩白浆内谢| 99精品视频免费| 精品国产凹凸成av人网站| 亚洲电影成人成人影院| 4444kk亚洲人成电影在线| 国产午夜精品久久久久久久| 日韩欧美久久久| 亚洲精品日韩一| 国产东北露脸精品视频| 性生交大片免费全黄| 蜜桃av乱码一区二区三区| 久久99亚洲网美利坚合众国| 欧美极品另类| 成人深夜直播免费观看| 粉嫩高清一区二区三区精品视频| 人妻精油按摩bd高清中文字幕| 老牛国产精品一区的观看方式| 亚洲韩国青草视频| 1卡2卡3卡精品视频| 久久香蕉国产线看观看网| 一区二区三区精彩视频| 午夜性色福利影院| 成人黄色小视频| 国产伦精品一区二区三区视频青涩| ㊣最新国产の精品bt7086| 免费观影入口看日本视频| 在线免费观看av影视天堂| 丰满少妇大力进入| 国产精品yjizz视频网一二区| 国产一级在线视频| 一区二区三区观看|