写一个sql触发器,查询成绩大于等于60的学生
时间: 2024-01-24 19:04:09 浏览: 43
假设有一个名为`student`的表,包含以下列:`id`、 `name`、 `score`。下面是一个查询成绩大于等于60的学生的触发器:
```
CREATE TRIGGER check_score
AFTER INSERT ON student
FOR EACH ROW
BEGIN
SELECT * FROM student WHERE score >= 60;
END;
```
这个触发器会在每次往`student`表中插入一行新数据之后触发。它会查询`score`大于等于60的所有学生,并返回结果。
相关问题
单学号: (1) 在学生表中增加一个“avgGrade”字段记录学生的平均成绩,并更新avgGrade属性的值; (2) 创建一个触发器,当输入学生选课成绩时,更新其平均成绩;并使用SQL语句往tb_sc表插入学生选课成绩记录,给出触发器触发后的相应结果。 双学号: (1) 在学生表中增加一个“TCredit”字段记录学生选课的总学分,并更新TCredit属性的值; (2) 创建一个触发器,当输入学生选课成绩时,如果成绩大于等于60分则将该课程的学分计入总学分;并使用SQL语句往tb_sc表插入学生选课成绩记录,给出触发器触发后的相应结果。
单学号:
1) 在学生表中增加一个“avgGrade”字段记录学生的平均成绩,并更新avgGrade属性的值:
```sql
ALTER TABLE tb_student ADD COLUMN avgGrade FLOAT;
UPDATE tb_student SET avgGrade = (SELECT AVG(score) FROM tb_sc WHERE tb_sc.sid = tb_student.sid);
```
2) 创建一个触发器,当输入学生选课成绩时,更新其平均成绩:
```sql
CREATE TRIGGER tr_tb_sc AFTER INSERT ON tb_sc
FOR EACH ROW
BEGIN
UPDATE tb_student SET avgGrade = (SELECT AVG(score) FROM tb_sc WHERE tb_sc.sid = NEW.sid) WHERE sid = NEW.sid;
END;
```
3) 往tb_sc表插入学生选课成绩记录:
```sql
INSERT INTO tb_sc (sid, cid, score) VALUES (1001, 1, 90);
-- 触发器会更新学生1001的平均成绩
SELECT * FROM tb_student WHERE sid = 1001;
```
输出结果为:
| sid | sname | sex | age | nation | avgGrade |
| --- | ----- | --- | --- | ------ | -------- |
| 1001 | 张三 | 男 | 20 | 汉族 | 90 |
双学号:
1) 在学生表中增加一个“TCredit”字段记录学生选课的总学分,并更新TCredit属性的值:
```sql
ALTER TABLE tb_student ADD COLUMN TCredit INT;
UPDATE tb_student SET TCredit = (SELECT SUM(credit) FROM tb_course WHERE cid IN (SELECT cid FROM tb_sc WHERE tb_sc.sid = tb_student.sid AND score >= 60));
```
2) 创建一个触发器,当输入学生选课成绩时,如果成绩大于等于60分则将该课程的学分计入总学分:
```sql
CREATE TRIGGER tr_tb_sc AFTER INSERT ON tb_sc
FOR EACH ROW
BEGIN
IF NEW.score >= 60 THEN
UPDATE tb_student SET TCredit = TCredit + (SELECT credit FROM tb_course WHERE cid = NEW.cid) WHERE sid = NEW.sid;
END IF;
END;
```
3) 往tb_sc表插入学生选课成绩记录:
```sql
INSERT INTO tb_sc (sid, cid, score) VALUES (1001, 1, 90);
-- 触发器会将该课程的学分计入学生1001的总学分
SELECT * FROM tb_student WHERE sid = 1001;
```
输出结果为:
| sid | sname | sex | age | nation | TCredit |
| --- | ----- | --- | --- | ------ | ------- |
| 1001 | 张三 | 男 | 20 | 汉族 | 4 |
请按要求写出以下SQL语句: (1) 请按要求创建数据库db_school,并创建学生表sch_student,sch_course课程表,sch_score成绩表。 (2) 请创建并调用存储过程 proc_stu, 实现通过指定的分数阈值score_t, 查询平均分成绩大于score_t的学生学号、姓名、和平均分的功能; (3) 在学生表上创建触发器 tri_stu ,实现学生表中删除学生记录时,成绩表中该学生成绩记录也被级联删除;
(1) 创建数据库db_school,以及学生表sch_student、课程表sch_course、成绩表sch_score的SQL语句如下:
```
-- 创建数据库
CREATE DATABASE db_school;
-- 使用db_school数据库
USE db_school;
-- 创建学生表
CREATE TABLE sch_student (
stu_id INT PRIMARY KEY,
stu_name VARCHAR(20),
stu_gender VARCHAR(2),
stu_age INT,
stu_major VARCHAR(20)
);
-- 创建课程表
CREATE TABLE sch_course (
course_id INT PRIMARY KEY,
course_name VARCHAR(20)
);
-- 创建成绩表
CREATE TABLE sch_score (
stu_id INT,
course_id INT,
score FLOAT,
PRIMARY KEY (stu_id, course_id),
FOREIGN KEY (stu_id) REFERENCES sch_student(stu_id),
FOREIGN KEY (course_id) REFERENCES sch_course(course_id)
);
```
(2) 创建并调用存储过程proc_stu,实现查询平均分成绩大于指定分数阈值score_t的学生学号、姓名和平均分的功能。存储过程的SQL语句如下:
```
-- 创建存储过程
CREATE PROCEDURE proc_stu
@score_t FLOAT
AS
BEGIN
SELECT sch_student.stu_id, sch_student.stu_name, AVG(sch_score.score) AS avg_score
FROM sch_student
JOIN sch_score ON sch_student.stu_id = sch_score.stu_id
GROUP BY sch_student.stu_id, sch_student.stu_name
HAVING AVG(sch_score.score) > @score_t;
END
-- 调用存储过程
EXEC proc_stu 80;
```
这里的@score_t是存储过程的参数,用于指定平均分成绩的阈值。
(3) 在学生表上创建触发器tri_stu,实现学生表中删除学生记录时,成绩表中该学生成绩记录也被级联删除。触发器的SQL语句如下:
```
-- 创建触发器
CREATE TRIGGER tri_stu
ON sch_student
AFTER DELETE
AS
BEGIN
DELETE FROM sch_score
WHERE stu_id IN (SELECT deleted.stu_id FROM deleted);
END
```
这里的deleted是一个特殊表,它包含了刚刚被删除的记录。在触发器中,我们可以使用它来获取刚刚被删除的学生记录的学生ID,然后在成绩表中删除该学生成绩记录。这样就实现了级联删除的功能。