sql语句查询成绩高于课程平均分的学生所选的所有课程的姓名,课程名,成绩
时间: 2024-09-28 22:06:43 浏览: 81
在SQL中,你可以使用子查询来获取每个学生的课程平均分,然后在外部查询中筛选出成绩高于这个平均分的学生及其课程信息。假设我们有两个表,一个是`students`(包含学生ID,姓名),另一个是`courses`(包含课程ID,课程名,学生成绩),可以尝试这样的结构:
```sql
SELECT s.name AS 学生姓名, c.course_name AS 课程名称, sc.score AS 成绩
FROM students s
JOIN scores sc ON s.student_id = sc.student_id
JOIN (
SELECT course_id, AVG(score) as avg_score
FROM courses
GROUP BY course_id
) cs ON sc.course_id = cs.course_id
WHERE sc.score > cs.avg_score;
```
这个查询首先通过`scores`表中的`student_id`将学生和他们的成绩关联起来,然后内嵌查询计算每个课程的平均成绩。最后的外层查询筛选出成绩高于平均分的学生及其课程信息。
相关问题
sql语句测试窗口写使用游标实现:将某一门(每门)课程成绩高于课程平均分的学生所选的所有课程的姓名,课程名,成绩格式化输出。
在SQL中,直接操作游标不是常见的做法,因为大多数数据库系统倾向于提供更高效、更直接的方式来处理查询结果。然而,如果你确实需要通过游标来实现这样的功能,并假设我们有一个名为`courses`的表,其中包含学生ID、课程名称(course_name)、成绩(score)和课程关联到的学生姓名(student_name),你可以按照以下步骤:
1. **计算每门课程的平均分**:
```sql
CREATE OR REPLACE FUNCTION get_course_avg(course_id INT) RETURN NUMBER AS
BEGIN
RETURN (SELECT AVG(score) FROM courses WHERE course_id = :course_id);
END;
```
2. **创建游标并获取满足条件的学生信息**:
```sql
DECLARE
cursor_students CURSOR FOR
SELECT student_name, course_name, score
FROM courses c
JOIN (
SELECT course_id, student_name
FROM courses
GROUP BY course_id, student_name
HAVING score > get_course_avg(c.course_id)
) high_scores ON c.course_id = high_scores.course_id;
BEGIN
OPEN cursor_students;
LOOP
FETCH cursor_students INTO student_name, course_name, score;
EXIT WHEN cursor_students%NOTFOUND;
-- 格式化输出
DBMS_OUTPUT.PUT_LINE(student_name || ' - ' || course_name || ': ' || score);
END LOOP;
CLOSE cursor_students;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;
/
```
在这个示例中,我们首先创建了一个函数来计算课程平均分,然后声明一个游标来找出高分学生及其课程。在循环里,我们逐行读取游标数据并输出。
请注意,这个例子假定你正在使用Oracle数据库,因为它的PL/SQL环境支持游标。其他数据库系统的语法可能会有所不同。
4.嵌套查询 利用T-SQL语句在JXGL数据库中实现其嵌套查询操作: (1)查询选修了“离散数学”的学生的学号和姓名。 (2)查询课程号为C2的课程的成绩高于张林的学生的学号和成绩。 (3)查询其他系中年龄小于计算机科学系(CS)中年龄最大者的学生。 (4)查询其他系中比计算机科学系(CS)的学生年龄都小的学生。 (5)查询和“王洪敏”的“数据库原理及应用”课程分数相同的学生的学号。 (6)查询没有选修C2课程的学生的姓名。 5.组合查询和统计查询 利用T-SQL语句在JXGL数据库中实现其数据组合查询和统计查询操作: (1)查找选修“计算机基础”课程的学生成绩比此课程的平均成绩高的学生的学号和成绩。 (2)查询选修“计算机基础”课程的学生的平均成绩。 (3)查询年龄大于女同学平均年龄的男同学的姓名和年龄。 (4)列出各系学生的总人数,并按人数进行降序排列。 (5)统计各系各门课程的平均成绩。 (6)查询选修“计算机基础”和“离散数学”的学生的学号和平均成绩。
先前提醒一下,由于我并不知道你的数据库表结构和数据,以下的语句只是一个参考,需要根据实际情况进行修改和调整。
4. 嵌套查询:
(1) 查询选修了“离散数学”的学生的学号和姓名。
```sql
SELECT 学号, 姓名
FROM 学生
WHERE 学号 IN (SELECT 学号 FROM 成绩 WHERE 课程号 = 'C1');
```
(2) 查询课程号为C2的课程的成绩高于张林的学生的学号和成绩。
```sql
SELECT 学号, 成绩
FROM 成绩
WHERE 课程号 = 'C2' AND 成绩 > (SELECT 成绩 FROM 成绩 WHERE 学号 = '张林' AND 课程号 = 'C2');
```
(3) 查询其他系中年龄小于计算机科学系(CS)中年龄最大者的学生。
```sql
SELECT 学号, 姓名, 年龄, 所在系
FROM 学生
WHERE 年龄 < (SELECT MAX(年龄) FROM 学生 WHERE 所在系 = 'CS') AND 所在系 <> 'CS';
```
(4) 查询其他系中比计算机科学系(CS)的学生年龄都小的学生。
```sql
SELECT 学号, 姓名, 年龄, 所在系
FROM 学生
WHERE 年龄 < (SELECT MIN(年龄) FROM 学生 WHERE 所在系 = 'CS') AND 所在系 <> 'CS';
```
(5) 查询和“王洪敏”的“数据库原理及应用”课程分数相同的学生的学号。
```sql
SELECT 学号
FROM 成绩
WHERE 成绩 = (SELECT 成绩 FROM 成绩 WHERE 学号 = '王洪敏' AND 课程号 = 'C3') AND 课程号 = 'C3' AND 学号 <> '王洪敏';
```
(6) 查询没有选修C2课程的学生的姓名。
```sql
SELECT 姓名
FROM 学生
WHERE 学号 NOT IN (SELECT 学号 FROM 成绩 WHERE 课程号 = 'C2');
```
5. 组合查询和统计查询:
(1) 查找选修“计算机基础”课程的学生成绩比此课程的平均成绩高的学生的学号和成绩。
```sql
SELECT 学号, 成绩
FROM 成绩
WHERE 课程号 = 'C1' AND 成绩 > (SELECT AVG(成绩) FROM 成绩 WHERE 课程号 = 'C1');
```
(2) 查询选修“计算机基础”课程的学生的平均成绩。
```sql
SELECT AVG(成绩)
FROM 成绩
WHERE 课程号 = 'C1';
```
(3) 查询年龄大于女同学平均年龄的男同学的姓名和年龄。
```sql
SELECT 姓名, 年龄
FROM 学生
WHERE 性别 = '男' AND 年龄 > (SELECT AVG(年龄) FROM 学生 WHERE 性别 = '女');
```
(4) 列出各系学生的总人数,并按人数进行降序排列。
```sql
SELECT 所在系, COUNT(*) AS 总人数
FROM 学生
GROUP BY 所在系
ORDER BY 总人数 DESC;
```
(5) 统计各系各门课程的平均成绩。
```sql
SELECT 所在系, 课程号, AVG(成绩) AS 平均成绩
FROM 成绩
JOIN 学生 ON 成绩.学号 = 学生.学号
GROUP BY 所在系, 课程号;
```
(6) 查询选修“计算机基础”和“离散数学”的学生的学号和平均成绩。
```sql
SELECT 学号, AVG(成绩) AS 平均成绩
FROM 成绩
WHERE 课程号 IN ('C1', 'C2')
GROUP BY 学号
HAVING COUNT(*) = 2;
```
阅读全文