2. 创建一个用户自定义函数(内嵌表值函数),功能为产生某个系的学生选修信息,内容为学号,姓名,课程名,成绩。调用这个函数,显示信息系有选课学生的信息。
时间: 2024-03-15 08:47:35 浏览: 101
好的,我可以帮你创建这个用户自定义函数。这里给出一个示例代码,你可以根据自己的需求进行修改和调整:
```sql
CREATE FUNCTION GetStudentCourseInfo(@deptName VARCHAR(50))
RETURNS TABLE
AS
RETURN
(
SELECT s.StudentID, s.StudentName, c.CourseName, sc.Score
FROM Students s
INNER JOIN StudentCourse sc ON s.StudentID = sc.StudentID
INNER JOIN Courses c ON sc.CourseID = c.CourseID
INNER JOIN Departments d ON s.DeptID = d.DeptID
WHERE d.DeptName = @deptName
)
```
以上代码创建了一个名为 `GetStudentCourseInfo` 的用户自定义函数,该函数接受一个字符串参数 `deptName`,表示要查询的系的名称。函数返回一个表格,包含学生的学号、姓名、所选课程名和成绩信息。
要调用这个函数并显示信息系有选课学生的信息,你可以使用以下 SQL 查询语句:
```sql
SELECT *
FROM GetStudentCourseInfo('信息系')
```
这里的 `'信息系'` 是你想要查询的系的名称,你可以根据实际情况进行修改。
相关问题
Mysql中表student有元素Sno,Sname,Ssex,Sage,Sdept。表course有元素Cno,Cname,Cpno,Ccredit。表sc有元素Sno,Cno,Grade。2.创建一个用户自定义函数(内嵌表值函数),功能为产生某个系的学生选修信息,内容为学号,姓名,课程名,成绩。调用这个函数,显示信息系有选课学生的信息。
首先,我们需要创建一个用户自定义函数。以下是创建函数的 SQL 语句:
```
DELIMITER $$
CREATE FUNCTION get_course_info(dept VARCHAR(20))
RETURNS TABLE (
sno CHAR(10),
sname VARCHAR(20),
cname VARCHAR(20),
grade INT
)
BEGIN
DECLARE result_table TABLE (
sno CHAR(10),
sname VARCHAR(20),
cname VARCHAR(20),
grade INT
);
INSERT INTO result_table
SELECT student.Sno, student.Sname, course.Cname, sc.Grade
FROM student, course, sc
WHERE student.Sno = sc.Sno
AND course.Cno = sc.Cno
AND student.Sdept = dept;
RETURN SELECT * FROM result_table;
END $$
DELIMITER ;
```
上面的函数接受一个系名参数 `dept`,并返回一个结果集,包含学号、姓名、课程名和成绩。
接下来,我们可以调用这个函数来获取某个系的学生选修信息。以下是调用函数的 SQL 语句:
```
SELECT *
FROM get_course_info('计算机科学与技术系');
```
将 `get_course_info` 函数的参数设置为需要查询的系名即可。这条 SQL 语句将返回指定系的学生选修信息。
(1) “学生”表Student由学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、所在系(Sdept)五个属性组成,可记为: Student(Sno,Sname,Ssex,Sage,Sdept) Sno 为主关键字。 (2) “课程”表Course由课程号(Cno)、课程名(Cname)、先修课号(Cpno)、学分(Ccredit)四个属性组成,可记为: Course(Cno,Cname,Cpno,Ccredit) Cno为关键字。 (3) “学生选课”表SC由学号(Sno)、课程号(Cno)、成绩(Grade)三个属性组成,可记为: SC(Sno,Cno,Grade) (SNO, CNO) 为关键字。 参照学生-课程数据库,两人一组(队友出题,你给出SQL语句)完成下列任务: (1)利用系统内置函数完成(例:查询平均成绩大于等于80分的课程名称和平均成绩。)。 (2)创建并调用一个标量函数(例:求N!。)。 (3)创建并调用一个内嵌表值函数。(创建一个函数,用于查询所有选修某门课程的学生的学号、课程号和成绩,并返回一个表格,然后调用该函数。)(4)创建并调用一个多语句表值函数。 (5)删除一个用户自定义函数。
(1) 查询平均成绩大于等于80分的课程名称和平均成绩。
```sql
SELECT Cname, AVG(Grade)
FROM SC, Course
WHERE SC.Cno = Course.Cno
GROUP BY SC.Cno, Cname
HAVING AVG(Grade) >= 80;
```
(2) 创建并调用一个标量函数(求N!)。
```sql
-- 创建函数
CREATE FUNCTION factorial(@n INT)
RETURNS INT
AS
BEGIN
DECLARE @result INT = 1;
WHILE @n > 0
BEGIN
SET @result = @result * @n;
SET @n = @n - 1;
END
RETURN @result;
END
-- 调用函数
SELECT dbo.factorial(5); -- 输出 120
```
(3) 创建并调用一个内嵌表值函数。(查询所有选修某门课程的学生的学号、课程号和成绩,并返回一个表格)
```sql
-- 创建函数
CREATE FUNCTION fn_GetCourseStudents (@Cno CHAR(4))
RETURNS TABLE
AS
RETURN
SELECT Sno, Cno, Grade
FROM SC
WHERE Cno = @Cno;
-- 调用函数
SELECT * FROM dbo.fn_GetCourseStudents('C001');
```
(4) 创建并调用一个多语句表值函数。
```sql
-- 创建函数
CREATE FUNCTION fn_GetCourseAvgGrade (@Cno CHAR(4))
RETURNS @AvgGradeTable TABLE
(Cno CHAR(4), Cname VARCHAR(20), AvgGrade DECIMAL(5,2))
AS
BEGIN
DECLARE @Cname VARCHAR(20);
DECLARE @AvgGrade DECIMAL(5,2);
SELECT @Cname = Cname, @AvgGrade = AVG(Grade)
FROM SC, Course
WHERE SC.Cno = Course.Cno AND SC.Cno = @Cno
GROUP BY SC.Cno, Cname;
INSERT INTO @AvgGradeTable (Cno, Cname, AvgGrade)
VALUES (@Cno, @Cname, @AvgGrade);
RETURN;
END
-- 调用函数
SELECT * FROM dbo.fn_GetCourseAvgGrade('C001');
```
(5) 删除一个用户自定义函数。
```sql
DROP FUNCTION dbo.fn_GetCourseStudents;
```
阅读全文