创建存储过程p_tj,能查询课程名称、周课时数、报名人数
时间: 2023-11-19 12:05:57 浏览: 46
假设我们有三个表:`course` 存储课程信息,包括课程ID(cid)和课程名称(cname);`schedule` 存储每门课程的周课时数(week_hour)和课程ID(cid);`enrollment` 存储每门课程的报名人数(enrollment_num)和课程ID(cid)。
存储过程 `p_tj` 的实现如下:
```mysql
DELIMITER //
CREATE PROCEDURE p_tj()
BEGIN
SELECT c.cname, s.week_hour, e.enrollment_num
FROM course c
JOIN schedule s ON c.cid = s.cid
JOIN enrollment e ON c.cid = e.cid;
END //
DELIMITER ;
```
该存储过程使用了三个表的联结查询,将课程名称、周课时数和报名人数一起查询出来。可以通过调用 `CALL p_tj()` 来执行该存储过程。
相关问题
创建一个统计存储过程,过程名称为P_TJ。参数是学号,输出信息是指定学号的姓名、选课门数、平均分、总分、最高分、最低分。运行时若没有指定学号,则提示输入学号;若学号不存在则提示学号不存在;
以下是一个可能的解决方案,使用MySQL语言编写:
```mysql
DELIMITER $$
CREATE PROCEDURE P_TJ(IN stu_id VARCHAR(20))
BEGIN
DECLARE stu_name VARCHAR(20);
DECLARE course_count INT;
DECLARE total_score FLOAT;
DECLARE avg_score FLOAT;
DECLARE max_score FLOAT;
DECLARE min_score FLOAT;
SELECT name INTO stu_name FROM student WHERE id = stu_id;
IF stu_name IS NULL THEN
SELECT '学号不存在' AS result;
LEAVE P_TJ;
END IF;
SELECT COUNT(*) INTO course_count FROM score WHERE student_id = stu_id;
SELECT SUM(score) INTO total_score FROM score WHERE student_id = stu_id;
SELECT MAX(score) INTO max_score FROM score WHERE student_id = stu_id;
SELECT MIN(score) INTO min_score FROM score WHERE student_id = stu_id;
SET avg_score = total_score / course_count;
SELECT stu_name, course_count, avg_score, total_score, max_score, min_score;
END $$
DELIMITER ;
```
这个存储过程接受一个学号作为输入参数,然后计算指定学号的姓名、选课门数、平均分、总分、最高分、最低分,并且输出这些信息。
如果输入的学号在数据库中不存在,则会输出一条错误提示。否则,将会返回统计信息。
可以使用以下代码来调用这个存储过程:
```mysql
CALL P_TJ('123456');
```
其中,'123456'应该替换成你要查询的学号。如果没有指定学号,那么可以使用以下代码来提示输入:
```mysql
SET @stu_id = NULL;
SELECT '请输入学号:';
SET @stu_id = '123456';
CALL P_TJ(@stu_id);
```
其中,@stu_id是一个MySQL变量,用于存储输入的学号。在上述代码中,我们首先将@stu_id设置为NULL,然后输出一个提示信息。接着,我们将输入的学号赋值给@stu_id,并且调用P_TJ存储过程进行统计。
1)创建一个查询存储过程,过程名称为P_CHX。参数是学号,输出信息是指定学号所对应的姓名、课程名称、成绩。运行时若没有指定学号,则提示请输入学号,若学号不存在则提示学号不存在; 2)创建一个统计存储过程,过程名称为P_TJ。参数是学号,输出信息是指定学号的姓名、选课门数、平均分、总分、最高分、最低分。运行时若没有指定学号,则提示输入学号;若学号不存在则提示学号不存在; 3)查询平均分数在x到y范围内的学生信息(学号、姓名、院系名称和平均分数)。提示:该存储过程有两个参数。 4)自行再分别设计一个完成查询和完成操作功能的存储过程(在实验报告中要准确描述功能需求)。
1)P_CHX存储过程代码:
```
CREATE PROCEDURE P_CHX
@stu_id INT
AS
BEGIN
IF @stu_id IS NULL
BEGIN
PRINT '请输入学号'
RETURN
END
DECLARE @name VARCHAR(20)
DECLARE @course_name VARCHAR(20)
DECLARE @score FLOAT
SELECT @name = name, @course_name = course_name, @score = score
FROM scores
WHERE stu_id = @stu_id
IF @@ROWCOUNT = 0
BEGIN
PRINT '学号不存在'
RETURN
END
PRINT '姓名:' + @name + ',课程名称:' + @course_name + ',成绩:' + CAST(@score AS VARCHAR(10))
END
```
2)P_TJ存储过程代码:
```
CREATE PROCEDURE P_TJ
@stu_id INT
AS
BEGIN
IF @stu_id IS NULL
BEGIN
PRINT '请输入学号'
RETURN
END
DECLARE @name VARCHAR(20)
DECLARE @num_courses INT
DECLARE @avg_score FLOAT
DECLARE @total_score FLOAT
DECLARE @max_score FLOAT
DECLARE @min_score FLOAT
SELECT @name = name,
@num_courses = COUNT(course_name),
@avg_score = AVG(score),
@total_score = SUM(score),
@max_score = MAX(score),
@min_score = MIN(score)
FROM scores
WHERE stu_id = @stu_id
GROUP BY name
IF @@ROWCOUNT = 0
BEGIN
PRINT '学号不存在'
RETURN
END
PRINT '姓名:' + @name + ',选课门数:' + CAST(@num_courses AS VARCHAR(10)) + ',平均分:' + CAST(@avg_score AS VARCHAR(10)) + ',总分:' + CAST(@total_score AS VARCHAR(10)) + ',最高分:' + CAST(@max_score AS VARCHAR(10)) + ',最低分:' + CAST(@min_score AS VARCHAR(10))
END
```
3)查询平均分数在x到y范围内的学生信息存储过程代码:
```
CREATE PROCEDURE P_AVG_SCORE_RANGE
@start_score FLOAT,
@end_score FLOAT
AS
BEGIN
SELECT stu_id, name, department_name, AVG(score) AS avg_score
FROM students
JOIN scores ON students.id = scores.stu_id
JOIN courses ON scores.course_id = courses.id
GROUP BY stu_id, name, department_name
HAVING AVG(score) >= @start_score AND AVG(score) <= @end_score
END
```
4)完成查询和完成操作功能的存储过程:
查询功能:
```
CREATE PROCEDURE P_QUERY
@table_name VARCHAR(20)
AS
BEGIN
DECLARE @sql VARCHAR(MAX)
SET @sql = 'SELECT * FROM ' + @table_name
EXECUTE (@sql)
END
```
操作功能:
```
CREATE PROCEDURE P_OPERATION
@table_name VARCHAR(20),
@column_name VARCHAR(20),
@old_value VARCHAR(20),
@new_value VARCHAR(20)
AS
BEGIN
DECLARE @sql VARCHAR(MAX)
SET @sql = 'UPDATE ' + @table_name + ' SET ' + @column_name + ' = ''' + @new_value + ''' WHERE ' + @column_name + ' = ''' + @old_value + ''''
EXECUTE (@sql)
END
```
以上存储过程仅供参考,具体实现需要根据实际情况进行修改。