您的位置:首页 > 职场人生

数据库常见的面试题 3ff8

2018-05-22 11:41 267 查看
1.用一条SQL语句查询出每门课都大于80分的学生姓名
name kecheng fenshu
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90

1A:
select distince name
from table
where name not in (select distince name
from  table
where fenshu <= 80)
1B:
select name
from table
group by name
having min(fenshu) > 80

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

delete from table
where 自动编号 not in (select min(自动编号)
from table
group by 学号,姓名,课程编号,课程名称,分数)

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

select t1.name,t2.name
from team as t1, team as t2
where t1.name < t2.name

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

!-- "都大于或者都比某个值高" 可以转换为 "not in (存在小于等于)"
select distinct AccID from TestDB
where AccID not in
(select TestDB.AccID
from TestDB, (select * from TestDB where AccID = '101') as db101
where TestDB.Occmonth = db101.Occmonth and TestDB.DebitOccur <= db101.DebitOccur);

5.怎么把这样一个表:
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,
(select amount from table as ia where month = 1 and ia.year = fa.year) as m1,
(select amount from table as ia where month = 2 and ia.year = fa.year) as m2,
(select amount from table as ia where month = 3 and ia.year = fa.year) as m3,
(select amount from table as ia where month = 4 and ia.year = fa.year) as m4
from table as fa
group by year

6.说明:复制表(只复制结构,源表名:a,新表名:b)

select * into b from a where 1<>1
(where1=1,拷贝表结构和数据内容)

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

insert into b(a, b, c) select d,e,f from a;

注:select into from 和 insert into select都是用来复制表,两者的主要区别为: select into from 要求目标表不存在,因为在插入时会自动创建。insert into select from 要求目标表存在

8.SQL的case when then else end语句的用法

case具有两种格式。简单case函数和case搜索函数。
--简单case函数
case sex
when '1' then '男'
when '2' then '女'
else '其他' end
--case搜索函数
case when sex = '1' then '男'
when sex = '2' then '女'
else '其他' end
case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略。
--比如说,下面这段sql,你永远无法得到“第二类”这个结果
case when col_1 in ( 'a', 'b') then '第一类'
when col_1 in ('a')       then '第二类'
else '其他' end
--SQL中有判断的地方就可以用到他,相当于其他语言的if-else,如果怎样就怎样,否则就怎样
--比如,如果性别为1就显示为男,否则就显示为女
Select Name,
case when Sex =0 then '男' else '女' end 性别
From ZlEmployee
--行转列
Select Code,
Case when Sex=0 then Name else '' end As 男,
Case when Sex=1 then Name else '' end As 女
From ZlEmployee
--自定义排序
Select Name,Sex
from ZlEmployee
order by case Left(Name,1)
when '赵' then 1
when '钱' then 2
when '孙' then 3
when '李' then 4
when '周' then 5
when '吴' then 6
when '郑' then 7
when '王' then 8
Else 9 End

关于case函数的具体应用,可以参考http://blog.sina.com.cn/s/blog_4c538f6c01012mzt.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: