MySQL进阶版练习题

1、有张表score,内容如下,使用sql语句查询出每门课程都大于80分的学生姓名
表结构:
name kecheng score
张三 语文 81
张三 数学 75
李四 语文 98
李四 数学 88
提示:每门课程都大于80也就是一个学生他的所有成绩里的最低分大于80,
先按照学生进行分组,查询所有学生的考试成绩里的最低分,然后再找大于80的,注意这里使用having,因为是先分组后筛选

参考答案:select name,min(socre) as mi from score group by name having mi >80

2、有如下三个表(面试真题,题目稍微表示不清晰,但是公司出的题就是这样,需要理解,讨论,进入工作之后会遇到大量的专业词汇,也是需要自己推敲理解含义):
project (id int,name varchar(50))
contract( id int ,project_id int, money int)
pay(id int,contract_id int ,money int)
一个项目可能有多个合同,每个合同会分几次付款

(1)、写出sql:列出各个项目的合同金额总数
先要反推个个字段的含义。contract是合同,合同中的money字段就是一个合同的金额,其次,一个项目可能有多个合同,那么我们要求出所有合同的总金额。
我们先可以列出所有项目的所有合同,在这里发现可能会出现一个项目多条记录,我们可以对项目进行分组,然后求出每组money的总数
select name ,sub(money) from project left join contract on project.id=contract.project_id group by name
(2)、写出sql:列出id为1的项目所有已经付款的记录
select * from contract, pay where contract.id = pay.contract_id and project_id=1
(3)、写出sql:列出所有已经有付款记录的合同及对应的项目
select * from project, contract where contract.project_id = project.id
and contract.id in (select contract_id from pay)

3、student表与score表
student(name char,id int,address char,department)
score(c_name char,id int, grade int ,stu_id int)
1)、查询即参加了计算机又参加了英语考试的学生的信息
提示:多层子查询,先查询参加了计算机的,在其中再筛选参加了英语的
select * from student where id in (
select stu_id from score where c_name=‘计算机’ and id in (
select stu_id from score where c_name=‘英语’ )
)

2)、查询每个学科的平均成绩
提示:按照科目进行分组,然后使用函数求平均值
答案:select c_name,avg(grade) from score group by c_name

3)、查询平均分最高的科目名字
提示:此题用到了from子查询,
首先先查询按照课程进行分组的每门课程的平均分,也就是内层sql:
select avg(grade) as av,c_name from score group by c_name
然后在在结果中寻找平均分数最大的:
from子查询有要求,要求from的查询结果集必须有别名,方便在外层sql语句中对其进行使用也就是 max(avgs.av)。avgs表示的是结果集的别名,av是结果集中平均分的列的别名。
答案:select c_name,max(avgs.av), from
(select avg(grade) as av,c_name from score group by c_name )
as avgs

4)、查询所有成绩都及格的学生
提示:
先查询所有的学生的最低分数,最内层的查询:
select stu_id,min(grade)
as mi from score group by stu_id
having mi>60
接下里根据stu_id查询学生信息
但是这里需要注意以下的sql语句会报错。
select * from student where id in(
select student_id,min(grade)
as mi from score group by student_id
having mi>60
)
原因是 id in( student_id ,min(grade))这里,条件是根据id,但是作比较的有两列数据。故需要再嵌套一层循环只查询出来stu_id
答案:select * from student where id in (
select stu_id from (
select student_id,min(grade)
as mi from score group by student_id
having mi>60
)as s
)

5)、查询没有参加考试的学生信息
select * from student where id not in(select stu_id from score)

6查询语文成绩比张三高的学生的信息
提示:
先查询张三的语文成绩:a
再查询语文成绩成绩大于a的学生id:b
最后根据b查询学生信息
select * from student where id in(
select stu_id from score where grade >
( select grade from student where name =‘张三’ and c_name='语文’)
and c_name=‘语文’)

4、有两张表:
student(id int ,status char),表示学号和等级(优良中差),
score(s_id int, score int),表示学号和学生成绩。
写出一条sql语句:要求将成绩为80以上的学生的状态改为优秀。
提示:此题其实就是对子查询的联系使用,先查询成绩大于80的学生id,在根据id进行修改
答案:update student set status =‘优秀’ where id in (select s_id from score where score >80)

猜你喜欢

转载自blog.csdn.net/yang_guang3/article/details/83141631