SQL试题

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

name course grade

张三 语文 81

张三 数学 75

李四 语文 76

李四 数学 90

王五 语文 81

王五 数学 100

王五 英语 90

答案:

select name from student1 group by name having min(grade)>80;


2. 现有学生表如下:

自动编号 学号 姓名 课程编号 课程名称 分数

1 2005001 张三 0001 数学 69

2 2005002 李四 0001 数学 89

3 2005001 张三 0001 数学 69

删除除了自动编号不同, 其他都相同的学生冗余信息

答案:

delete from student2 WHERE id in (select * from (select min(id)
from student2 group by number,name,Cnum,course,grade
having count(*)>1) as a);

注意:

1.mysql不允许update、delelte目标表和子查询里面的表为同一张表,会报1093错误。我们需要将子查询sql可以改变成双层的子查询。

2.在用进行嵌套查询的时候,子查询(select * from (select min(id) from student2 group by number,name,Cnum,course,grade having count(*)>1)执行出来的的结果是需要作为一个派生表来给上一级进行查询(select * from)使用的,因此子查询的结果必须要有一个别名,不然会报错误:

1248 - Every derived table must have its own alias

这里“别名”的使用可以理解为是用作临时变量记录子查询的结果,我这里使用了a作为别名。


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

答案:使用内连接

select * from team a join team b on a.name<b.name;

注意:如果使用a.name!=b.name查询出来的组合结果会重复,比如:

SQL试题

 因此这里要用a.name<b.name。


4.

上一篇:第一章 排序算法刷题笔记


下一篇:mysql 根据查询的数据关联更新表中数据