有学生成绩数据库 •学生(学号,姓名,年龄,性别,专业,平均学分积点) •课程(课程号,课名,学分) •成绩(学号,课程号,成绩,积点) 编写一个存储过程,完成统计学生的平均年龄。
时间: 2023-11-16 10:27:33 浏览: 29
好的,下面是一个统计学生平均年龄的Oracle存储过程:
```sql
CREATE OR REPLACE PROCEDURE CALCULATE_AVG_AGE(avg_age OUT NUMBER)
IS
total_age NUMBER := 0;
num_students NUMBER := 0;
avg_age_temp NUMBER := 0;
BEGIN
-- 遍历所有学生,计算总年龄和学生数量
FOR student IN (SELECT * FROM students) LOOP
total_age := total_age + student.age;
num_students := num_students + 1;
END LOOP;
-- 计算平均年龄
avg_age_temp := total_age / num_students;
-- 将平均年龄存入输出参数
avg_age := ROUND(avg_age_temp, 2);
END;
/
```
在这个存储过程中,我们首先使用 FOR 循环遍历所有学生,计算出总年龄和学生数量。然后,我们使用这些数据计算出平均年龄,并将其存入输出参数中。注意,在这个存储过程中,我们使用了 ROUND 函数将平均年龄保留两位小数。
相关问题
学生(学号,年龄,性别,系名) 课程(课号,课名,学分,学时) 选课(学号,课号,成绩) 根据上面基本表的信息完成下列查询。 1 查询选修了数据库原理的学生的人数和平均成绩。 2 查询选修3门课 以上的学生姓名。 3列出人数超过1000人的系名。 4 查询所有课程都及格的学生姓名。用sql语句完成查询curpos-1232-396-438
1. 查询选修了数据库原理的学生的人数和平均成绩。
```
SELECT COUNT(DISTINCT 选课.学号) AS 选修人数, AVG(选课.成绩) AS 平均成绩
FROM 选课
JOIN 学生 ON 学生.学号 = 选课.学号
JOIN 课程 ON 课程.课号 = 选课.课号
WHERE 课程.课名 = '数据库原理';
```
2. 查询选修3门课以上的学生姓名。
```
SELECT 学生.姓名
FROM 学生
JOIN (
SELECT 学号, COUNT(*) AS 选修课程数
FROM 选课
GROUP BY 学号
HAVING COUNT(*) >= 3
) AS 选修课程数表 ON 选修课程数表.学号 = 学生.学号;
```
3. 列出人数超过1000人的系名。
```
SELECT 系名
FROM 学生
GROUP BY 系名
HAVING COUNT(DISTINCT 学号) > 1000;
```
4. 查询所有课程都及格的学生姓名。
```
SELECT 学生.姓名
FROM 学生
WHERE NOT EXISTS (
SELECT *
FROM 课程
WHERE NOT EXISTS (
SELECT *
FROM 选课
WHERE 选课.学号 = 学生.学号 AND 选课.课号 = 课程.课号 AND 选课.成绩 >= 60
)
);
```
在oracle数据库中有三个表: S(Sno,Sname,Sgender,Sage,Sdept) 学生(学号,姓名,性别,年龄,系) SC(Sno,Cno,Grade) 选课(学号,课程号,成绩) C(Cno,Cname,Cpno,Ccredit) 课程(课程号,课程名,先行课,学分) 如何找出课程平均分第二的学生的SC表的信息;
可以使用以下 SQL 语句来找出课程平均分第二的学生的 SC 表的信息:
```
SELECT SC.Sno, AVG(SC.Grade) AS avg_grade
FROM SC
GROUP BY SC.Sno
HAVING AVG(SC.Grade) < (
SELECT MAX(avg_grade)
FROM (
SELECT AVG(SC.Grade) AS avg_grade
FROM SC
GROUP BY SC.Cno
ORDER BY AVG(SC.Grade) DESC
OFFSET 1 ROW FETCH NEXT 1 ROW ONLY
) t
)
ORDER BY AVG(SC.Grade) DESC
FETCH FIRST 1 ROW ONLY;
```
这里的思路是首先找出每个学生的平均分,然后找到平均分排名第二的课程平均分,再找到平均分小于该值的学生,按平均分降序排列,最后选取第一行即为所求。