参照学生-课程数据库,两人一组(队友出题,你给出SQL语句)完成下列任务: (1)利用系统内置函数完成 (2)创建并调用一个标量函数。 (3)创建并调用一个内嵌表值函数。 (4)创建并调用一个多语句表值函数。 (5)删除一个用户自定义函数。
时间: 2024-02-24 22:56:51 浏览: 58
好的,我会根据你的要求回答问题,以下是我给出的 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;
```
阅读全文