MySQL数据库实验三 数据高级查询

★观前提示:本篇内容为mysql数据库实验,代码内容经测试过,可能一小部分有所疏漏,也有会不符合每个人实验的要求的地方,因此以下内容建议仅做思路参考,。

一、实验目的

掌握复杂数据查询操作。

二、实验要求

掌握各种连接查询、嵌套查询的使用。

★温馨提示:以下内容均已经过测试,不过难免会有疏漏,但是代码实现大多数思路及实现经测验都是正确的。本节内容在命令行上实现,之后实验内容均在navicat数据库管理工具上实现

三、实现内容及步骤

(1) 查询每个学生及其选课情况。

SELECT student.sname '学生姓名',course.cname '已选课'
FROM student,course,sc
WHERE student.sno=sc.sno AND course.cno=sc.cno;

(2) 查询每门课的间接先修课。

SELECT c.cname '课程',cp.cname '先修课'
FROM course c,course cp
WHERE c.cpno=cp.cno;

(3) 将STUDENT,SC进行右连接。

SELECT student.*,sc.cno,sc.grade
FROM student
RIGHT OUTER JOIN sc
ON student.sno=sc.sno

(4) 查询既选修了2号课程又选修了3号课程的学生姓名、学号。

SELECT student.sno,student.sname
FROM student,sc
WHERE student.sno=sc.sno
AND cno='2' AND sc.sno IN(SELECT sno
FROM sc
WHERE cno='3');

(5) 查询和刘晨同一年龄的学生。

SELECT student.sname '姓名',student.sage '年龄'
FROM student
WHERE student.sage=(
SELECT student.sage
FROM student
WHERE student.sname='刘晨'
);

(6) 选修了课程名为“数据库”的学生姓名和年龄。

SELECT student.sname,student.sage
FROM student,course,sc
WHERE sc.sno=student.sno AND sc.cno=course.cno AND course.cname='数据库';

(7)查询其他系比IS系任一学生年龄小的学生名单。

SELECT student.*
FROM student
WHERE sage<ANY(SELECT sage FROM student WHERE sdept ='计科') and sdept <>'计科';

(8) 查询其他系中比IS系所有学生年龄都小的学生名单。

SELECT sno,sname
FROM student
WHERE sdept!='计科' AND sage < all(
SELECT sage
FROM student
WHERE sdept='计科'
);

(9) 查询选修了全部课程的学生姓名。

SELECT sname
FROM student
WHERE NOT EXISTS(
SELECT *
FROM course
WHERE NOT EXISTS(
SELECT *
FROM sc
WHERE sc.sno=student.sno and sc.cno=course.cno
)
);

(10) 查询计算机系学生及其性别是男的学生。

SELECT sname
FROM student
WHERE ssex='男' AND sdept='计科';

(11) 查询选修课程1的学生集合和选修2号课程学生集合的差集。

SELECT DISTINCT student.*
FROM student,sc
WHERE student.sno NOT IN(
SELECT sno
FROM sc
WHERE sc.cno = 2
)AND sc.cno=1;

(12) 查询李丽同学不学的课程的课程号。

SELECT cno
FROM course
WHERE NOT EXISTS(
SELECT *
FROM sc
WHERE sc.sno=(
SELECT sno
FROM student
WHERE sname='李逍遥'
)AND sc.cno=course.cno
);

(13) 查询选修了3号课程的学生平均年龄。

SELECT AVG(sage)
FROM student,sc
WHERE student.sno=sc.sno AND sc.cno='3';

(14) 求每门课程学生的平均成绩。

SELECT sc.cno,avg(sc.grade)
FROM sc
GROUP BY sc.cno;

(15) 统计每门课程的学生选修人数(超过3人的才统计)。要求输出课程号和选修人数,结果按人数降序排列,若人数相同,按课程号升序排列。

SELECT course.cno,COUNT(sc.sno)
FROM course,sc
WHERE course.cno=sc.cno
GROUP BY course.cno
HAVING COUNT(sc.sno)>3
ORDER BY COUNT(sc.cno)DESC,course.cno ASC;

(16) 查询学号比刘晨大,而年龄比他小的学生姓名。

SELECT student.sname
FROM student
WHERE student.sno > (
SELECT student.sno
FROM student
WHERE student.sname='刘晨'
) AND student.sage < (
SELECT student.sage
FROM student
WHERE student.sname='刘晨'
);

(17) 求年龄大于所有女同学年龄的男同学姓名和年龄

SELECT student.sname,student.sage
FROM student
WHERE student.sage > all(
SELECT student.sage
FROM student
WHERE student.ssex='女'
)AND ssex='男';

四、实验总结

基本掌握了复杂数据查询操作,在实验中遇到了一些问题,
如:实现的方式不对,没有出现正确结果;
还有个别数据,一开始并没有完善,因此后期进行了修改。
这些问题,随着探索、思考,以及交流,最后都成功得到了解决。并成功掌握了复杂数据查询操作。

2022.6.14记录:Code_流苏(CSDN)
如有任何疑问,评论回复,看到即回,欢迎大家多多交流学习!
★以上实验内容仅供参考。

猜你喜欢

转载自blog.csdn.net/qq_51646682/article/details/125270340