成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

數據庫點滴之T-SQL面試語句,練練手

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

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

  • name kecheng fenshu
  • 張三   語文       81
  • 張三   數學       75
  • 李四   語文       76
  • 李四   數學       90
  • 王五   語文       81
  • 王五   數學     100
  • 王五   英語       90

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

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

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

  1. select 姓名 from #成績  
  2. group by 姓名 
  3. having min(分數)>80 

2. 學生表 如下:

  • 自動編號     學號       姓名 課程編號 課程名稱 分數
  •        1         2005001    張三      0001          數學       69
  •        2         2005002    李四      0001          數學       89
  •        3         2005001    張三      0001          數學       69

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

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

  1. create table #成績(自動編號 int, 學號 int,姓名 varchar(20),課程編號 int,課程名稱 varchar(20),分數 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 學號,姓名,課程編號,課程名稱,分數) 

經【廣島之戀】的提醒發現另外一種思路,代碼如下:

  1. delete from #成績 where 自動編號 not in 
  2. (select distinct(a.自動編號) from #成績 a join #成績 b on a.自動編號>b.自動編號  
  3. where a.學號=b.學號 and a.姓名=b.姓名 and a.課程編號=b.課程編號 and a.分數=b.分數) 

3. 一個叫department的表,里面只有一個字段name,一共有4條紀錄,分別是a,b,c,d,對應四個球對,現在四個球對進行比賽,用一條sql語句顯示所有可能的比賽組合。

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

  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

查成這樣一個結果

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

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

  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個子查詢進而得到新的列:

  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中對應的value。這道題的SQL語句怎么寫?

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

  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. 兩張關聯表,刪除主表中已經在副表中沒有的信息。

思路:這個就是存在關系,可以使用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

為了便于閱讀,查詢此表后的結果顯式如下(及格分數為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

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

  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能選成以下結果嗎?

1 ab

2 xyz

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

  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字段初始值如果不設置的話默認是null,后面更新的時候null+'a'任然是null,***得到的value永遠是null。所以默認是''

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

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

【編輯推薦】

  1. 數據庫點滴之SQL級聯刪除
  2. 數據庫點滴之精妙SQL語句
  3. SQL點滴之性能優化其實沒有那么神秘
  4. SQL點滴之幾個有點偏的語句
  5. SQL點滴之如何編輯數據
責任編輯:艾婧 來源: Tyler‘s Blog
相關推薦

2011-09-09 10:10:13

SQL數據庫點滴

2011-03-31 09:30:27

SQL Server數管理SQL

2010-07-20 13:52:27

SQL Server

2011-09-13 10:25:05

數據庫點滴

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備份還原

2011-08-02 13:04:40

SQL Server

2017-04-21 11:24:13

數據庫Azure T-SQL編輯器

2011-06-23 14:00:51

SQL點滴

2011-08-23 13:36:11

T-SQL查詢流程控制語句

2011-10-19 10:07:16

T-SQL查詢變量

2011-04-27 16:34:06

withSQL Server

2018-03-30 13:59:22

數據庫SQL語句性能優化

2018-03-30 14:30:10

數據庫SQL語句性能優化

2010-07-06 10:36:35

SQL Server

2011-07-18 14:38:44

子查詢外部查詢

2011-01-06 09:28:19

SQL語句
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费观看黄网站 | 精品国产乱码久久久久久1区2区 | 国产精品黄 | 久久99网| 中文字幕精品视频在线观看 | 午夜手机在线视频 | 自拍第1页 | 深夜福利亚洲 | 精品亚洲一区二区三区 | 亚洲精品欧美 | 欧美毛片免费观看 | 精品欧美一区二区三区精品久久 | 亚洲一区中文字幕在线观看 | 欧美一级片久久 | 午夜影院视频在线观看 | 国产美女h视频 | 国产精品欧美一区二区 | 日韩国产精品一区二区三区 | 国产中文字幕网 | 中文在线播放 | 精品国产99 | 荷兰欧美一级毛片 | 精品国产伦一区二区三区观看方式 | 国产精品久久久久久久久久东京 | 亚洲成av人片在线观看无码 | 自拍 亚洲 欧美 老师 丝袜 | 久久爱黑人激情av摘花 | 日韩一区二区福利视频 | 日韩精品一区在线 | 一区二区三区视频在线观看 | 中文精品视频 | 免费在线a视频 | 三极网站| 亚洲乱码国产乱码精品精的特点 | 日韩精品久久一区 | 麻豆精品久久久 | 国产精品成av人在线视午夜片 | 久久久久亚洲精品 | 搞av.com| 欧美日韩在线免费 | 国产精品视频在线观看 |