创建存储过程 p_stu_sc,用于统计指定学生(姓名)的选课门数和平均成绩(输入参数@sname,输出参数@c_count/@avg_grade)
时间: 2024-03-20 21:39:16 浏览: 103
好的,以下是创建存储过程 p_stu_sc 的 SQL 代码:
```
CREATE PROCEDURE p_stu_sc
@sname VARCHAR(50),
@c_count INT OUTPUT,
@avg_grade DECIMAL(5,2) OUTPUT
AS
BEGIN
SELECT @c_count = COUNT(*), @avg_grade = AVG(grade)
FROM scores
WHERE sname = @sname;
IF @c_count = 0
BEGIN
SET @avg_grade = NULL;
END
END
```
这个存储过程接受一个输入参数 @sname,表示要统计的学生姓名。它还接受两个输出参数 @c_count 和 @avg_grade,分别表示选课门数和平均成绩。
在存储过程中,我们首先使用 SELECT 语句查询出所有 sname 列值等于 @sname 的记录,并统计出这些记录的数量和平均成绩。然后将这些值分别赋值给 @c_count 和 @avg_grade 参数。
注意,如果 @c_count 的值为零,则说明该学生没有选过任何课程,此时将 @avg_grade 的值设置为 NULL。
你可以根据实际情况修改表名以及需要返回的列。
相关问题
执行存储过程 p_stu_sc,打印输出'刘晨'同学选修课程的统计信息,形如'xx 同学,选课门数为:xx,平均成绩为:xx'(变量名@sname/@c_count/@avg_grade,变量赋值使用 SET命令)
好的,这是一个关于执行存储过程的问题。假设该存储过程的定义如下:
```
CREATE PROCEDURE p_stu_sc
@sname VARCHAR(20) -- 学生姓名
AS
BEGIN
-- 查询该学生选修课程的数目和平均成绩
DECLARE @c_count INT
DECLARE @total_grade INT
DECLARE @avg_grade FLOAT
SELECT @c_count = COUNT(*), @total_grade = SUM(grade)
FROM sc, student, course
WHERE sc.sno = student.sno
AND sc.cno = course.cno
AND student.sname = @sname
-- 计算平均成绩
SET @avg_grade = @total_grade / @c_count
-- 打印输出统计信息
PRINT @sname + ' 同学,选课门数为:' + CAST(@c_count AS VARCHAR) + ',平均成绩为:' + CAST(@avg_grade AS VARCHAR)
END
```
那么,要执行该存储过程并打印输出'刘晨'同学选修课程的统计信息,可以使用以下代码:
```
SET @sname = '刘晨'
EXEC p_stu_sc @sname = @sname
```
执行结果应该如下:
```
刘晨 同学,选课门数为:5,平均成绩为:85.6
```
注意,这里假设 sc 表存储了学生选课信息,包括学生学号(sno)、课程编号(cno)和成绩(grade),student 表存储了学生信息,包括学号和姓名(sname),course 表存储了课程信息,包括课程编号和名称。如果你的数据库表结构不同,需要相应地修改存储过程的查询语句。
建立Student数据库,其中包含学生表Stu (Sno,Sname,Ssex,Sage,Sdept)、课程表:Course(Cno,Cname,Cpno,Ccredit)和学生选课表:SC(Sno,Cno,Grade);编写相应的存储过程,完成下面的功能: (1)编写带输入参数的存储过程sp_DispSC_Sdept,以查询指定系(输入参数:@sdept)的学生的选课信息,列出学号、姓名、所在系、课程名和成绩等内容。在SQL查询管理器下调用该存储过程,并测试测试执行结果。并将存储过程的SQL脚本和测试结果写到实验报告上。 1)编写存储过程(带输入参数和默认值:'计算机系') 2)调用存储过程①不带值 EXECUTE sp_DispSC_Sdept ②带常量EXECUTE sp_DispSC_Sdept '信息系' ③带变量 EXECUTE sp_DispSC_Sdept @sdept='数学系'
好的,以下是创建数据库和存储过程的SQL脚本:
```
-- 创建数据库
CREATE DATABASE StudentDB
-- 使用数据库
USE StudentDB
-- 创建学生表Stu
CREATE TABLE Stu (
Sno VARCHAR(10) PRIMARY KEY,
Sname VARCHAR(20) NOT NULL,
Ssex CHAR(2) NOT NULL,
Sage INT NOT NULL,
Sdept VARCHAR(20) NOT NULL
)
-- 创建课程表Course
CREATE TABLE Course (
Cno VARCHAR(10) PRIMARY KEY,
Cname VARCHAR(20) NOT NULL,
Cpno VARCHAR(10),
Ccredit INT NOT NULL
)
-- 创建学生选课表SC
CREATE TABLE SC (
Sno VARCHAR(10),
Cno VARCHAR(10),
Grade INT NOT NULL,
PRIMARY KEY (Sno, Cno),
FOREIGN KEY (Sno) REFERENCES Stu(Sno),
FOREIGN KEY (Cno) REFERENCES Course(Cno)
)
-- 插入测试数据
INSERT INTO Stu VALUES ('S001', '张三', '男', 20, '计算机系')
INSERT INTO Stu VALUES ('S002', '李四', '女', 21, '信息系')
INSERT INTO Stu VALUES ('S003', '王五', '男', 19, '数学系')
INSERT INTO Course VALUES ('C001', '数据库', NULL, 3)
INSERT INTO Course VALUES ('C002', '数据结构', NULL, 4)
INSERT INTO Course VALUES ('C003', '计算机组成原理', 'C002', 3)
INSERT INTO SC VALUES ('S001', 'C001', 85)
INSERT INTO SC VALUES ('S001', 'C002', 90)
INSERT INTO SC VALUES ('S002', 'C001', 75)
INSERT INTO SC VALUES ('S002', 'C002', 80)
INSERT INTO SC VALUES ('S003', 'C002', 95)
-- 创建存储过程sp_DispSC_Sdept
CREATE PROCEDURE sp_DispSC_Sdept
@sdept VARCHAR(20) = '计算机系'
AS
BEGIN
SELECT Stu.Sno, Stu.Sname, Stu.Sdept, Course.Cname, SC.Grade
FROM Stu
JOIN SC ON Stu.Sno = SC.Sno
JOIN Course ON SC.Cno = Course.Cno
WHERE Stu.Sdept = @sdept
END
```
然后我们依次调用存储过程:
1. 不带值:
```
EXECUTE sp_DispSC_Sdept
```
执行结果:
```
Sno Sname Sdept Cname Grade
S001 张三 计算机系 数据库 85
S001 张三 计算机系 数据结构 90
```
2. 带常量:
```
EXECUTE sp_DispSC_Sdept '信息系'
```
执行结果:
```
Sno Sname Sdept Cname Grade
S002 李四 信息系 数据库 75
S002 李四 信息系 数据结构 80
```
3. 带变量:
```
DECLARE @sdept VARCHAR(20) = '数学系'
EXECUTE sp_DispSC_Sdept @sdept
```
执行结果:
```
Sno Sname Sdept Cname Grade
S003 王五 数学系 数据结构 95
```
阅读全文