SELECT DISTINCT student.sno, student.sname
FROM student
JOIN sc ON student.sno = sc.sno
WHERE sc.grade > 90;
2.查询所有学生的学号、姓名,所选课程的课程号、课程名和成绩信息
SELECT student.sno, student.sname, course.cno, course.cname, sc.grade
FROM student
JOIN sc ON student.sno = sc.sno
JOIN course ON sc.cno = course.cno;
3.查询每一门课的间接先修课(先修课的先修课),显示信息包括课程号、间接先修课课程号。
SELECT c1.cno AS 课程号, c3.cno AS 间接先修课课程号
FROM course c1
JOIN course c2 ON c1.cpno = c2.cno
JOIN course c3 ON c2.cpno = c3.cno;
通过多次连接同一张课程表,寻找课程的间接先修课程
FROM course c1:从课程表 course 中选取数据,并将其赋予别名c1
4.查询"Y71814001"号同学选修,但"Y71814003"号同学未选的课程的课程号及课程名
SELECT course.cno, course.cname
FROM course
JOIN sc AS sc1 ON course.cno = sc1.cno
LEFT JOIN sc AS sc2 ON course.cno = sc2.cno AND sc2.sno = 'Y71814003'
WHERE sc1.sno = 'Y71814001' AND sc2.sno IS NULL;
sc1 表示学生 'Y71814001' 选修的课程
LEFT JOIN 没有匹配的记录时会返回 NULL,可以确保只选择 'Y71814001' 选了但 'Y71814003' 没选的课程。
5.查询程熙的成绩
SELECT course.cno, course.cname, sc.grade
FROM student
JOIN sc ON student.sno = sc.sno
JOIN course ON sc.cno = course.cno
WHERE student.sname = '程熙';
6.查询没有参加任何一门考试的学生姓名
SELECT sname
FROM student
WHERE sno NOT IN (
SELECT sno
FROM sc
);
找出选修'02'号课程并且分数大于该课程平均分的学生信息(包括学号、成绩)。
SELECT sc.sno, sc.grade
FROM sc
WHERE sc.cno = '02'
AND sc.grade > (
SELECT AVG(grade)
FROM sc
WHERE cno = '02'
);
计算选修了'02'号课程的每个学生的学号和平均成绩。
SELECT sno, AVG(grade) AS 平均成绩
FROM sc
WHERE sno IN (
SELECT sno
FROM sc
WHERE cno = '02'
)
GROUP BY sno;
错误写法:先筛选后分组,得到的是每个学生的2号课程成绩,不是平均成绩
SELECT sno, AVG(grade) AS 平均成绩
FROM sc
WHERE cno = '02'
GROUP BY sno;
SELECT student.sname, A.num AS "80分以上的门数"
FROM student
JOIN (
SELECT sno, COUNT(*) AS num
FROM sc
WHERE sc.grade > 80
GROUP BY sc.sno
) AS A
ON student.sno = A.sno;
SELECT student.sno, student.sname, COUNT(*)
FROM student,sc
where student.sno = sc.sno and grade> 80
group by student.snastudent.sname
完整代码:
--二
-- 1. 查询成绩大于90分的学生的学号和姓名(使用连接和子查询两种方法)
-- 使用连接
--SELECT student.sno, student.sname
SELECT DISTINCT student.sno, student.sname
FROM student
JOIN sc ON student.sno = sc.sno
WHERE sc.grade > 90;
-- 使用子查询
SELECT sno, sname
FROM student
WHERE sno IN (
SELECT sno
FROM sc
WHERE grade > 90
);
-- 2. 查询所有学生的学号、姓名,所选课程的课程号、课程名和成绩信息
SELECT student.sno, student.sname, course.cno, course.cname, sc.grade
FROM student
JOIN sc ON student.sno = sc.sno
JOIN course ON sc.cno = course.cno;
-- 3. 查询每一门课的间接先修课(先修课的先修课),显示信息包括课程号、间接先修课课程号
SELECT c1.cno AS 课程号, c3.cno AS 间接先修课课程号
FROM course c1
JOIN course c2 ON c1.cpno = c2.cno
JOIN course c3 ON c2.cpno = c3.cno;
-- 4. 查询"Y71814001"号同学选修,但"Y71814003"号同学未选的课程的课程号及课程名
SELECT course.cno, course.cname
FROM course
JOIN sc AS sc1 ON course.cno = sc1.cno
LEFT JOIN sc AS sc2 ON course.cno = sc2.cno AND sc2.sno = 'Y71814003'
WHERE sc1.sno = 'Y71814001' AND sc2.sno IS NULL;
-- 5. 查询程熙的成绩
SELECT course.cno, course.cname, sc.grade
FROM student
JOIN sc ON student.sno = sc.sno
JOIN course ON sc.cno = course.cno
WHERE student.sname = '程熙';
-- 6. 查询没有参加任何一门考试的学生姓名
SELECT sname
FROM student
WHERE sno NOT IN (
SELECT sno
FROM sc
);
-- 7. 找出选修'02'号课程并且分数大于该课程平均分的学生信息(包括学号、成绩)
SELECT sc.sno, sc.grade
FROM sc
WHERE sc.cno = '02'
AND sc.grade > (
SELECT AVG(grade)
FROM sc
WHERE cno = '02'
);
-- 8. 计算选修了'02'号课程的每个学生的学号和平均成绩
SELECT sno, AVG(grade) AS 平均成绩
FROM sc
WHERE sno IN (
SELECT sno
FROM sc
WHERE cno = '02'
)
GROUP BY sno;
-- 9. 查询程熙高于其所有选修课程平均分的那些课程的课程名和成绩
SELECT course.cname, sc.grade
FROM student
JOIN sc ON student.sno = sc.sno
JOIN course ON sc.cno = course.cno
WHERE student.sname = '程熙'
AND sc.grade > (
SELECT AVG(grade)
FROM sc
WHERE sno = student.sno
);
-- 10. 查询每个学生的成绩在80分以上的各有多少门,显示姓名和门数
SELECT student.sname, COUNT(*) AS 成绩在80分以上门数
FROM student
JOIN sc ON student.sno = sc.sno
WHERE sc.grade > 80
GROUP BY student.sname;