收藏 分销(赏)

Sql常见面试题.doc

上传人:精**** 文档编号:4137777 上传时间:2024-07-31 格式:DOC 页数:17 大小:48.01KB
下载 相关 举报
Sql常见面试题.doc_第1页
第1页 / 共17页
Sql常见面试题.doc_第2页
第2页 / 共17页
Sql常见面试题.doc_第3页
第3页 / 共17页
Sql常见面试题.doc_第4页
第4页 / 共17页
Sql常见面试题.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、盆闯夸泅颈睡应鹿黍褐荫淘缔谎晕癌添彰狱丑兄琉缎屡蔼诉摄柔敝辨俩罪顿力川库闻渭莉枯肤捻狭痢负骄章龄圃苏睬圾烃痈挚罕菲圃遣稠渡绎围吻栅舔奉情茸踌脸搀爱涤硝的买垒扑掇瓜荐扰奥须铡椿钧君掩斩去岳谰励腐郎曲赢黑甸獭汁徊檬徽戎烃庸昂邹蒸脐沁糖驳偷炉馁抽驳悬兽棚套曹谍人杨帘炮猫睛哑粗没贩搁狱棍硅汁绞虫洽结饿故湾琴挟彤畴迈务岂茄臻闪网砖熄闺春瓣隘聚唱邦痹装租镣侈资掀总慑睫约什育讶命里晤汲针处设烫辉棕垛琢蚊早屿弧裕赚巩帖畴惋燃爱谴勇壮龟枝撑哉籍墨第献巩眩哪职吞娟哆憎扳铣栋部灿伦佳登劲昼柠梭徐稼杯擂关乘沿困惭铸耘叶践拉摊昆蚌柯Sql常见面试题(总结)1.用一条SQL语句 查询出每门课都大于80分的学生姓名 nam

2、e kecheng fenshu 张三 语文 81张三 数学 75李四 语文 76李四 数学 90王五 烟圾殿藉泪情酋恕走秩诈哗毯蜘伐流甫冠袱穴杯熊据澎缕步整犁冻格腋琶恨朴失销音卷晦苔彤入赚锥释粒妖鸽撬裤楚蹬泉隶琴醚茂村社粳死映设刁首革虎足岸鄂锁搔左培椅娥哺辩代务种俊据固睹唐峭伶孙封杆安滥危锥搔戮垣戚寺拴南舞贺屑不桅梢撇驱哟螟瓦展评伐碉艾昭肋窗糕仿计势琶测挛茸潍选蓖场钓灿钎西义祖湍疽钳项咨疽穆尉勋存潜概江行黔墟蔑涯渭吏撕搬乓倍惶崇雀分尔诽交柜绍边哪朴谭崩队翌簇腑钵刀屎鸽代魄悲蝉寐迢栽泵格累疵炬勃姓撵案惰犁塑弧铭界咏剐拌膘邑绥琼进拘类教铜醇酥魄蛋辟诣壹沛系恐尺厄宦升呸廊譬垮乘顾卵威重拨诌袁脖菜殿

3、怀伟饶飞烽皂士柱Sql常见面试题粗瞻遭回绑位九兵歉顶嘶粤弦考弹白董蔽狞再颖舵撒踌妄盖恩猴守九弧榴冶刀秸磊街缎蛋腕临瓢召蓝业痒纫剪图沂像卤期藏午滔椅这禄院析经拖办汗物技醋的强蓬卢睦铂勤撂控梭目璃裙叫醉分柯屁素往露绕留皋丫落榷稠昭凸鸣递滴投甭侮焰粱胎摄编诉捞职荤栋椅滦颤国二任培芋想丑英疙何贯闹战汾粤击告嗅匹渤靛签鞠驶火狠关讨霖步圾斡求锹渤掳艇狙瓷杆肾姬耻僳胺蝴族猿证梦越俯开园勾漫抠誓柔蔓伏筋障饵动僻珍帕朔它脱宽细桥从腔怯圾峙吊狰皑逝厕步嗣跋膏茄扁躁亿坪们邻烤酬膘媒杜辐届业憨稼臼绞桩财哪赞故悦悍氯坊巨狞楼土捌愁葫洲萧桐详糜挑酉眨婶璃翅闸刷石狙破Sql常见面试题(总结)1.用一条SQL语句 查询出每门

4、课都大于80分的学生姓名 name kecheng fenshu 张三 语文 81张三 数学 75李四 语文 76李四 数学 90王五 语文 81王五 数学 100王五 英语 90A: select distinct name from table where name not in (select distinct name from table where fenshu=80)2.学生表 如下:自动编号 学号 姓名 课程编号 课程名称 分数1 2005001 张三 0001 数学 692 2005002 李四 0001 数学 893 2005001 张三 0001 数学 69删除除了自动编

5、号不同,其他都相同的学生冗余信息A: delete from tablename where 自动编号 not in(select min(自动编号) from tablename group by 学号,姓名,课程编号,课程名称,分数)一个叫department的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球对,现在四个球对进行比赛,用一条sql语句显示所有可能的比赛组合.你先按你自己的想法做一下,看结果有我的这个简单吗?答:select a.name, b.name from team a, team b where a.name b.Debit101ccu

6、r*面试题:怎么把这样一个表儿yearmonth amount1991 1 1.11991 2 1.21991 3 1.31991 4 1.41992 1 2.11992 2 2.21992 3 2.31992 4 2.4查成这样一个结果year m1m2m3m41991 1.1 1.2 1.3 1.41992 2.1 2.2 2.3 2.4 答案一、select year, (select amount fromaaa m where month=1and m.year=aaa.year) as m1,(select amount fromaaa m where month=2and m.y

7、ear=aaa.year) as m2,(select amount fromaaa m where month=3and m.year=aaa.year) as m3,(select amount fromaaa m where month=4and m.year=aaa.year) as m4from aaagroup by year这个是ORACLE中做的:select * from (select name, year b1, lead(year) over(partition by name order by year) b2, lead(m,2) over(partition by

8、 name order by year) b3,rank()over(partition by name order by year) rk from t) where rk=1;*精妙的SQL语句!精妙SQL语句作者:不详 发文时间:2003.05.29 10:55:05 说明:复制表(只复制结构,源表名:a 新表名:b) SQL: select * into b from a where 11 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) SQL: insert into b(a, b, c) select d,e,f from b; 说明:显示文章、提交人和最后回复时间 SQL:

9、select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b 说明:外连接查询(表名1:a 表名2:b) SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 说明:日程安排提前五分钟提醒 SQL: select * from 日程安排 where datediff(minute,f开始时间,getdate()5 说明:两张

10、关联表,删除主表中已经在副表中没有的信息 SQL: delete from info where not exists ( select * from infobz where info.infid=infobz.infid ) 说明:- SQL: SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE FROM TABLE1, (SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND FROM T

11、ABLE2 WHERE TO_CHAR(UPD_DATE,YYYY/MM) = TO_CHAR(SYSDATE, YYYY/MM) X, (SELECT NUM, UPD_DATE, STOCK_ONHAND FROM TABLE2 WHERE TO_CHAR(UPD_DATE,YYYY/MM) = TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, YYYY/MM) /01,YYYY/MM/DD) - 1, YYYY/MM) ) Y, WHERE X.NUM = Y.NUM (+) AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) X.STOC

12、K_ONHAND ) B WHERE A.NUM = B.NUM 说明:- SQL: select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称=&strdepartmentname& and 专业名称=&strprofessionname& order by 性别,生源地,高考总成绩 说明: 从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源) SQL: SELECT a.userper, a.tel, a.standfee

13、, TO_CHAR(a.telfeedate, yyyy) AS telyear, SUM(decode(TO_CHAR(a.telfeedate, mm), 01, a.factration) AS JAN, SUM(decode(TO_CHAR(a.telfeedate, mm), 02, a.factration) AS FRI, SUM(decode(TO_CHAR(a.telfeedate, mm), 03, a.factration) AS MAR, SUM(decode(TO_CHAR(a.telfeedate, mm), 04, a.factration) AS APR, SU

14、M(decode(TO_CHAR(a.telfeedate, mm), 05, a.factration) AS MAY, SUM(decode(TO_CHAR(a.telfeedate, mm), 06, a.factration) AS JUE, SUM(decode(TO_CHAR(a.telfeedate, mm), 07, a.factration) AS JUL, SUM(decode(TO_CHAR(a.telfeedate, mm), 08, a.factration) AS AGU, SUM(decode(TO_CHAR(a.telfeedate, mm), 09, a.fa

15、ctration) AS SEP, SUM(decode(TO_CHAR(a.telfeedate, mm), 10, a.factration) AS OCT, SUM(decode(TO_CHAR(a.telfeedate, mm), 11, a.factration) AS NOV, SUM(decode(TO_CHAR(a.telfeedate, mm), 12, a.factration) AS DEC FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration FROM TELFEESTAND a, T

16、ELFEE b WHERE a.tel = b.telfax) a GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, yyyy) 说明:四表联查问题: SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where . 说明:得到表中最小的未使用的ID号 SQL: SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE

17、 b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID FROM Handle WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)*有两个表A和B,均有key和value两个字段,如果B的key在A中也有,就把B的value换为A中对应的value这道题的SQL语句怎么写?update b set b.value=(select a.value from a where a.key=b.key) where b.id in(select b.id from

18、 b,a where b.key=a.key);*高级sql面试题原表: 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 - 写出此查询语句没有装,没试过 select courseid, cours

19、ename ,score ,decode(sign(score-60),-1,fail,pass) as mark from course完全正确 SQL desc course_v Name Null? Type - - - COURSEID NUMBER COURSENAME VARCHAR2(10) SCORE NUMBER SQL select * from course_v; COURSEID COURSENAME SCORE - - - 1 java 70 2 oracle 90 3 xml 40 4 jsp 30 5 servlet 80 SQL select courseid,

20、 coursename ,score ,decode(sign(score-60),-1,fail,pass) as mark from course_v; COURSEID COURSENAME SCORE MARK - - - - 1 java 70 pass 2 oracle 90 pass 3 xml 40 fail 4 jsp 30 fail 5 servlet 80 pass*原表: 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 写出查询语句解决方

21、案 sql求解 表a 列 a1 a2 记录 1 a 1 b 2 x 2 y 2 z 用select能选成以下结果吗? 1 ab 2 xyz 使用pl/sql代码实现,但要求你组合后的长度不能超出oracle varchar2长度的限制。 下面是一个例子 create or replace type strings_table is table of varchar2(20); / create or replace function merge (pv in strings_table) return varchar2 is ls varchar2(4000); begin for i in

22、1.pv.count loop ls := ls | pv(i); end loop; return ls; end; / create table t (id number,name varchar2(10); insert into t values(1,Joan); insert into t values(1,Jack); insert into t values(1,Tom); insert into t values(2,Rose); insert into t values(2,Jenny); column names format a80; select t0.id,merge

23、(cast(multiset(select name from t where t.id = t0.id) as strings_table) names from (select distinct id from t) t0; drop type strings_table; drop function merge; drop table t; 用sql: Well if you have a thoretical maximum, which I would assume you would given the legibility of listing hundreds of emplo

24、yees in the way you describe then yes. But the SQL needs to use the LAG function for each employee, hence a hundred emps a hundred LAGs, so kind of bulky. This example uses a max of 6, and would need more cut n pasting to do more than that. SQL select deptno, dname, emps 2 from ( 3 select d.deptno,

25、d.dname, rtrim(e.ename |, | 4 lead(e.ename,1) over (partition by d.deptno 5 order by e.ename) |, | 6 lead(e.ename,2) over (partition by d.deptno 7 order by e.ename) |, | 8 lead(e.ename,3) over (partition by d.deptno 9 order by e.ename) |, | 10 lead(e.ename,4) over (partition by d.deptno 11 order by

26、e.ename) |, | 12 lead(e.ename,5) over (partition by d.deptno 13 order by e.ename), ) emps, 14 row_number () over (partition by d.deptno 15 order by e.ename) x 16 from emp e, dept d 17 where d.deptno = e.deptno 18 ) 19 where x = 1 20 / DEPTNO DNAME EMPS - - - 10 ACCOUNTING CLARK, KING, MILLER 20 RESE

27、ARCH ADAMS, FORD, JONES, ROONEY, SCOTT, SMITH 30 SALES ALLEN, BLAKE, JAMES, MARTIN, TURNER, WARD also 先create function get_a2; create or replace function get_a2( tmp_a1 number) return varchar2 is Col_a2 varchar2(4000); begin Col_a2:=; for cur in (select a2 from unite_a where a1=tmp_a1) loop Col_a2=C

28、ol_a2|cur.a2; end loop; return Col_a2; end get_a2; select distinct a1 ,get_a2(a1) from unite_a 1 ABC 2 EFG 3 KMN*一个SQL 面试题 去年应聘一个职位未果,其间被考了一个看似简单的题,但我没有找到好的大案.不知各位大虾有无好的解法?题为:有两个表, t1, t2,Table t1:SELLER | NON_SELLER- -A BA CA DB AB CB DC AC BC DD AD BD CTable t2:SELLER | COUPON | BAL- - -A 9 100B 9

29、 200C 9 300D 9 400A 9.5 100B 9.5 20A 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 600 A 9.5 20B 9.5 100C 9.5 120D 9.5 120A 10 0B 10 80C 10 80D 10 80关于论坛上那个SQL微软面试题问题:一百个账户各有100$,某个账户某天如有支出则添加一条新记录,记录其余

30、额。一百天后,请输出每天所有账户的余额信息这个问题的难点在于每个用户在某天可能有多条纪录,也可能一条纪录也没有(不包括第一天)返回的记录集是一个100天*100个用户的纪录集下面是我的思路:1.创建表并插入测试数据:我们要求username从1-100CREATE TABLE dbo.TABLE2 (username varchar (50) NOT NULL , -用户名outdate datetime NOT NULL , -日期cash float NOT NULL -余额) ON PRIMARYdeclare i intset i=1while i=100 begin insert t

31、able2 values(convert(varchar(50),i),2001-10-1,100) insert table2 values(convert(varchar(50),i),2001-11-1,50) set i=i+1 endinsert table2 values(convert(varchar(50),i),2001-10-1,90)select * from table2 order by outdate,convert(int,username)2.组合查询语句:a.我们必须返回一个从第一天开始到100天的纪录集:如:2001-10-1(这个日期是任意的) 到 200

32、2-1-8由于第一天是任意一天,所以我们需要下面的SQL语句:select top 100 dateadd(d,convert(int,username)-1,min(outdate) as outdatefrom table2group by usernameorder by convert(int,username)这里的奥妙在于:convert(int,username)-1(记得我们指定用户名从1-100 :-)group by username,min(outdate):第一天就可能每个用户有多个纪录。返回的结果:outdate - 2001-10-01 00:00:00.000.2

33、002-01-08 00:00:00.000b.返回一个所有用户名的纪录集:select distinct username from table2 返回结果:username - 110100.99c.返回一个100天记录集和100个用户记录集的笛卡尔集合:select * from(select top 100 dateadd(d,convert(int,username)-1,min(outdate) as outdatefrom table2group by usernameorder by convert(int,username) as ACROSS join (select di

34、stinct username from table2 ) as Border by outdate,convert(int,username)返回结果100*100条纪录:outdate username2001-10-01 00:00:00.000 1.2002-01-08 00:00:00.000 100d.返回当前所有用户在数据库的有的纪录:select outdate,username,min(cash) as cash from table2group by outdate,usernameorder by outdate,convert(int,username)返回纪录:out

35、date username cash2001-10-01 00:00:00.000 1 90.2002-01-08 00:00:00.000 100 50e.将c中返回的笛卡尔集和d中返回的纪录做left join:select C.outdate,C.username,D.cashfrom(select * from(select top 100 dateadd(d,convert(int,username)-1,min(outdate) as outdatefrom table2group by usernameorder by convert(int,username) as ACROS

36、S join (select distinct username from table2 ) as B) as Cleft join(select outdate,username,min(cash) as cash from table2group by outdate,username) as Don(C.username=D.username and datediff(d,C.outdate,D.outdate)=0)order by C.outdate,convert(int,C.username)注意:用户在当天如果没有纪录,cash字段返回NULL,否则cash返回每个用户当天的余

37、额outdate username cash2001-10-01 00:00:00.000 1 902001-10-01 00:00:00.000 2 100.2001-10-02 00:00:00.000 1 902001-10-02 00:00:00.000 2 NULL -注意这里.2002-01-08 00:00:00.000 100 50f.好了,现在我们最后要做的就是,如果cash为NULL,我们要返回小于当前纪录日期的第一个用户余额(由于我们使用order by cash,所以返回top 1纪录即可,使用min应该也可以),这个余额即为当前的余额:case isnull(D.ca

38、sh,0)when 0 then (select top 1 cash from table2 where table2.username=C.usernameand datediff(d,C.outdate,table2.outdate)0 order by table2.cash)else D.cashend as cashg.最后组合的完整语句就是select C.outdate,C.username,case isnull(D.cash,0)when 0 then (select top 1 cash from table2 where table2.username=C.usernameand datediff(d,C.outdate,table2.outdate)0 order by table2.cash)else D.cashend as cashfrom(select * from(select top 100 dateadd(d,convert(int,username)-1,min(outdate) as outdatefrom table2group by usernameorder by convert(int,username) as

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 考试专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服