2022年sql面试题 .pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2022年sql面试题 .pdf》由会员分享,可在线阅读,更多相关《2022年sql面试题 .pdf(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Sql 常见面试题(总结)1. 用一条 SQL语句 查询出每门课都大于80 分的学生姓名namekechengfenshu张三语文81张三数学75李四语文76李四数学90王五语文81王五数学100王五英语90(1)selectstu_namefromstu_grademinusselectstu_namefromstu_gradegwhereg.grade=80(2)selectdistinctstu_namefromstu_gradeouwherenotexists(select1fromstu_gradeinnwhereou.stu_name= inn.stu_nameandinn.gra
2、de=80)(3)selectdistinctt1.stu_namefromstu_gradet1wheret1.stu_namenotin(selectdistinctt2.stu_namefromstu_gradet2wheret2.grade=80)2.学生表如下 :自动编号学号姓名 课程编号课程名称分数12005001张三0001数学6922005002李四0001数学8932005001张三0001数学69删除除了自动编号不同,其他都相同的学生冗余信息A: delete tablename where 自动编号not in(select min(自动编号 ) from tablena
3、me group by 学号,姓名 ,课程编号 ,课程名称 ,分数 ): (1)在where 的左右都不能使用“组函数”;(2)一般来说,都可以使用exists代替in, 如果在in的条件中使用了“组函数”查名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 17 页 - - - - - - - - - 询到值,那么就不能使用exists来代替in了,就像本题3.一个叫 department的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球对,现
4、在四个球对进行比赛,用一条sql 语句显示所有可能的比赛组合.你先按你自己的想法做一下,看结果有我的这个简单吗?答:selecta.name,b.namefromteam a,team bwhere a.name b.Debit101ccur*面试题:怎么把这样一个表儿查成这样一个结果yearmonth amountyearm1m2m3m4199111.11991 1.11.21.31.4199121.21992 2.12.22.32.4199131.3199141.4199212.1199222.2199232.3199242.4答案一、selectyear,(selectamount fr
5、omaaa m where month=1and m.year=aaa.year)as m1,(selectamount fromaaa m where month=2and m.year=aaa.year)as m2,(selectamount fromaaa m where month=3and m.year=aaa.year)as m3,(selectamount fromaaa m where month=4and m.year=aaa.year)as m4fromaaagroupby year这个是 ORACLE 中做的:select* from(selectname, yearb1
6、,lead(year)over(partitionby nameorder by year)b2, lead(m,2)over(partitionby nameorder by year)b3,rank()over(partitionby name orderby year)rkfromt)where rk=1;*精妙的 SQL语句!精妙 SQL语句名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 17 页 - - - - - - - - - 作者:不详发文时间: 2003
7、.05.2910:55:05说明:复制表 ( 只复制结构 , 源表名:a新表名: b)SQL: select* intob froma where 11说明:拷贝表 ( 拷贝数据 , 源表名:a目标表名: b)SQL: insertintob(a,b,c)selectd,e,ffromb;说明:显示文章、提交人和最后回复时间SQL: selecta.title,a.username,b.adddatefrom tablea,(selectmax(adddate)adddatefromtablewhere table.title=a.title)b说明:外连接查询 ( 表名1:a 表名 2:b)
8、SQL: selecta.a,a.b,a.c,b.c,b.d,b.ffroma LEFT OUTJOIN b ONa.a= b.c说明:日程安排提前五分钟提醒SQL: select* from日程安排where datediff(minute,f开始时间 ,getdate()5说明:两张关联表,删除主表中已经在副表中没有的信息SQL:deletefrominfowherenotexists(select*frominfobzwhereinfo.infid=infobz.infid)说明: -SQL:select*fromstudentinfowherenotexists(select*from
9、studentwherestudentinfo.id=student.id)and系 名 称 =&strdepartmentname&and专 业 名 称=&strprofessionname&orderby 性别, 生源地 , 高考总成绩说明:四表联查问题:SQL: select* from a leftinnerjoinb on a.a=b.brightinnerjoinc on a.a=c.cinnerjoind on a.a=d.dwhere .说明:得到表中最小的未使用的ID 号SQL:SELECT (CASE WHENEXISTS(SELECT *FROMHandlebWHEREb
10、.HandleID= 1)THENMIN(HandleID)+ 1 ELSE 1 END) as HandleIDFROMHandleWHERE NOTHandleIDIN (SELECT a.HandleID-1 FROMHandle a)*有两个表A和 B,均有 key 和 value 两个字段,如果B的 key 在 A中也有,就把B的 value换为 A 中对应的 value名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 17 页 - - - - - - - - -
11、 这道题的 SQL语句怎么写?updatebsetb.value=(selecta.valuefromawherea.key=b.key)whereb.idin(selectb.idfromb,awhereb.key=a.key);*高级 sql 面试题原表:为了便于阅读 , 查询此表后的结果显式如下( 及格分数为60):courseidcoursename scorecourseidcoursename scoremark1 java701 java70 pass2 oracle902 oracle90 pass3 xml 403 xml 40 fail4 jsp304 jsp30 fail
12、5 servlet805 servlet80 passSQLselectcourseid,coursename ,score,decode(sign(score-60),-1,fail,pass)as mark from course_v;*一个 SQL 面试题去年应聘一个职位未果 , 其间被考了一个看似简单的题, 但我没有找到好的大案.不知各位大虾有无好的解法?题为:有两个表,t1,t2,Tablet1:SELLER|NON_SELLER-A BA CA DB AB CB DC AC BC DD AD BD C名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - -
13、- - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 17 页 - - - - - - - - - Tablet2:SELLER|COUPON |BAL-A 9 100B 9 200C 9 300D 9 400A 9.5100B 9.520A 10 80要求用 SELECT语句列出如下结果 :-如A的 SUM(BAL) 为 B,C,D 的和,B 的 SUM(BAL) 为A,C,D 的和.且用的方法不要增加数据库负担, 如用临时表等.NON-SELLER|COUPON |SUM(BAL) -A 9 900B 9 800C 9 700D 9 600A 9.520
14、B 9.5100C 9.5120D 9.5120A 10 0B 10 80C 10 80D 10 80关于论坛上那个SQL微软面试题问题:一百个账户各有100$,某个账户某天如有支出则添加一条新记录,记录其余额。一百天后,请输出每天所有账户的余额信息这个问题的难点在于每个用户在某天可能有多条纪录,也可能一条纪录也没有(不包括第一天)返回的记录集是一个100 天*100 个用户的纪录集名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 17 页 - - - - - - - -
15、- 下面是我的思路:1. 创建表并插入测试数据:我们要求username 从 1-100CREATETABLE dbo.TABLE2(usernamevarchar(50)NOT NULL,- 用户名outdatedatetimeNOTNULL ,- 日期cashfloatNOTNULL - 余额) ON PRIMARYdeclarei intseti=1whilei=100begininserttable2values(convert(varchar(50),i),2001-10-1,100)inserttable2values(convert(varchar(50),i),2001-11-
16、1,50)seti=i+1endinserttable2values(convert(varchar(50),i),2001-10-1,90)select* fromtable2orderby outdate,convert(int,username)2. 组合查询语句:a. 我们必须返回一个从第一天开始到100 天的纪录集:如:2001-10-1 (这个日期是任意的)到 2002-1-8由于第一天是任意一天,所以我们需要下面的SQL语句:selecttop100 dateadd(d,convert(int,username)-1,min(outdate)as outdatefromtable
17、2groupby usernameorderby convert(int,username)这里的奥妙在于:convert(int,username)-1(记得我们指定用户名从1-100:-)groupby username,min(outdate):第一天就可能每个用户有多个纪录。返回的结果:outdate-2001-10-0100:00:00.000.2002-01-0800:00:00.000b. 返回一个所有用户名的纪录集:selectdistinctusername fromtable2返回结果:username-名师资料总结 - - -精品资料欢迎下载 - - - - - - -
18、- - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 17 页 - - - - - - - - - 110100.99c. 返回一个 100 天记录集和100 个用户记录集的笛卡尔集合:select* from(selecttop100 dateadd(d,convert(int,username)-1,min(outdate)as outdatefromtable2groupby usernameorderby convert(int,username) as ACROSSjoin(selectdistinctusername fromtabl
19、e2) as Borderby outdate,convert(int,username)返回结果 100*100 条纪录:outdateusername2001-10-0100:00:00.0001.2002-01-0800:00:00.000100d. 返回当前所有用户在数据库的有的纪录:selectoutdate,username,min(cash)as cash fromtable2groupby outdate,usernameorderby outdate,convert(int,username)返回纪录:outdateusernamecash2001-10-0100:00:00
20、.000190.2002-01-0800:00:00.00010050e. 将 c 中返回的笛卡尔集和d 中返回的纪录做leftjoin:selectC.outdate,C.username,D.cashfrom(select* from(selecttop100 dateadd(d,convert(int,username)-1,min(outdate)as outdate名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 17 页 - - - - - - - - - fr
21、omtable2groupby usernameorderby convert(int,username) as ACROSSjoin(selectdistinctusername fromtable2) as B) as Cleftjoin(selectoutdate,username,min(cash)as cash fromtable2groupby outdate,username) as Don(C.username=D.usernameand datediff(d,C.outdate,D.outdate)=0)orderby C.outdate,convert(int,C.user
22、name)注意: 用户在当天如果没有纪录,cash 字段返回NULL ,否则 cash 返回每个用户当天的余额outdateusernamecash2001-10-0100:00:00.0001902001-10-0100:00:00.0002100.2001-10-0200:00:00.0001902001-10-0200:00:00.0002NULL - 注意这里.2002-01-0800:00:00.00010050f. 好了,现在我们最后要做的就是,如果cash 为 NULL ,我们要返回小于当前纪录日期的第一个用户余额 ( 由于我们使用orderby cash, 所以返回top1 纪
23、录即可,使用min 应该也可以) ,这个余额即为当前的余额:case isnull(D.cash,0)when 0 then(selecttop1 cash fromtable2where table2.username=C.usernameand datediff(d,C.outdate,table2.outdate)0orderby table2.cash)elseD.cashend as cashg. 最后组合的完整语句就是selectC.outdate,C.username,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - -
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年sql面试题 2022 sql 试题
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内