数据库题目解答

 在网上看到这些题但是没有答案,所以自己解答了一下,

1.用一条SQL语句 查询出每门课都大于80分的学生姓名(表名:score)

name  kecheng   fenshu
张三    语文       81
张三    数学      75
李四    语文      76
李四    数学      90
王五    语文      81
王五    数学      100
王五    英语      90

答:

select distinct name
from test
where name not in(
 select name
 from test
 where fenshu<80
)


2.学生表(student) 如下:
自动编号   学号 姓名  课程编号 课程名称 分数
1        2005001 张三   0001       数学        69
2        2005002 李四    0001      数学        89
3        2005001 张三    0001      数学        69
删除除了自动编号不同,其他都相同的学生冗余信息
答:

delete a
from table_name a
inner join(
 select 学号, 姓名  ,课程编号 ,课程名称 ,分数,min(自动编号) 自动编号
 from table_name
 group by 学号, 姓名,  课程编号 ,课程名称 ,分数
) b on a.学号=b.学号 and a.姓名=b.姓名 and a.课程名称=b.课程名称 and a.分数=b.分数 and a.自动编号>b.自动编号

3.一个叫department的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球队,现在四个球队进行比赛,用一条sql语句显示所有可能的比赛组合。

解:

select a.name,b.name
from departmen a
inner join departmen b on a.name<b.name

 

4.请用SQL语句实现:从TestDB数据表中查询出所有月份的发生额都比101科目相应月份的发生额高的科目。请注意:TestDB中有很多科目,都有1-12月份的发生额。
AccID:科目代码,Occmonth:发生额月份,DebitOccur:发生额。

答:

select a.*
from table_name a
inner join(
 select Occmonth,DebitOccur
 from table_name
 where AccID=101
) b on a.Occmonth=b.Occmonth and a.DebitOccur>b.DebitOccur
where AccID<>101

 

5.怎么把这样一个表(aaa)
year   month amount
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
查成这样一个结果
year  m1   m2   m3   m4
1991 1.1  1.2   1.3   1.4
1992 2.1  2.2   2.3   2.4

解法一:
select year,max(m1) as m1
,max(m2) as m2,max(m3) as m3,max(m4) as m4,max(m5) as m5
,max(m6) as m6,max(m7) as m7,max(m8) as m8,max(m9) as m9
,max(m10) as m10,max(m11) as m11,max(m12) as m12
from(
 select [year]
 ,m1=case when [month]=1 then amount else 0 end
 ,m2=case when [month]=2 then amount else 0 end
 ,m3=case when [month]=3 then amount else 0 end
 ,m4=case when [month]=4 then amount else 0 end
 ,m5=case when [month]=5 then amount else 0 end
 ,m6=case when [month]=6 then amount else 0 end
 ,m7=case when [month]=7 then amount else 0 end
 ,m8=case when [month]=8 then amount else 0 end
 ,m9=case when [month]=9 then amount else 0 end
 ,m10=case when [month]=10 then amount else 0 end
 ,m11=case when [month]=11 then amount else 0 end
 ,m12=case when [month]=12 then amount else 0 end
 from aa
)a
group by year

 

解法二:
SELECT year, [1] AS Emp1, [2] AS Emp2, [3] AS Emp3, [4] AS Emp4, [5] AS Emp5
FROM(
 SELECT year,month,amount
 FROM aa
) p
PIVOT
(
 max (amount)
 FOR [month] IN
 ( [1], [2], [3], [4], [5] )
) AS pvt
ORDER BY year;





6.复制表(只复制结构,源表名:a 新表名:b)
答:select top 0 * into bb from aa

7.拷贝表(拷贝数据,源表名:a 目标表名:b)

答:select   * into bb from aa

 

8.表a有字段:title(文章标题)、username(提交人)、adddate(回复时间),请写出显示“文章、提交人和最后回复时间”的语句

答:题意我觉得有歧义。
select title,username,max(adddate) as adddate
from table_name
group by title,username

 

9.写一个外连接查询语句(表名1:a 表名2:b)
select *
from table_name a
FULL JOIN table_name b on  a.year=b.month

 

10.“日程安排”表,其中有个字段“会议开始时间”,请写一个查询五分钟以后开会的日程安排记录语句。
答:
select *
from table_name
where 会议开始时间>dateadd(mi,5,会议开始时间)

 

11.两张关联表(a,b),删除主表中已经存在而副表中没有的信息
答:假设a的主键为ID,b的外键为ID和a的ID关联

delete from a where id not in (select idfrom b)

12.有两个表A和B,均有key和value两个字段,如果B的key在A中也有,就把B的value换为A中对应的value,这道题的SQL语句怎么写?

答:
update bb set bb.value=aa.value
from A aa
inner join B bb on a.key=b.key

13.课程得分表course:
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 ,coursename ,score, mark =case when score>=60 then 'pass' else 'fail' end
from course


 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值