SQL笔试题(⽜客⽹)
Describetion 1:
⼤学⽣春季运动会的数据库,保存了⽐赛信息的三个表如下:运动员 sporter(运动员编号 sporterid,姓名name,性别 sex,所属系
号 department),项⽬ item(项⽬编号 itemid,名称 itemname,⽐赛地点 location),成绩 grade(运动员编号 id,项⽬编号 itemid,积分 mark)。
Request 1:
⽤SQL语句完成在“体育馆”进⾏⽐赛的各项⽬名称及其冠军的姓名。
SELECT i.itemname,s.name
FROM grade g,item i,sporter s,
(SELECT itemid iid,MAX(mark) max  FROM grade  WHERE itemid IN ( SELECT itemid FROM item  WHERE location='体育馆')        GROUP BY itemid) temp WHERE g.itemid=temp.iid AND g.mark=temp.max AND temp.iid=i.itemid AND s.sporterid=g.sporterid;
Describetion 2:
某打车公司将驾驶⾥程(drivedistanced)超过5000⾥的司机信息转移到⼀张称为seniordrivers 的表中,他们的详细情况被记录在表drivers 中,正确的sql为()
select * into seniordrivers from drivers where drivedistanced >=5000
INSERT INTO 语句⽤于向表格中插⼊新的⾏
INSERT INTO table_name VALUES (值1, 值2,....)
指定所要插⼊数据的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
从⼀个表中选取数据,然后把数据插⼊另⼀个表中
把所有的列插⼊新表
SELECT *
INTO new_table_name [IN externaldatabase]
FROM old_tablename
只把希望的列插⼊新表
SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_tablename
Description 3:
有两张表,如下图所⽰
表A(仅列出部分数据作参考)
Order_id User_id Add_time
11701245001100001498882474
11701245002100011498882475
表B:(仅列出部分数据作参考)
id Order_id goods_id price
111701245001100110
211701245001100220
311701245002100110
Request 3 :
⽤SQL查询购买过goods_id 为1001的⽤户user_id()
1. select a.user_id from A a,B b der_der_id ds_id='1001'
2. select user_id from A where order_id in (select order_id from B where goods_id = '1001')
3. select A.user_id from A left join B der_der_id ds_id='1001'
注意第三条语句,⽤的是左。
Description 4:
请取出 BORROW表中⽇期(RDATE字段)为当天的所有记录?(RDATE字段为datetime型,包含⽇期与时间)。
select * from BORROW where datediff(dd,RDATE,getdate())=0
datadiff 的⽤法:
DATEDIFF() 函数返回两个⽇期之间的时间。
语法:DATEDIFF(datepart,startdate,enddate)
startdate和enddate参数是合法的⽇期表达式。
datepart参数可以是下列的值:
datepart缩写
年yy, yyyy
季度qq, q
⽉mm, m
年中的⽇dy, y
⽇dd, d
周wk, ww
星期dw, w
⼩时hh
分钟mi, n
秒ss, s
毫秒ms
微妙mcs
纳秒ns
Description 5:
⼀张学⽣成绩表score,部分内容如下:
name course grade
张三操作系统67
张三数据结构86
李四软件⼯程89
Request 5:
⽤⼀条SQL 语句查询出每门课都⼤于80 分的学⽣姓名。
1.
select中distinctselect distinct s.name from score s
where name not in
(select name from score where grade <=80)
2.
select distinct s.name from score s
group by s.name
having ade) > 80
注意:
1.where 在分组前过滤,having 在分组后过滤,两者之间不冲突。
2.在select ⼦句中,只可以有组函数和分组字段。如果没有分组字段那就是所有的字段都可以在select 字句中。注意第六、七题是同款题⽬,都是
Description 6:
Date Win
2017-07-12胜
2017-07-12负
2017-07-15胜
2017-07-15负
Request 6:
要⽣成下列结果 :
⽐赛⽇期胜负
2017-07-1211
2017-07-1511
select Date as ⽐赛⽇期,sum(case when Win ='胜' 1 else 0 end) 胜,sum(case when Win='负' 1 else 0 end ) 负
from result
group by Date
Description 7:
有⼀张学⽣成绩表sc(sno 学号,class 课程,score 成绩),请查询出每个学⽣的英语、数学的成绩(⾏转列,⼀个学⽣只有⼀⾏记录)。select sno , sum(if(class='english',score,0)) english ,sum(if(class='math',score,0)) math
from sc
where class in ('english','math')
group by sno