1、定义触发器:
语法:create trigger 触发器名
before|after 时间 on 表名 for each row 触发器语句
2、触发器的作用:
当a表中一条语句执行的时候,会连动b表。
触发器的主要作用时三种:
insert:新增记录、没有旧记录
delete:删除旧记录,没有新记录
update:有变更后的新记录,也有被变更的旧记录
可以是用old|new来引用这些记录
如:
for each row
insert into 记录表 values(old.xxx,new.xxx);
#创建表
CREATE TABLE account_history(
-> hid INT(11) AUTO_INCREMENT PRIMARY KEY,
-> account_name VARCHAR(30),
-> changed_cash DECIMAL(9,2));
#当更新了account时,在account_history中插入一条语句
CREATE TRIGGER trig_account_his AFTER UPDATE ON account
FOR EACH ROW
INSERT INTO account_history (account_name,changed_cash)
VALUES('A',10000);
UPDATE account SET cash =cash+10000 WHERE NAME='A';
#当在account中插入了一条语句时,在account_history中插入一条语句
DELIMITER @@
CREATE TRIGGER trigger_a_insert AFTER INSERT ON account
FOR EACH ROW
BEGIN
INSERT INTO account_history(account_name,changed_cash)VALUES('cust','10000');
END@@
INSERT INTO account(NAME,cash)VALUES('cust',10000);@@
SELECT * FROM account;
SELECT * FROM account_history;
DROP TRIGGER trig_account_his;
DROP TRIGGER trigger_a_insert;
#动态更新
CREATE TRIGGER trigger_a_insert AFTER INSERT ON account
FOR EACH ROW
INSERT INTO account_history(account_name,changed_cash)
VALUES(new.name,new.cash);
INSERT INTO account(NAME,cash)VALUES('abc','100');
INSERT INTO account(NAME,cash)VALUES
('random',cash(RAND()*10000 DECIMAL(9,2)));
#当在account中删除一条语句时,在account_history中同步更新状态
CREATE TRIGGER trig_a_delete AFTER DELETE ON account
FOR EACH ROW
INSERT INTO account_history(account_name,changed_cash)
VALUES(old.name,old.cash*-1);
DELETE FROM account WHERE id=9;
#当在account中更新一条语句时,在account_history中同步更新状态
CREATE TRIGGER trig_a_update AFTER UPDATE ON account
FOR EACH ROW
INSERT INTO account_history(account_name,changed_cash)
VALUES(CONCAT('old:',old.name,';new:',new.name),new.cash-old.cash)
UPDATE account SET cash=cash-10000, NAME='ICBC' WHERE NAME='B';
UPDATE TABLE account SET cash=10000000 WHERE NAME='c';
3、视图:
#视图
CREATE VIEW v_stu_sub_g AS
SELECT s.studentno,sub_no,s.studentname,subjectName,score,s.gradeid,gradename
FROM result r
JOIN student s ON r.stu_id=s.studentno
JOIN subjects ON sub_no=subjectNo
JOIN grades g ON s.gradeid=g.gradeid;
#练习题:
查询获取所有学员对应所有学科的成绩表,形成视图
在学生表和年级表形成视图,展示学生id,学生姓名,年纪id,年级名称
在成绩表、学生表和学科表形成视图,展示学生姓名,学科名称,成绩
合并上述两个需求,在需求二的基础上增加年级名称
请在以上需求基础上获得各年级,各科目成绩排名前5的学员
CREATE VIEW v1 AS SELECT studentno ,studentname,gradeid,gradename
FROM student s
JOIN grades g ON s.gradeid=g.gradeid;
CREATE VIEW v2 AS SELECT studentname, subjectName,score
FROM result r
JOIN student s ON r.stu_id=s.studentno
JOIN subjects ON sub_no=subjectNo;
SELECT studentname ,subjectName,score
FROM v_stu_sub_g a
WHERE (SELECT COUNT(score) FROM v_stu_sub_g b WHERE
a.score>=b.score AND a.sub_no=b.sub_no)<=2
ORDER BY sub_no ,score DESC;
#流程控制
DELIMITER@@
CREATE PROCEDURE testcase(IN VALUE INT(11))
BEGIN
CASE VALUE
WHEN 1 THEN SELECT 1+1;
WHEN 2 THEN SELECT 1+2;
WHEN 3 THEN SELECT 1+3;
ELSE SELECT 1+VALUE;
END CASE;
END@@
DELIMITER;
DELIMITER @@
CREATE PROCEDURE testwhile()
BEGIN
SET @i:=0;
SET @sum:=0;
WHILE@i<=10
DO
SET @sum:=@sum+@i;
SET @i:=@i+1;
END WHILE;
SELECT @sum;
END @@
DELIMITER ;