-- 实验3
# 1. 嵌套查询
#
# (1)在stuinfo表中查找与“刘东阳”性别相同的所有学生的姓名、出生日期。
select 姓名, 出生日期
from stuinfo
where 性别 = (select 性别from stuinfowhere 姓名 = '刘东阳');
# (2)使用IN查找所修课程编号为002、005的学生学号、姓名、性别。
select 学号, 姓名, 性别
from stuinfo
where 学号 in (select 学号from gradewhere 课程编号 = '002'or 课程编号 = '005');
# (3)在grade表中查找分数比学号为2020002的学生的某个分数高的学生信息。
select 分数
from grade
where 分数 > (select min(分数)from gradewhere 学号 = '2020002');
# (4)在grade表中查找分数比学号为2020002的学生的最高成绩还要高的学生信息。
select*
from stuinfo sjoin grade g
where 分数 > (select max(分数)from gradewhere 学号 = '2020002')and s.学号 = g.学号;# (5)把stuinfo表中姓“刘”的学生的学号、姓名与姓“张”的学生的学号、姓名合并一个表中。
create table zl as (select 姓名, 学号from stuinfowhere 姓名 like '刘%'or 姓名 like '张%');
# (6)查询分数在80-90范围内的学生的学号、姓名、分数。
select s.学号, 姓名, 分数
from stuinfo sjoin grade g
where g.分数 between 80 and 90;
# (7)使用INNER JOIN查询学习了“数据库原理及应用”课程的学生学号、姓名、课程名称和分数。
select s.学号, 姓名, c.课程名称, g.分数
from stuinfo sinner join grade ginner join course con s.学号 = g.学号 and c.课程编号 = g.课程编号 and c.课程名称 = '数据库原理及应用';
# (8)查询每个学生所选课程的最高成绩,要求列出学号、姓名、最高成绩。
select s.学号, 姓名, 分数
from stuinfo s,grade g
where s.学号 = g.学号and 分数 in (select max(分数)from gradegroup by grade.学号);# (9)使用左外连接查询每个学生的总成绩,要求列出学号、姓名、总成绩,没有选修课程的学生的总成绩为空。
select s.学号, 姓名, 分数
from stuinfo sleft join grade gon g.学号 = s.学号;
# (10)为grade表添加数据行:学号为2020004、课程编号为006、分数为76。
insert into grade
values ('2020004', '006', 76);
# (11)用EXISTS查询跟刘东阳不在同一个系的同学的姓名和系部信息。
-- 题目错误
# (12)查询选修了001和002号课程的学生姓名和年龄。
SELECT s.姓名, YEAR(CURDATE()) - YEAR(s.出生日期) AS 年龄
FROM stuinfo sJOIN grade g ON s.学号 = g.学号
WHERE g.课程编号 IN ('001', '002');
# (13)查询比计算机系任何一个学生年龄都小的学生姓名、年龄。
select 姓名, YEAR(CURDATE()) - YEAR(s.出生日期) AS 年龄
from stuinfo s
where 出生日期 = (select max(出生日期)from stuinfo);
# (14)查询年龄比所有女生年龄大的男生的学号、年龄。
select 学号, YEAR(CURDATE()) - YEAR(s.出生日期) as 年龄
from stuinfo s
where 出生日期 > (select min(stuinfo.出生日期)from stuinfowhere stuinfo.姓名='女');
# (15)查询比数学系任何一个学生年龄都大的学生姓名、年龄。
-- 不存在该字段
# (16)查询刘晨没选的所有课程的课程号。
select 课程编号
from grade
where grade.课程编号 not in(select 课程编号from grade,stuinfowhere stuinfo.学号=grade.学号and stuinfo.姓名='刘晨');
# (17)使用右外连接查询所有课程的选修情况,要求列出课程编号、课程名称、选修人数,course表中没有的课程查询表中的列值为空。
select c.课程编号,c.课程名称,count(g.学号)as 选修人数
from course c right join grade g
on g.课程编号=c.课程编号
group by c.课程编号,c.课程名称;