2023年Sql常见面试题_第1页
2023年Sql常见面试题_第2页
2023年Sql常见面试题_第3页
2023年Sql常见面试题_第4页
2023年Sql常见面试题_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论