版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Sql常见面试题(总结)1.用一条SQL语句查询出每门课都大于80分的学生姓名
name
kecheng
fenshu
张三
语文
81
张三
数学
75
李四
语文
76
李四
数学
90
王五
语文
81
王五
数学
100
王五
英语
90
A:selectdistinctnamefromtable
where
namenotin(selectdistinctnamefromtablewherefenshu<=80)
2.学生表如下:
自动编号
学号
姓名课程编号课程名称分数
1
2005001
张三
0001
数学
69
2
2005002
李四
0001
数学
89
3
2005001
张三
0001
数学
69
删除除了自动编号不同,其他都相同的学生冗余信息
A:deletefromtablenamewhere自动编号notin(selectmin(自动编号)fromtablenamegroupby学号,姓名,课程编号,课程名称,分数)一个叫department的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球对,现在四个球对进行比赛,用一条sql语句显示所有可能的比赛组合.
你先按你自己的想法做一下,看结果有我的这个简单吗?答:,
fromteama,teamb
<请用SQL语句实现:从TestDB数据表中查询出所有月份的发生额都比101科目相应月份的发生额高的科目。请注意:TestDB中有很多科目,都有1-12月份的发生额。
AccID:科目代码,Occmonth:发生额月份,DebitOccur:发生额。
数据库名:JcyAudit,数据集:Select*fromTestDB答:selecta.*fromTestDBa
,(selectOccmonth,max(DebitOccur)Debit101ccurfromTestDBwhereAccID='101'groupbyOccmonth)b
wherea.Occmonth=b.Occmonthanda.DebitOccur>b.Debit101ccur************************************************************************************面试题:怎么把这样一个表儿
year
monthamount
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
查成这样一个结果
yearm1
m2
m3
m4
1991.4
1992.4
答案一、
selectyear,
(selectamountfrom
aaamwheremonth=1
andm.year=aaa.year)asm1,
(selectamountfrom
aaamwheremonth=2
andm.year=aaa.year)asm2,
(selectamountfrom
aaamwheremonth=3
andm.year=aaa.year)asm3,
(selectamountfrom
aaamwheremonth=4
andm.year=aaa.year)asm4
fromaaa
groupbyyear这个是ORACLE
中做的:
select*from(selectname,yearb1,lead(year)over
(partitionbynameorderbyyear)b2,lead(m,2)over(partitionbynameorderbyyear)b3,rank()over(
partitionbynameorderbyyear)rkfromt)whererk=1;************************************************************************************精妙的SQL语句!
精妙SQL语句
作者:不详发文时间:2003.05.2910:55:05
说明:复制表(只复制结构,源表名:a新表名:b)
SQL:select*intobfromawhere1<>1
说明:拷贝表(拷贝数据,源表名:a目标表名:b)
SQL:insertintob(a,b,c)selectd,e,ffromb;
说明:显示文章、提交人和最后回复时间
SQL:selecta.title,a.username,b.adddatefromtablea,(selectmax(adddate)adddatefromtablewheretable.title=a.title)b
说明:外连接查询(表名1:a表名2:b)
SQL:selecta.a,a.b,a.c,b.c,b.d,b.ffromaLEFTOUTJOINbONa.a=b.c
说明:日程安排提前五分钟提醒
SQL:select*from日程安排wheredatediff('minute',f开始时间,getdate())>5
说明:两张关联表,删除主表中已经在副表中没有的信息
SQL:
deletefrominfowherenotexists(select*frominfobzwhereinfo.infid=infobz.infid)
说明:--
SQL:
SELECTA.NUM,A.NAME,B.UPD_DATE,B.PREV_UPD_DATE
FROMTABLE1,
(SELECTX.NUM,X.UPD_DATE,Y.UPD_DATEPREV_UPD_DATE
FROM(SELECTNUM,UPD_DATE,INBOUND_QTY,STOCK_ONHAND
FROMTABLE2
WHERETO_CHAR(UPD_DATE,'YYYY/MM')=TO_CHAR(SYSDATE,'YYYY/MM'))X,
(SELECTNUM,UPD_DATE,STOCK_ONHAND
FROMTABLE2
WHERETO_CHAR(UPD_DATE,'YYYY/MM')=
TO_CHAR(TO_DATE(TO_CHAR(SYSDATE,'YYYY/MM')¦¦'/01','YYYY/MM/DD')-1,'YYYY/MM'))Y,
WHEREX.NUM=Y.NUM(+)
ANDX.INBOUND_QTY+NVL(Y.STOCK_ONHAND,0)<>X.STOCK_ONHAND)B
WHEREA.NUM=B.NUM
说明:--
SQL:
select*fromstudentinfowherenotexists(select*fromstudentwherestudentinfo.id=student.id)and系名称='"&strdepartmentname&"'and专业名称='"&strprofessionname&"'orderby性别,生源地,高考总成绩
说明:
从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源)
SQL:
SELECTa.userper,a.tel,a.standfee,TO_CHAR(a.telfeedate,'yyyy')AStelyear,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'01',a.factration))ASJAN,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'02',a.factration))ASFRI,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'03',a.factration))ASMAR,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'04',a.factration))ASAPR,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'05',a.factration))ASMAY,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'06',a.factration))ASJUE,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'07',a.factration))ASJUL,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'08',a.factration))ASAGU,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'09',a.factration))ASSEP,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'10',a.factration))ASOCT,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'11',a.factration))ASNOV,
SUM(decode(TO_CHAR(a.telfeedate,'mm'),'12',a.factration))ASDEC
FROM(SELECTa.userper,a.tel,a.standfee,b.telfeedate,b.factration
FROMTELFEESTANDa,TELFEEb
WHEREa.tel=b.telfax)a
GROUPBYa.userper,a.tel,a.standfee,TO_CHAR(a.telfeedate,'yyyy')
说明:四表联查问题:
SQL:select*fromaleftinnerjoinbona.a=b.brightinnerjoincona.a=c.cinnerjoindona.a=d.dwhere.....
说明:得到表中最小的未使用的ID号
SQL:
SELECT(CASEWHENEXISTS(SELECT*FROMHandlebWHEREb.HandleID=1)THENMIN(HandleID)+1ELSE1END)asHandleID
FROMHandle
WHERENOTHandleIDIN(SELECTa.HandleID-1FROMHandlea)*******************************************************************************有两个表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
b,a
where
b.key=a.key);***************************************************************************高级sql面试题原表:
courseidcoursenamescore
-------------------------------------
1java70
2oracle90
3xml40
4jsp30
5servlet80
-------------------------------------
为了便于阅读,查询此表后的结果显式如下(及格分数为60):
courseidcoursenamescoremark
---------------------------------------------------
1java70pass
2oracle90pass
3xml40fail
4jsp30fail
5servlet80pass
---------------------------------------------------
写出此查询语句没有装ORACLE,没试过
selectcourseid,coursename,score,decode(sign(score-60),-1,'fail','pass')asmarkfromcourse完全正确
SQL>desccourse_v
NameNull?Type
-----------------------------------------------------------------------------
COURSEIDNUMBER
COURSENAMEVARCHAR2(10)
SCORENUMBER
SQL>select*fromcourse_v;
COURSEIDCOURSENAMESCORE
------------------------------
1java70
2oracle90
3xml40
4jsp30
5servlet80
SQL>selectcourseid,coursename,score,decode(sign(score-60),-1,'fail','pass')asmarkfromcourse_v;
COURSEIDCOURSENAMESCOREMARK
----------------------------------
1java70pass
2oracle90pass
3xml40fail
4jsp30fail
5servlet80pass*******************************************************************************原表:
idproidproname
11M
12F
21N
22G
31B
32A
查询后的表:
idpro1pro2
1MF
2NG
3BA
写出查询语句解决方案
sql求解
表a
列a1a2
记录1a
1b
2x
2y
2z
用select能选成以下结果吗?
1ab
2xyz
使用pl/sql代码实现,但要求你组合后的长度不能超出oraclevarchar2长度的限制。
下面是一个例子
createorreplacetypestrings_tableistableofvarchar2(20);
/
createorreplacefunctionmerge(pvinstrings_table)returnvarchar2
is
lsvarchar2(4000);
begin
foriin1..pv.countloop
ls:=ls||pv(i);
endloop;
returnls;
end;
/
createtablet(idnumber,namevarchar2(10));
insertintotvalues(1,'Joan');
insertintotvalues(1,'Jack');
insertintotvalues(1,'Tom');
insertintotvalues(2,'Rose');
insertintotvalues(2,'Jenny');
columnnamesformata80;
selectt0.id,merge(cast(multiset(selectnamefromtwheret.id=t0.id)asstrings_table))names
from(selectdistinctidfromt)t0;
droptypestrings_table;
dropfunctionmerge;
droptablet;
用sql:
Wellifyouhaveathoreticalmaximum,whichIwouldassumeyouwouldgiventhelegibilityoflistinghundredsofemployeesinthewayyoudescribethenyes.ButtheSQLneedstousetheLAGfunctionforeachemployee,henceahundredempsahundredLAGs,sokindofbulky.
Thisexampleusesamaxof6,andwouldneedmorecutnpastingtodomorethanthat.
SQL>selectdeptno,dname,emps
2from(
3selectd.deptno,d.dname,rtrim(e.ename||','||
4lead(e.ename,1)over(partitionbyd.deptno
5orderbye.ename)||','||
6lead(e.ename,2)over(partitionbyd.deptno
7orderbye.ename)||','||
8lead(e.ename,3)over(partitionbyd.deptno
9orderbye.ename)||','||
10lead(e.ename,4)over(partitionbyd.deptno
11orderbye.ename)||','||
12lead(e.ename,5)over(partitionbyd.deptno
13orderbye.ename),',')emps,
14row_number()over(partitionbyd.deptno
15orderbye.ename)x
16fromempe,deptd
17whered.deptno=e.deptno
18)
19wherex=1
20/
DEPTNODNAMEEMPS
------------------------------------------------------------
10ACCOUNTINGCLARK,KING,MILLER
20RESEARCHADAMS,FORD,JONES,ROONEY,SCOTT,SMITH
30SALESALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
also
先createfunctionget_a2;
createorreplacefunctionget_a2(tmp_a1number)
returnvarchar2
is
Col_a2varchar2(4000);
begin
Col_a2:='';
forcurin(selecta2fromunite_awherea1=tmp_a1)
loop
Col_a2=Col_a2||cur.a2;
endloop;
returnCol_a2;
endget_a2;
selectdistincta1,get_a2(a1)fromunite_a
1ABC
2EFG
3KMN*******************************************************************************一个SQL面试题去年应聘一个职位未果,其间被考了一个看似简单的题,但我没有找到好的大案.
不知各位大虾有无好的解法?
题为:
有两个表,t1,t2,
Tablet1:
SELLER|NON_SELLER
----------
AB
AC
AD
BA
BC
BD
CA
CB
CD
DA
DB
DC
Tablet2:
SELLER|COUPON|BAL
-----------------------
A9100
B9200
C9300
D9400
A9.5100
B9.520
A1080
要求用SELECT语句列出如下结果:------如A的SUM(BAL)为B,C,D的和,B的SUM(BAL)为A,C,D的和.......
且用的方法不要增加数据库负担,如用临时表等.
NON-SELLER|COUPON|SUM(BAL)---------------
A9900
B9800
C9700
D9600
A9.520
B9.5100
C9.5120
D9.5120
A100
B1080
C1080
D1080关于论坛上那个SQL微软面试题问题:
一百个账户各有100$,某个账户某天如有支出则添加一条新记录,记录其余额。一百天后,请输出每天所有账户的余额信息
这个问题的难点在于每个用户在某天可能有多条纪录,也可能一条纪录也没有(不包括第一天)
返回的记录集是一个100天*100个用户的纪录集
下面是我的思路:
1.创建表并插入测试数据:我们要求username从1-100
CREATETABLE[dbo].[TABLE2](
[username][varchar](50)NOTNULL,--用户名
[outdate][datetime]NOTNULL,--日期
[cash][float]NOTNULL--余额
)ON[PRIMARY
declare@iint
set@i=1
while@i<=100
begin
inserttable2values(convert(varchar(50),@i),'2001-10-1',100)
inserttable2values(convert(varchar(50),@i),'2001-11-1',50)
set@i=@i+1
end
inserttable2values(convert(varchar(50),@i),'2001-10-1',90)
select*fromtable2orderbyoutdate,convert(int,username)
2.组合查询语句:
a.我们必须返回一个从第一天开始到100天的纪录集:
如:2001-10-1(这个日期是任意的)到2002-1-8
由于第一天是任意一天,所以我们需要下面的SQL语句:
selecttop100dateadd(d,convert(int,username)-1,min(outdate))asoutdate
fromtable2
groupbyusername
orderbyconvert(int,username)
这里的奥妙在于:
convert(int,username)-1(记得我们指定用户名从1-100:-))
groupbyusername,min(outdate):第一天就可能每个用户有多个纪录。
返回的结果:
outdate
------------------------------------------------------
2001-10-0100:00:00.000
.........
2002-01-0800:00:00.000
b.返回一个所有用户名的纪录集:
selectdistinctusernamefromtable2
返回结果:
username
--------------------------------------------------
1
10
100
......
99
c.返回一个100天记录集和100个用户记录集的笛卡尔集合:
select*from
(
selecttop100dateadd(d,convert(int,username)-1,min(outdate))asoutdate
fromtable2
groupbyusername
orderbyconvert(int,username))asA
CROSSjoin
(
selectdistinctusernamefromtable2
)asB
orderbyoutdate,convert(int,username)
返回结果100*100条纪录:
outdate
username
2001-10-0100:00:00.000
1
......
2002-01-0800:00:00.000
100
d.返回当前所有用户在数据库的有的纪录:
selectoutdate,username,min(cash)ascashfromtable2
groupbyoutdate,username
orderbyoutdate,convert(int,username)
返回纪录:
outdate
username
cash
2001-10-0100:00:00.000
1
90
......
2002-01-0800:00:00.000
100
50
e.将c中返回的笛卡尔集和d中返回的纪录做leftjoin:
selectC.outdate,C.username,
D.cash
from
(
select*from
(
selecttop100dateadd(d,convert(int,username)-1,min(outdate))asoutdate
fromtable2
groupbyusername
orderbyconvert(int,username)
)asA
CROSSjoin
(
selectdistinctusernamefromtable2
)asB
)asC
leftjoin
(
selectoutdate,username,min(cash)ascashfromtable2
groupbyoutdate,username
)asD
on(C.username=D.usernameanddatediff(d,C.outdate,D.outdate)=0)
orderbyC.outdate,convert(int,C.username)
注意:用户在当天如果没有纪录,cash字段返回NULL,否则cash返回每个用户当天的余额
outdate
username
cash
2001-10-0100:00:00.000
1
90
2001-10-0100:00:00.000
2
100
......
2001-10-0200:00:00.000
1
902001-10-0200:00:00.000
2
NULL
<--注意这里
......
2002-01-0800:00:00.000
100
50
f.好了,现在我们最后要做的就是,如果cash为NULL,我们要返回小于当前纪录日期的第一个用户余额(由于我们使用orderbycash,所以返回top1纪录即可,使用min应该也可以),这个余额即为当前的余额:
caseisnull(D.cash,0)
when0then
(
selecttop1cashfromtable2wheretable2.username=C.username
anddatediff(d,C.outdate,table2.outdate)<0
orderbytable2.cash
)
elseD.cash
endascash
g.最后组合的完整语句就是
selectC.outdate,C.username,
caseisnull(D.cash,0)
when0then
(
selecttop1cashfromtable2wheretable2.username=C.username
anddatediff(d,C.outdate,table2.outdate)<0
orderbytable2.cash
)
elseD.cash
endascash
from
(
select*from
(
selecttop100dateadd(d,convert(int,username)-1,min(outdate))asoutdate
fromtable2
groupbyusername
orde
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度山西省高校教师资格证之高等教育心理学自测模拟预测题库
- 学校垃圾分类督导员工作总结
- 2024年智能设备硬件采购协议
- 2024室内装潢工程合作协议书
- 2024广告服务公司与客户协议
- 2024年供应商协议格式
- 2024年专项事务跟踪代理协议模板
- 2024城市地下停车场租赁协议
- 2024年商品交易协议模板
- 2024年稻草批发销售协议范本
- 培训课程版权合同模板
- 投诉法官枉法裁判范本
- 密封条范文模板(A4打印版)
- 辛亥革命(共16张PPT)
- 班前安全技术交底记录表
- 最新数字化信息化智能化在磁控溅射卧式铝镜生产技术中应用
- 梁场临建技术交底
- 镰刀形细胞贫血症PPT课件
- 热压封口机3Q验证方案
- 第2讲同步发电机数学模型
- 五年级上册数学应用题精选150道
评论
0/150
提交评论