有课程表,学生表,成绩表如下,查询所有人都选修了的课程号与课程名。
course
列名 | 数据类型 | 约束 | 说明 |
cno | char(4) | 主键非空 | 课程号 |
cname | varchar(40) | 非空 | 课程名 |
cpno | char(4) | 参照course(cno) | 先修课 |
ccredit | tinyint | 学分 |
student
列名 | 数据类型 | 约束 | 说明 |
sno | char(7) | 主键非空 | 学号 |
sname | char(10) | 非空 | 学生姓名 |
ssex | enum(‘男’,‘女’) | 默认‘男’ | 性别 |
sage | tinyint | 年龄 | |
sdept | char(20) | 默认’计算机系’ | 系别 |
sc
列名 | 数据类型 | 约束 | 说明 |
sno | char(7) | 主键非空,参照student(sno) | 学号 |
cno | char(4) | 主键非空,参照course(cno) | 课程号 |
grade | decimal(5,1) | 成绩 | |
ccredit | tinyint |
# 查询所有人都选修了的课程号与课程名
select c.cno,c.cname from course c where not exists
(select s.sno from student s where not exists
(select a.cno from sc a where a.sno=s.sno and a.cno=c.cno))
#查询没有参加选课的学生,输出系名,学号,姓名,性别,按系名(升序),学号(升序)排序。
[注意:SQL表名请用小写]
学生数据库db_student包括三个数据表student(学生表)、course(课程表)和sc(选课表)。表结构如下:
1、student(学生表):
SNO学号CHAR(7)
SNAME姓名CHAR(10)
SSEX性别CHAR(2)
SAGE年龄SMALLINT
SDEPT所在系 VARCHAR(20)
2、course(课程表)
CNO课程号CHAR(10)
CNAME课程名VARCHAR(20)
CCREDIT学分SMALLINT
SEMSTER学期SMALLINT
PERIOD学时SMALLINT
3、sc(选课表)
SNO 学号CHAR(7)
CNO 课程号CHAR(10)
GRADE 绩 SMALLINT
#查询没有参加选课的学生,输出系名,学号,姓名,性别,按系名(升序),学号(升序)排序。
select s.sdept ,s.sno ,s.sname,s.ssex
from student s
where s.sno not in (select distinct sno from sc )
order by s.sdept asc ,s.sno asc;
#统计各门课程选修人数,要求输出课程代号,课程名,有成绩人数(grade不为NULL),最高分,最低分,平均分(取整round函数),按课程号排序。
[注意:SQL表名请用小写]
学生数据库db_student包括三个数据表student(学生表)、course(课程表)和sc(选课表)。表结构如下:
1、student(学生表):
SNO学号CHAR(7)
SNAME姓名CHAR(10)
SSEX性别CHAR(2)
SAGE年龄SMALLINT
SDEPT所在系 VARCHAR(20)
2、course(课程表)
CNO课程号CHAR(10)
CNAME课程名VARCHAR(20)
CCREDIT学分SMALLINT
SEMSTER学期SMALLINT
PERIOD学时SMALLINT
3、sc(选课表)
SNO 学号CHAR(7)
CNO 课程号CHAR(10)
GRADE 成绩 SMALLINT
#统计各门课程选修人数,要求输出课程代号,课程名,有成绩人数(grade不为NULL),最高分,最低分,平均分(取整round函数),按课程号排序。
select c.cno,c.cname,count(sc.sno),max(sc.grade),min(sc.grade),round(avg(sc.grade)) from course c
join sc on c.cno=sc.cno
where sc.grade is not null
group by c.cno
order by c.cno;
有课程表,学生表,成绩表如下,查询计算机系平均成绩高于70分的学号,姓名、平均成绩,并按平均成绩降序排列。
course
列名 | 数据类型 | 约束 | 说明 |
cno | char(4) | 主键非空 | 课程号 |
cname | varchar(40) | 非空 | 课程名 |
cpno | char(4) | 参照course(cno) | 先修课 |
ccredit | tinyint | 学分 |
student
列名 | 数据类型 | 约束 | 说明 |
sno | char(7) | 主键非空 | 学号 |
sname | char(10) | 非空 | 学生姓名 |
ssex | enum(‘男’,‘女’) | 默认‘男’ | 性别 |
sage | tinyint | 年龄 | |
sdept | char(20) | 默认’计算机系’ | 系别 |
sc
列名 | 数据类型 | 约束 | 说明 |
sno | char(7) | 主键非空,参照student(sno) | 学号 |
cno | char(4) | 主键非空,参照course(cno) | 课程号 |
grade | decimal(5,1) | 成绩 | |
ccredit | tinyint |
#查询计算机系平均成绩高于70分的成绩信息
SELECT sc.sno, s.sname, AVG(sc.grade)
FROM sc
JOIN student s ON sc.sno = s.sno
WHERE s.sdept = '计算机系'
GROUP BY sc.sno
HAVING AVG(sc.grade) > 70
ORDER BY AVG(sc.grade) DESC
# 查询同时选修了“数据库基础”和“计算机网络”两门课的学生的学号,姓名。
select sno,sname
from student
where sno in
(select sno
from course,sc
where course.cno=sc.cno and cname='数据库基础'and sno in
(select sno
from course,sc
where course.cno=sc.cno and cname='计算机网络'));
select sno,sname from student
where not exists(select * from course where cname in('数据库基础','计算机网络')
and not exists (select * from sc where sno=student.sno and cno=course.cno))
SELECT sno, sname
。FROM
子句中,我们选择了 student
表,表示我们要查询学生的信息。WHERE
子句中,我们使用了一个子查询来筛选同时选修了“数据库基础”和“计算机网络”两门课程的学生。具体来说,子查询中的第一个 NOT EXISTS
子句用于筛选选修了至少一门不是这两门课程的学生,第二个 NOT EXISTS
子句用于筛选未选修这两门课程的学生。通过使用两个 NOT EXISTS
子句的嵌套,我们筛选出了选修了这两门课程的学生。SELECT * FROM course WHERE cname IN ('数据库基础', '计算机网络')
来选择选修了这两门课程的课程记录。然后,我们使用 NOT EXISTS
子句来筛选未选修这些课程的学生。具体来说,NOT EXISTS
子句中的子查询 SELECT * FROM sc WHERE sno = student.sno AND cno = course.cno
用于查找学生选课表中是否存在选修了这些课程的记录。如果不存在这样的记录,那么学生就未选修这些课程。如果对not exists用法不熟悉 建议用两次子查询
#查询选修了课程的学生的学号和姓名,按学号排序。
[注意:SQL表名请用小写]
学生数据库db_student包括三个数据表student(学生表)、course(课程表)和sc(选课表)。表结构如下:
1、student(学生表):
SNO学号CHAR(7)
SNAME姓名CHAR(10)
SSEX性别CHAR(2)
SAGE年龄SMALLINT
SDEPT所在系 VARCHAR(20)
2、course(课程表)
CNO课程号CHAR(10)
CNAME课程名VARCHAR(20)
CCREDIT学分SMALLINT
SEMSTER学期SMALLINT
PERIOD学时SMALLINT
3、sc(选课表)
SNO 学号CHAR(7)
CNO 课程号CHAR(10)
GRADE 成绩 SMALLINT
#查询选修了课程的学生的学号和姓名,按学号排序。
select distinct s.sno,s.sname from student s,sc
where s.sno = sc.sno
order by s.sno;
#查询学生的选课情况,要求输出学号,姓名,课程门数,课程名列表(按课程名升序排列,用下划线_分隔),按照学号升序排序。
[注意:SQL表名请用小写]
学生数据库db_student包括三个数据表student(学生表)、course(课程表)和sc(选课表)。表结构如下:
1、student(学生表):
SNO学号CHAR(7)
SNAME姓名CHAR(10)
SSEX性别CHAR(2)
SAGE年龄SMALLINT
SDEPT所在系 VARCHAR(20)
2、course(课程表)
CNO课程号CHAR(10)
CNAME课程名VARCHAR(20)
CCREDIT学分SMALLINT
SEMSTER学期SMALLINT
PERIOD学时SMALLINT
3、sc(选课表)
SNO 学号CHAR(7)
CNO 课程号CHAR(10)
GRADE 成绩 SMALLINT
#查询学生的选课情况,要求输出学号,姓名,课程门数,课程名列表(按课程名升序排列,用下划线_分隔),按照学号升序排序。
SELECT s.sno,sname,COUNT(*),
GROUP_CONCAT(cname ORDER BY cname SEPARATOR '_')'课程名列表'
FROM student s,sc,course cs
WHERE s.sno=sc.sno AND sc.cno=cs.cno
GROUP BY s.sno
ORDER BY s.sno;
GROUP BY
子句对每个学生进行分组,统计每个学生所选课程的数量和课程名列表;GROUP_CONCAT
函数将每个学生所选课程的课程名按照字母表顺序排序并用下划线连接起来,形成课程名列表;#查询每个男生的选课门数(要求用嵌套查询实现)要求输出学号、选课门数,并按序号升序排序。
[注意:SQL表名请用小写]
#查询每个男生的选课门数(要求用嵌套查询实现)要求输出学号、选课门数,并按学号升序排序。
select sc.sno,count(*)
from sc
where sno in(select sno from student where ssex='男')
group by sno;
学生数据库db_student包括三个数据表student(学生表)、course(课程表)和sc(选课表)。表结构如下:
1、student(学生表):
SNO学号CHAR(7)
SNAME姓名CHAR(10)
SSEX性别CHAR(2)
SAGE年龄SMALLINT
SDEPT所在系 VARCHAR(20)
2、course(课程表)
CNO课程号CHAR(10)
CNAME课程名VARCHAR(20)
CCREDIT学分SMALLINT
SEMSTER学期SMALLINT
PERIOD学时SMALLINT
3、sc(选课表)
SNO 学号CHAR(7)
CNO 课程号CHAR(10)
GRADE 成绩 SMALLINT
select sno,sname from student where sno not in(
select sno from sc,course where sc.cno=course.cno and cname='计算机导论'
and sno in (
select sno from sc,course where sc.cno=course.cno and cname='计算机网络'
));
有课程表,学生表,成绩表如下,查询选修了学号为9521102同学选修的全部课程的学生学号和姓名。
course
列名 | 数据类型 | 约束 | 说明 |
cno | char(4) | 主键非空 | 课程号 |
cname | varchar(40) | 非空 | 课程名 |
cpno | char(4) | 参照course(cno) | 先修课 |
ccredit | tinyint | 学分 |
student
列名 | 数据类型 | 约束 | 说明 |
sno | char(7) | 主键非空 | 学号 |
sname | char(10) | 非空 | 学生姓名 |
ssex | enum(‘男’,‘女’) | 默认‘男’ | 性别 |
sage | tinyint | 年龄 | |
sdept | char(20) | 默认’计算机系’ | 系别 |
sc
列名 | 数据类型 | 约束 | 说明 |
sno | char(7) | 主键非空,参照student(sno) | 学号 |
cno | char(4) | 主键非空,参照course(cno) | 课程号 |
grade | decimal(5,1) | 成绩 | |
ccredit | tinyint |
# 查询选修了学号为9521102同学选修的全部课程的学生学号和姓名
SELECT DISTINCT s.sno, s.sname
FROM student s
WHERE NOT EXISTS (
SELECT *
FROM sc b
WHERE b.sno = '9521102' AND NOT EXISTS (
SELECT *
FROM sc c
WHERE s.sno = c.sno AND c.cno = b.cno
)
);
SELECT DISTINCT
关键字指定要查询的结果集中的每个记录都是唯一的,即去除重复记录。NOT EXISTS
子查询,表示查找不存在满足特定条件的记录。NOT EXISTS
子查询中,我们使用了一个子子查询,其中先查询出学号为9521102的学生选修的全部课程,然后再查询出除该学生外,选修了这些全部课程的学生。如果存在这样的学生,则该学生不符合条件,被排除在查询结果之外。查询95级学生(学号前两位)的选课情况,输出学号、姓名、课程号、成绩(包括未选课的学生信息)。
有课程表,学生表,成绩表如下,请完成查询。
course
列名 | 数据类型 | 约束 | 说明 |
cno | char(4) | 主键非空 | 课程号 |
cname | varchar(40) | 非空 | 课程名 |
cpno | char(4) | 参照course(cno) | 先修课 |
ccredit | tinyint | 学分 |
student
列名 | 数据类型 | 约束 | 说明 |
sno | char(7) | 主键非空 | 学号 |
sname | char(10) | 非空 | 学生姓名 |
ssex | enum(‘男’,‘女’) | 默认‘男’ | 性别 |
sage | tinyint | 年龄 | |
sdept | char(20) | 默认’计算机系’ | 系别 |
sc
列名 | 数据类型 | 约束 | 说明 |
sno | char(7) | 主键非空,参照student(sno) | 学号 |
cno | char(4) | 主键非空,参照course(cno) | 课程号 |
grade | decimal(5,1) | 成绩 | |
ccredit | tinyint |
# 查询95级学生(学号前两位)的选课情况,输出学号、姓名、课程号、成绩(包括未选课的学生信息)。
select s.sno,s.sname,sc.cno,sc.grade
from student s
left join sc on sc.sno = s.sno
where s.sno like '95%';
有课程表,学生表,成绩表如下,查询选课门数最多的学生的学号和姓名,结果可能不只一行。
course
列名 | 数据类型 | 约束 | 说明 |
cno | char(4) | 主键非空 | 课程号 |
cname | varchar(40) | 非空 | 课程名 |
cpno | char(4) | 参照course(cno) | 先修课 |
ccredit | tinyint | 学分 |
student
列名 | 数据类型 | 约束 | 说明 |
sno | char(7) | 主键非空 | 学号 |
sname | char(10) | 非空 | 学生姓名 |
ssex | enum(‘男’,‘女’) | 默认‘男’ | 性别 |
sage | tinyint | 年龄 | |
sdept | char(20) | 默认’计算机系’ | 系别 |
sc
列名 | 数据类型 | 约束 | 说明 |
sno | char(7) | 主键非空,参照student(sno) | 学号 |
cno | char(4) | 主键非空,参照course(cno) | 课程号 |
grade | decimal(5,1) | 成绩 | |
ccredit | tinyint |
#查询选课门数最多的学生的学号和姓名
select s.sno,s.sname from student s,sc
where s.sno=sc.sno
group by s.sno
having count(*) = (select count(*) from sc
group by sno
order by count(*) desc
limit 1);
有课程表,学生表,成绩表如下,请完成查询,输出成绩信息学号、课程号及成绩,最高分可能有多门成绩。
course
列名 | 数据类型 | 约束 | 说明 |
cno | char(4) | 主键非空 | 课程号 |
cname | varchar(40) | 非空 | 课程名 |
cpno | char(4) | 参照course(cno) | 先修课 |
ccredit | tinyint | 学分 |
student
列名 | 数据类型 | 约束 | 说明 |
sno | char(7) | 主键非空 | 学号 |
sname | char(10) | 非空 | 学生姓名 |
ssex | enum(‘男’,‘女’) | 默认‘男’ | 性别 |
sage | tinyint | 年龄 | |
sdept | char(20) | 默认’计算机系’ | 系别 |
sc
列名 | 数据类型 | 约束 | 说明 |
sno | char(7) | 主键非空,参照student(sno) | 学号 |
cno | char(4) | 主键非空,参照course(cno) | 课程号 |
grade | decimal(5,1) | 成绩 |
# 输出成绩信息学号、课程号及成绩,最高分可能有多门成绩。
select * from sc student
where grade=(select max(grade) from sc where sc.sno=student.sno);
#查询同时选修了c01,c02,c03课程学生,输出学号,姓名
#查询同时选修了c01,c02,c03课程学生,输出学号,姓名
select sno,sname from student
where not exists (select * from course where cno in ('c01','c02','c03') #筛选出选修了这几门课程中任意一门或多门的学生记录
and not exists (select * from sc where sno=student.sno and cno=course.cno))
查询每门课程被选修的情况,输出课程号,课程名,被选修次数,结果按选修次数降序课程号降序排列。
其中课程表course结构为
#查询每门课程被选修的情况,输出课程号,课程名,被选修次数,结果按选修次数降序课程号降序排列。
select c.cno, c.cname, count(*)
from course c ,sc
where c.cno = sc.cno
group by c.cno
ORDER BY count(*) DESC, c.cno DESC;
查询每门课程被选修的情况(包括从未被选修过的课程),输出课程号,课程名,被选修次数,结果按选修次数升序课程号升序排列。
选修表sc结构为
# 查询每门课程被选修的情况(包括从未被选修过的课程)
select course.cno,cname,count(sno)
from course
left join sc on course.cno=sc.cno
group by course.cno
order by count(sno) asc ,course.cno asc
有课程表,学生表,成绩表如下,查询选修了c03课程的学生学号和姓名。
course
列名 | 数据类型 | 约束 | 说明 |
cno | char(4) | 主键非空 | 课程号 |
cname | varchar(40) | 非空 | 课程名 |
cpno | char(4) | 参照course(cno) | 先修课 |
ccredit | tinyint | 学分 |
student
列名 | 数据类型 | 约束 | 说明 |
sno | char(7) | 主键非空 | 学号 |
sname | char(10) | 非空 | 学生姓名 |
ssex | enum(‘男’,‘女’) | 默认‘男’ | 性别 |
sage | tinyint | 年龄 | |
sdept | char(20) | 默认’计算机系’ | 系别 |
sc
列名 | 数据类型 | 约束 | 说明 |
sno | char(7) | 主键非空,参照student(sno) | 学号 |
cno | char(4) | 主键非空,参照course(cno) | 课程号 |
grade | decimal(5,1) | 成绩 | |
ccredit | tinyint |
# 查询选修了c03课程的学生学号和姓名
select s.sno,s.sname from student s,sc
where sc.sno = s.sno
and cno = 'c03';
查询考试不及格的学生的学号(包括没有成绩的)。选课表(sc)表结构如下:
# 查询考试不及格的学生的学号(包括没有成绩的)
select distinct sno from sc
where grade < 60 or grade is null;
# 别忘了学号的去重