国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

數(shù)據(jù)庫點滴之T-SQL面試語句,練練手

數(shù)據(jù)庫
請和我一起看看我們的筆者在使用SQL Server中的一些點滴事件吧,雖然事件不大,但是總有對你有幫助的。

1. 用一條SQL語句 查詢出每門課都大于80分的學(xué)生姓名

  • name kecheng fenshu
  • 張三   語文       81
  • 張三   數(shù)學(xué)       75
  • 李四   語文       76
  • 李四   數(shù)學(xué)       90
  • 王五   語文       81
  • 王五   數(shù)學(xué)     100
  • 王五   英語       90

思路:這里不能直接用 分?jǐn)?shù)>80這樣的比較條件來查詢的到結(jié)果,因為要求沒門成績都大于80。我們可以反過來思考,如果有一門成績小于80,那么就不符合要求。先找出成績表中成績<80的多有學(xué)生姓名,不能重復(fù),然后再用not in找出不再這個集合中的學(xué)生姓名。

  1. create table #成績(姓名varchar(20),課程名稱varchar(20),分?jǐn)?shù)int
  2. insert into #成績values 
  3. ('張三',     '語文',       81), 
  4. ('張三',     '數(shù)學(xué)',       75), 
  5. ('李四',     '語文',       76), 
  6. ('李四',     '數(shù)學(xué)',       90), 
  7. ('王五',     '語文',      81), 
  8. ('王五',     '數(shù)學(xué)',       100), 
  9. ('王五',     '英語',       90) 
  10.  
  11. select distinct(姓名) from #成績 where 姓名 not in(select distinct(姓名) from #成績 where 分?jǐn)?shù)<=80) 

經(jīng)luofer提示還有一種思路,是用group by + hvaing,這絕對是一種好方法。我估計出這個題的人就是要考察這個知識,代碼如下:

  1. select 姓名 from #成績  
  2. group by 姓名 
  3. having min(分?jǐn)?shù))>80 

2. 學(xué)生表 如下:

  • 自動編號     學(xué)號       姓名 課程編號 課程名稱 分?jǐn)?shù)
  •        1         2005001    張三      0001          數(shù)學(xué)       69
  •        2         2005002    李四      0001          數(shù)學(xué)       89
  •        3         2005001    張三      0001          數(shù)學(xué)       69

刪除除了自動編號不同,其他都相同的學(xué)生冗余信息

思路:這個和上面的一樣,也不能直接刪除,而是要先找出自動編號不相同,其他都相同的行,這個要使用group by語句,并且將其他的字段都放在group by后面,這樣找出來的行都是沒有冗余的行,然后隨便保留其中一個自動編號,刪除其他的行。

  1. create table #成績(自動編號 int, 學(xué)號 int,姓名 varchar(20),課程編號 int,課程名稱 varchar(20),分?jǐn)?shù) int
  2. insert into #成績 values 
  3. (1,2005001 ,'張三',  1,   '語文',       81), 
  4. (2,2005001 ,'李四',  1,   '語文',       81), 
  5. (3,2005001 ,'張三',  1,   '語文',       81), 
  6. (4,2005001 ,'張三',  1,   '語文',       81) 
  7.  
  8. select * from #成績 
  9. drop table #成績 
  10.  
  11. delete from #成績 where 自動編號 not in 
  12. (select MIN(自動編號) from #成績 group by 學(xué)號,姓名,課程編號,課程名稱,分?jǐn)?shù)) 

經(jīng)【廣島之戀】的提醒發(fā)現(xiàn)另外一種思路,代碼如下:

  1. delete from #成績 where 自動編號 not in 
  2. (select distinct(a.自動編號) from #成績 a join #成績 b on a.自動編號>b.自動編號  
  3. where a.學(xué)號=b.學(xué)號 and a.姓名=b.姓名 and a.課程編號=b.課程編號 and a.分?jǐn)?shù)=b.分?jǐn)?shù)) 

3. 一個叫department的表,里面只有一個字段name,一共有4條紀(jì)錄,分別是a,b,c,d,對應(yīng)四個球?qū)ΓF(xiàn)在四個球?qū)M(jìn)行比賽,用一條sql語句顯示所有可能的比賽組合。

思路:這是一個組合問題,就是說四個不同的元素有多少種不同的兩兩組合。現(xiàn)在要把這個問題用sql語句實現(xiàn)。既然這四個元素是不相同的,我們可以將這個表當(dāng)成兩個集合,求他們的笛卡爾積,然后再從笛卡爾積中找到那些元素不相同的,并且不重復(fù)的組合。

  1. create table #department(taname char(1)) 
  2. insert into #department values 
  3. ('a'),('b'),('c'),('d'
  4.  
  5. --下面兩條語句都可以,多謝wanglinglong提醒 
  6. select a.taname,b.taname from #department a,#department b where a.taname < b.taname 
  7. select a.taname,b.taname from #department a,#department b where a.taname > b.taname 

4.怎么把這樣一個表

  • year  month  amount
  • 1991      1         1.1
  • 1991      2         1.2
  • 1991      3         1.3
  • 1991      4         1.4
  • 1992      1         2.1
  • 1992      2         2.2
  • 1992      3         2.3
  • 1992      4         2.4

查成這樣一個結(jié)果

  • year  m1 m2 m3 m4
  • 1991 1.1 1.2 1.3 1.4
  • 1992 2.1 2.2 2.3 2.4

思路:這個很明顯是一個行列轉(zhuǎn)換,首先會想到pivot。結(jié)果中有m1,m2,m3,m4四個新的列,他們需要從原來的行中轉(zhuǎn)換。

  1. create table #sales(years int,months int,amount float
  2. insert into #sales values 
  3. (1991,   1,     1.1), 
  4. (1991,   2,     1.2), 
  5. (1991,   3,     1.3), 
  6. (1991,   4,     1.4), 
  7. (1992,   1,     2.1), 
  8. (1992,   2,     2.2), 
  9. (1992,   3,     2.3), 
  10. (1992,   4,     2.4) 
  11.  
  12. select pt.years,[1] as m1,[2] as m2,[3] as m3,[4] as m4  
  13. from (select sod.amount,sod.months,sod.years as years from  #sales sod)  so  
  14. pivot 
  15. (min(so.amount) for so.months in ([1], [2],[3],[4])) as pt 

注意[1],[2],[3],[4]中括號不可缺少,否則會出錯。還有一種寫法是使用子查詢,這個要新建4個子查詢進(jìn)而得到新的列:

  1. select a.years, 
  2. (select m.amount from #sales m where months=1 and m.years=a.years) as m1, 
  3. (select m.amount from #sales m where months=2 and m.years=a.years) as m2, 
  4. (select m.amount from #sales m where months=3 and m.years=a.years) as m3, 
  5. (select m.amount from #sales m where months=4 and m.years=a.years) as m4 
  6. from #sales a group by a.years 

5.有兩個表A和B,均有key和value兩個字段,如果B的key在A中也有,就把B的value換為A中對應(yīng)的value。這道題的SQL語句怎么寫?

思路:這個問題看似簡單,只要一個update語句,然后找到相同的key,更新value字段就可以了。可能你首先會寫成這樣:update #b set #b.value=(select #a.value from #a where #a.keys=#b.keys)。但是要注意的是如果僅僅找相同的key會有很多匹配,更新的時候會出現(xiàn)錯誤,所有要在外層限制。

  1. create table #a(keys int , value varchar(10)) 
  2. insert into #a values 
  3. (1,'aa'), 
  4. (2,'ab'), 
  5. (3,'ac'
  6. create table #b(keys int , value varchar(10)) 
  7. insert into #b values 
  8. (1,'aa'), 
  9. (2,'a'), 
  10. (3,'a'
  11.  
  12. update #b set #b.value=(select #a.value from #a where #a.keys=#b.keys) where #b.keys in 
  13. (select #b.keys from #b,#a where #a.keys=#b.keys and #a.value<>#b.value) 

在luofer的提醒之,有了第二個思路

  1. update #b set #b.value=s.value 
  2. from (select * from #a except select * from #b) s where s.keys=#b.keys 

luofer是牛人啊!

6. 兩張關(guān)聯(lián)表,刪除主表中已經(jīng)在副表中沒有的信息。

思路:這個就是存在關(guān)系,可以使用in,也可以使用exists。

  1. create table #zhubiao(id int,name varchar(5)) 
  2. insert into #zhubiao values 
  3. (1,'aa'), 
  4. (2,'ab'), 
  5. (3,'ac'
  6. create table #fubiao(id int, grade varchar(5)) 
  7. insert into #fubiao values 
  8. (1,'aa'), 
  9. (2,'ab'
  10.  
  11. delete from #zhubiao where id not in(select b.id from #fubiao b) 
  12. delete from #zhubiao where not exists(select 1 from #fubiao where #zhubiao.id=#fubiao.id) 

7. 原表:

  • courseid coursename score
  • 1        java    70
  • 2        oracle    90
  • 3            xml    40
  • 4            jsp    30
  • 5      servlet    80

為了便于閱讀,查詢此表后的結(jié)果顯式如下(及格分?jǐn)?shù)為60):

  • courseid coursename score   mark
  • 1             java   70  pass
  • 2            oracle    90  pass
  • 3              xml   40  fail
  • 4             jsp    30  fail
  • 5       servlet    80     pass

思路:這個就很直接了,使用case語句判斷一下。

  1. create table #scores(course int,coursename varchar(10),score int
  2. insert into #scores values 
  3. (1, 'java', 70 ), 
  4. (2, 'oracle', 90), 
  5. (3, 'xmls', 40), 
  6. (4, 'jsp', 30),  
  7. (5, 'servlet', 80 ) 
  8.  
  9. select course,coursename, 
  10. case when score>60 then 'pass' else 'fail' end as mark 
  11. from #scores 

8. 原表:

  • id proid proname
  • 1      1        M
  • 1      2         F
  • 2      1        N
  • 2      2        G
  • 3      1        B
  • 3      2        A

查詢后的表:

  • id pro1 pro2
  •  1  M      F
  •  2  N      G
  •  3  B      A

思路:依舊是行列轉(zhuǎn)換,這個在面試中的幾率很高。這個語句還是有兩種寫法,如下:

  1. create table #table1(id int,proid int,proname char
  2. insert into #table1 values 
  3. (1, 1, 'M'), 
  4. (1, 2, 'F'),  
  5. (2, 1, 'N'),  
  6. (2, 2, 'G'),  
  7. (3, 1, 'B'),  
  8. (3, 2, 'A'
  9.  
  10. select id,  
  11. (select proname from #table1 where proid=1 and id=b.id) as pro1, 
  12. (select proname from #table1 where proid=2 and id=b.id) as pro2 
  13. from #table1 b group by id 
  14.  
  15. select d.id,[1] as pro1,[2] as pro2 from 
  16. (select b.id,b.proid,b.proname from #table1 b) as c 
  17. pivot 
  18. (min(c.proname) for c.proid in([1],[2])) as d 

9. 如下

  • 表a
  • 列     a1 a2
  • 記錄 1   a
  •           1   b
  •           2   x
  •           2   y
  •           2   z

用select能選成以下結(jié)果嗎?

1 ab

2 xyz

思路:這個開始想使用行列轉(zhuǎn)換來寫,沒有成功,后來沒有辦法只好用游標(biāo),代碼如下:

  1. create table #table2(id int , value varchar(10)) 
  2. insert into #table2 values 
  3. (1,'a'), 
  4. (1,'b'), 
  5. (2,'x'), 
  6. (2,'y'), 
  7. (2,'z'
  8. create table #table3(id int,value varchar(100) );insert into #table3(id,value) select distinct(id),'' from #table2 
  9.  
  10. declare @id int,@name varchar(10) 
  11. declare mycursor cursor for select * from #table2 
  12. open mycursor 
  13. fetch next from mycursor into @id,@name 
  14. while (@@Fetch_Status = 0) 
  15. begin 
  16. update #table3 set value=value+@name where id=@id 
  17. fetch next from mycursor into @id,@name  
  18. end 
  19. close mycursor 
  20. deallocate mycursor 
  21.  
  22. select * from #table3 

有兩個要注意的地方,

a.#table3里面的value字段初始值如果不設(shè)置的話默認(rèn)是null,后面更新的時候null+'a'任然是null,***得到的value永遠(yuǎn)是null。所以默認(rèn)是''

b.第二個fetch語句一定要放在begin和end之間,要不然會死循環(huán)的,不常用的語句寫起來很不爽快

原文鏈接:http://www.cnblogs.com/tylerdonet/archive/2011/10/07/2200500.html

【編輯推薦】

  1. 數(shù)據(jù)庫點滴之SQL級聯(lián)刪除
  2. 數(shù)據(jù)庫點滴之精妙SQL語句
  3. SQL點滴之性能優(yōu)化其實沒有那么神秘
  4. SQL點滴之幾個有點偏的語句
  5. SQL點滴之如何編輯數(shù)據(jù)
責(zé)任編輯:艾婧 來源: Tyler‘s Blog
相關(guān)推薦

2011-09-09 10:10:13

SQL數(shù)據(jù)庫點滴

2011-03-31 09:30:27

SQL Server數(shù)管理SQL

2010-07-20 13:52:27

SQL Server

2011-09-13 10:25:05

數(shù)據(jù)庫點滴

2010-10-19 16:06:26

SQL Server索

2010-06-30 14:54:42

SQL Server

2010-12-06 09:26:23

SQL Server

2011-08-24 16:36:00

T-SQL

2011-05-06 16:36:48

SQL備份還原

2017-04-21 11:24:13

數(shù)據(jù)庫Azure T-SQL編輯器

2011-08-02 13:04:40

SQL Server

2011-08-23 13:36:11

T-SQL查詢流程控制語句

2011-06-23 14:00:51

SQL點滴

2011-10-19 10:07:16

T-SQL查詢變量

2011-04-27 16:34:06

withSQL Server

2018-03-30 14:30:10

數(shù)據(jù)庫SQL語句性能優(yōu)化

2018-03-30 13:59:22

數(shù)據(jù)庫SQL語句性能優(yōu)化

2010-07-06 10:36:35

SQL Server

2011-07-18 14:38:44

子查詢外部查詢

2011-01-06 09:28:19

SQL語句
點贊
收藏

51CTO技術(shù)棧公眾號

97久久网站| 国产成人精品亚洲午夜麻豆| 一级视频在线免费观看| 精品在线不卡| 欧美激情精品久久久久久久变态| 日韩精品一区二| 日韩欧美在线观看| 色诱视频网站一区| 亚洲视频一区二区在线| av不卡免费电影| 六月天综合网| 国产视频欧美| 国产无遮挡裸体视频在线观看| 99re6这里有精品热视频| 欧美www在线| 亚洲最快最全在线视频| 日本成人在线视频网站| 国产精品x8x8一区二区| 国产区视频在线播放| 中文字幕一区二区三区在线乱码 | 咪咪网在线视频| 毛片在线视频播放| 99久久久久国产精品免费| 在线国产精品播放| 懂色av一区二区三区| 中文字幕欧美日本乱码一线二线| 欧美偷拍综合| 香港伦理在线| 国产精品美女999| 2023国产精品视频| 欧洲杯足球赛直播| 国产伦精品一区二区三区千人斩| 久草在在线视频| 中文字幕欧美日韩va免费视频| 美女视频网站黄色亚洲| 在线 亚洲欧美在线综合一区| 日韩精品av| 999视频在线免费观看| 日韩欧美精品三级| 91在线免费播放| 综合成人在线| 国产经典av| 国产精品美女免费| 国产精品亚洲第一| 日本中文字幕伦在线观看| 欧美高清视频不卡网| 国产在线88av| 偷拍视频一区二区| 中文字幕视频一区二区在线有码 | 69av成人| 高清欧美电影在线| 精品乱人伦小说| 欧美在线观看视频在线| 99久久久国产精品免费蜜臀| 视频一区中文字幕国产| 成人一区而且| 日韩精品一页| 欧美性天天影视| 久久精品无码中文字幕| 欧美在线视频播放| 欧美色另类天堂2015| 国产视频一区在线观看一区免费| 日韩久久一区| 岛国最新视频免费在线观看| 欧美国产二区| 国产精品成人aaaaa网站| 欧美成人性战久久| 婷婷成人综合网| 韩日在线一区| 9999精品| 男人天堂久久久| 久久久亚洲综合网站| 91首页免费视频| 欧美少妇激情| 操你啦视频在线| 轻轻色免费在线视频| 欧美丰满少妇xxxxx| 国产一区91| 少妇性l交大片| 国产av人人夜夜澡人人爽| 无码日韩人妻精品久久蜜桃| 免费一区二区三区在线观看 | 亚洲精选视频在线| 从欧美一区二区三区| 国产校园另类小说区| 国产欧美一区二区三区在线看蜜臀| 国产成人综合亚洲91猫咪| 91精品国产91久久久久久黑人| 免费成人在线电影| 欧美日本网站| xx免费视频| av动漫免费观看| 国产精品一区二区三区免费视频| 亚洲激情第一页| 欧美性受xxxx黑人xyx| 国产精品毛片大码女人| 欧美va天堂在线| 久久野战av| 男人添女人荫蒂免费视频| 国产精品免费视频一区二区| 亚洲最大免费| 成人国产在线激情| 久久久久久久91| 5月丁香婷婷综合| 国产精品伦一区二区三级视频| 九九在线高清精品视频| 国产三级视频在线看| 成人网站免费观看入口| 国产主播在线一区| 久久久久久国产免费| 日韩美女在线视频| 亚洲美女少妇撒尿| 68国产成人综合久久精品| 国产成人精品123区免费视频| 亚洲国产精品www| 国产日韩欧美一二三区| 97视频在线观看免费高清完整版在线观看| 97av在线视频免费播放| 99国内精品久久久久久久软件| 久久亚洲一区二区| 无人在线观看的免费高清视频| 日韩美女视频在线| 蜜臀91精品一区二区三区| 久久先锋影音av| 精品少妇一区二区三区日产乱码| 久久色精品视频| 91综合免费在线| 日本午夜免费福利视频| 999福利在线视频| 首页国产精品| 中文字幕精品一区二区精品绿巨人| 91精品国产综合久久久久久漫画 | 亚洲欧美一区二区激情| 亚洲视频综合网| 97超视频免费观看| 国产精品丝袜视频| 麻豆传媒一区二区| 久久国产精品网| 伪装者在线观看完整版免费| 最新97超碰在线| 波多野结衣在线播放| 国产欧美日韩视频在线| 肉色丝袜一区二区| 亚洲美女屁股眼交3| 青草青草久热精品视频在线观看| 亚洲一品av免费观看| 精品国产自在久精品国产| 国产精品一二三在线| 四虎精品一区二区永久在线观看| 自拍偷拍欧美视频| 久久国产精品色婷婷| 欧美gvvideo网站| 波多野在线观看| 影音先锋一区| 精品久久久网站| 偷拍视频一区二区| 僵尸再翻生在线观看| 久久久999| 亚洲色图在线观看| 日韩伦理在线免费观看| 24小时成人在线视频| 成人av资源在线观看| 日本亚洲欧美成人| 8x8x视频在线| 午夜视频一区二区在线观看| 久久先锋资源| 91黄色免费版| 国产综合久久久久久| 色琪琪原网站亚洲香蕉| 成人免费影院| 国产成人精品免费视频网站| 欧美在线色视频| 欧美性一区二区三区| 国产精品无码免费专区午夜| 国产区视频在线播放| 国产精品极品国产中出| 国产精品123区| 日韩精品视频三区| 日本大片免费看| 欧美激情第10页| 26uuu国产电影一区二区| 亚洲欧美福利一区二区| 国产精品观看在线亚洲人成网| 精品亚洲综合| 国产成人在线看| 国产精品激情自拍| 日韩成人高清| 精品久久久一区| 日本高清不卡一区二区三区视频| 日本一区二区三区免费乱视频 | 国产精品久久久久久久久久妞妞| 日韩毛片在线看| 久久黄色片视频| 日本亚洲视频在线| 97久久精品视频| 只有精品亚洲| 欧美一区二区三区免费视频| 免费在线国产精品| 午夜不卡一区| 色哟哟欧美精品|