(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)删除一个用户自定义函数。
时间: 2024-03-06 20:50:58 浏览: 304
SQL命令课上习题答案
(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;
```
阅读全文