参照学生-课程数据库,两人一组(队友出题,你给出SQL语句)完成下列任务: 创建并调用一个标量函数完成题目要求:创建一个函数,用于查询所有选修某门课程的学生的学号、课程号和成绩,并返回一个表格,然后调用该函数。
时间: 2024-02-24 15:58:23 浏览: 31
好的,以下是创建标量函数的 SQL 语句:
```sql
CREATE FUNCTION get_course_grades(course_id INT)
RETURNS TABLE (
student_id INT,
course_id INT,
grade FLOAT
)
AS $$
BEGIN
RETURN QUERY SELECT student_id, course_id, grade
FROM student_course
WHERE course_id = $1;
END;
$$ LANGUAGE plpgsql;
```
以上 SQL 语句创建了一个名为 `get_course_grades` 的标量函数,该函数接受一个参数 `course_id`,并返回一个包含所有选修该门课程的学生的学号、课程号和成绩的表格。
接下来,我们可以使用以下 SQL 语句调用该函数,其中参数 `101` 表示课程号为 101 的课程:
```sql
SELECT * FROM get_course_grades(101);
```
以上 SQL 语句将返回所有选修课程号为 101 的课程的学生的学号、课程号和成绩。
相关问题
参照学生-课程数据库,两人一组(队友出题,你给出SQL语句)完成下列任务: (1)利用系统内置函数完成 (2)创建并调用一个标量函数。 (3)创建并调用一个内嵌表值函数。 (4)创建并调用一个多语句表值函数。 (5)删除一个用户自定义函数。
好的,我会根据你的要求回答问题,以下是我给出的 SQL 语句:
1. 利用系统内置函数完成
任务:查询学生表中所有学生的姓名和出生日期,并将出生日期转换为年龄显示。
```sql
SELECT name, YEAR(NOW()) - YEAR(birthdate) AS age
FROM student;
```
2. 创建并调用一个标量函数。
任务:创建一个函数,用于计算两个数的平均值,然后调用该函数。
```sql
-- 创建函数
CREATE FUNCTION calc_avg(num1 INT, num2 INT)
RETURNS FLOAT
BEGIN
DECLARE avg_num FLOAT;
SET avg_num = (num1 + num2) / 2.0;
RETURN avg_num;
END;
-- 调用函数
SELECT calc_avg(10, 20);
```
3. 创建并调用一个内嵌表值函数。
任务:创建一个函数,用于查询所有选修某门课程的学生的姓名和成绩,并返回一个表格,然后调用该函数。
```sql
-- 创建函数
CREATE FUNCTION get_course_students(course_id INT)
RETURNS TABLE(name VARCHAR(20), score FLOAT)
BEGIN
RETURN (
SELECT student.name, score
FROM student
JOIN sc ON student.id = sc.student_id
WHERE sc.course_id = course_id
);
END;
-- 调用函数
SELECT * FROM get_course_students(1);
```
4. 创建并调用一个多语句表值函数。
任务:创建一个函数,用于查询某个学生的所有选课成绩,并返回一个表格,然后调用该函数。
```sql
-- 创建函数
CREATE FUNCTION get_student_scores(student_id INT)
RETURNS TABLE(course_name VARCHAR(20), score FLOAT)
BEGIN
DECLARE course_name_var VARCHAR(20);
DECLARE score_var FLOAT;
DECLARE done INT DEFAULT FALSE;
DECLARE cur CURSOR FOR SELECT course.name, sc.score FROM course JOIN sc ON course.id = sc.course_id WHERE sc.student_id = student_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
CREATE TEMPORARY TABLE IF NOT EXISTS temp_score_table (
course_name VARCHAR(20),
score FLOAT
);
OPEN cur;
read_loop: LOOP
FETCH cur INTO course_name_var, score_var;
IF done THEN
LEAVE read_loop;
END IF;
INSERT INTO temp_score_table VALUES(course_name_var, score_var);
END LOOP;
CLOSE cur;
RETURN SELECT * FROM temp_score_table;
END;
-- 调用函数
SELECT * FROM get_student_scores(1);
```
5. 删除一个用户自定义函数。
任务:删除之前创建的 calc_avg 函数。
```sql
DROP FUNCTION calc_avg;
```
学生、课程、成绩三个表完成上述题目的SQL语句示例: 创建并调用一个标量函数
好的,以下是示例SQL语句:
创建学生表:
```
CREATE TABLE student (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
gender VARCHAR(10),
address VARCHAR(100)
);
```
创建课程表:
```
CREATE TABLE course (
id INT PRIMARY KEY,
name VARCHAR(50),
teacher VARCHAR(50)
);
```
创建成绩表:
```
CREATE TABLE score (
id INT PRIMARY KEY,
student_id INT,
course_id INT,
score INT,
FOREIGN KEY (student_id) REFERENCES student(id),
FOREIGN KEY (course_id) REFERENCES course(id)
);
```
查询所有学生的平均分:
```
CREATE FUNCTION get_avg_score()
RETURNS FLOAT
BEGIN
DECLARE avg_score FLOAT;
SELECT AVG(score)
INTO avg_score
FROM score;
RETURN avg_score;
END;
SELECT get_avg_score();
```
以上是一个简单的标量函数示例,用于获取所有学生的平均分。在函数中,我们使用了SQL语句的AVG函数来计算平均分,并使用SELECT INTO语句将结果存储在变量avg_score中,最后使用RETURN语句返回结果。在调用函数时,使用SELECT语句调用即可。