经典SQL面试题(转)
http://www.cnblogs.com/kcher90/archive/2013/03/13/2957932.html
有三个表,如果学生缺考,那么在成绩表中就不存在这个学生的这门课程成绩的记录,写一段SQL语句,检索出每个学生缺考的科目。
A 学生表(student)
字段1 学生号(s_id)
字段2 学生名(s_name)
B 科目表(course)
字段1 科目号(c_id)
字段2 科目名(c_name)
C 成绩表(grade)
字段1 成绩号(g_id)
字段2 学生号(s_id)
字段3 科目号(c_id)
字段4 成绩(score)
select * from student join course left join grade on student.s_id=grade.s_id and course.c_id=grade.c_id where grade.score is null;
2.有如下表
日期(rstime) | 结果(result) |
2005-05-09 | 胜 |
2005-05-09 | 胜 |
2005-05-09 | 负 |
2005-05-09 | 负 |
2005-05-10 | 胜 |
2005-05-10 | 负 |
2005-05-10 | 负 |
如果要生成下列结果,该如何写sql语句?
日期 | 胜 | 负 |
2005-05-09 | 2 | 2 |
2005-05-10 | 1 |
2 |
select rstime,sum(case result when '胜' then 1 else 0 end)as 胜, sum(case result when '负' then 1 else 0 end)as 负 from result group by rstime;
3.用一条SQL语句,查询出成绩表(grade)每门课都大于80分的学生姓名
name | course | score |
张三 | 语文 | 81 |
张三 | 数学 | 75 |
李四 | 语文 | 76 |
李四 | 数学 | 90 |
王五 | 语文 | 81 |
王五 | 数学 | 100 |
王五 | 英语 | 90 |
select distinct name from grade where name not in (select distinct name from grade where score<=80)
1.原表:
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 *,case when score>=60 then 'pass' else 'fail' end as 'mark' from temp;
5.学生表(stu),如下:
自动编号 | 学号 | 姓名 | 课程编号 | 课程名称 | 分数 |
1 | 2005001 | 张三 | 0001 | 数学 | 69 |
2 | 2005002 | 李四 | 0001 | 数学 | 89 |
3 | 2005001 | 张三 | 0001 | 数学 |
69 |
删除除了自动编号不同,其他字段都相同的学生冗余信息。
create table temp as select 自动编号 from stu group by 学号,姓名,课程编号,课程名称,分数; delete from stu where 自动编号 not in (select 自动编号 from temp); --其实也可以这样的--
delete from stu where id not in (select max(id) from stu group by no,course,fenshu )