Day53
1.触发器
由某个事件去触发某个操作,这些事件有:insert、update、delete语句;
创建触发器:
[ delimiter XX ]
create trigger 触发器名 [before | after] 触发事件 on 表名 for each row 执行语句begin多条执行语句end 加上 “结束符XX”drop trigger t1
before : 前置触发器
after :后置触发器
Ps:
new.字段:当前写法可以获得添加语句字段对应的值
old.字段:当前写法可以获得删除语句字段对应的值
创建场景 ----------------------------------------------------------------------------
创建学科表,并添加数据
CREATE TABLE course(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),sum INT(3) DEFAULT 0
)
INSERT INTO course(name) VALUES('JavaEE');
INSERT INTO course(name) VALUES('Python');
INSERT INTO course(name) VALUES('HTML');
创建班级表,并添加数据
CREATE TABLE class(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),sum INT(3) DEFAULT 0
)
INSERT INTO class(name) VALUES('2401JavaEE');
INSERT INTO class(name) VALUES('2402JavaEE');
INSERT INTO class(name) VALUES('2401Python');
INSERT INTO class(name) VALUES('2402Python');
INSERT INTO class(name) VALUES('2401HTML');
INSERT INTO class(name) VALUES('2402HTML');
创建学生表
CREATE TABLE student(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),class_id INT(3),course_id INT(3)
)
1.1 需求:添加学生,并更新班级表和学科表的数据
创建触发器(添加学生数据之后,就会触发班级表和学科表更新数据的操作)
delimiter xx - 设置SQL命令的结束符
trigger - 触发器
after - 后置触发
delimiter xx
create trigger tri01 after insert on student for each rowBEGINUPDATE class SET sum=sum+1 WHERE id=new.class_id;UPDATE course SET sum=sum+1 WHERE id=new.course_id;END xx
delimiter ;
INSERT INTO student(name,class_id,course_id) VALUES('喻平',1,1);
INSERT INTO student(name,class_id,course_id) VALUES('马智威',1,1);
INSERT INTO student(name,class_id,course_id) VALUES('李林俊',2,1);
INSERT INTO student(name,class_id,course_id) VALUES('麻生希',3,2);
INSERT INTO student(name,class_id,course_id) VALUES('椎名空',4,2);
1.2 需求:删除学生,并更新班级表和学科表的数据
创建触发器(删除学生数据之前,就会触发班级表和学科表更新数据的操作)
delimiter xx
create trigger tri02 before delete on student for each rowBEGINUPDATE class SET sum=sum-1 WHERE id=old.class_id;UPDATE course SET sum=sum-1 WHERE id=old.course_id;END xx
delimiter ;DELETE FROM student WHERE id = 2;
删除存储过程
DROP TRIGGER tri01;
DROP TRIGGER tri02;
2.存储过程
注意:类似于Java里的方法
创建场景 ----------------------------------------------------------------------------
创建学生表,并添加数据
CREATE TABLE student(id INT(3) PRIMARY KEY auto_increment,name VARCHAR(32),sex VARCHAR(32),age INT(3),salary FLOAT(8,2),course VARCHAR(32)
)
INSERT INTO student(name,sex,age,salary,course) VALUES('龙俊','男',23,10000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('喻平','男',20,12000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('牛西燕','女',19,17000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('刘德华','男',21,15000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('马德华','男',27,10000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('霍建华','男',19,12000,'Java');
INSERT INTO student(name,sex,age,salary,course) VALUES('华晨宇','男',32,5000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('黄日华','男',45,4000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('任达华','男',28,7000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('周华健','男',30,8000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('欧阳震华','男',23,12000,'Python');
INSERT INTO student(name,sex,age,salary,course) VALUES('麻生希','女',30,7000,'HTML');
INSERT INTO student(name,sex,age,salary,course) VALUES('椎名空','女',23,6000,'HTML');
INSERT INTO student(name,sex,age,salary,course) VALUES('水野朝阳','女',28,8000,'HTML');
2.1 最简单的存储过程
查询学生表和用户表里的数据
delimiter xx
CREATE PROCEDURE pro01()BEGINSELECT * FROM student;SELECT * FROM user;END xx
delimiter ;
调用存储过程
CALL pro01();
SQL中存储过程 与 Java中方法 的区别
Java方法中的参数指的是外界传入到方法内部的数据,返回值指定是方法结束后返回的具体数据
SQL存储过程中没有返回值,但是有返回参数
存储过程中参数的分类:
in - 传入参数
out - 传出参数
inout - 传入传出参数
2.2 需求:创建存储过程,传入学生id,查询出学生姓名
delimiter xx
CREATE PROCEDURE pro02(IN s_id INT(3))BEGINSELECT name FROM student WHERE id=s_id;END xx
delimiter ;
调用存储过程
CALL pro02(2);
2.3 需求:创建存储过程,传入学生id,返回学生姓名
delimiter xx
CREATE PROCEDURE pro03(IN s_id INT(3),OUT s_name VARCHAR(32))BEGINSELECT name INTO s_name FROM student WHERE id=s_id;END xx
delimiter ;
调用存储过程
CALL pro03(3,@s_name);
SELECT @s_name;
2.4 需求:创建存储过程,传入学生id,返回学生年龄
delimiter xx
CREATE PROCEDURE pro04(INOUT param INT(3))BEGINSELECT age INTO param FROM student WHERE id=param;END xx
delimiter ;
调用存储过程
SET @param = 3;
CALL pro04(@param);
SELECT @param;
删除存储过程
DROP PROCEDURE pro01;
DROP PROCEDURE pro02;
DROP PROCEDURE pro03;
DROP PROCEDURE pro04;
3.预定义函数
理解:MySQL给我们提供的函数
注意:函数必须有返回值
3.1 数学类函数
SELECT ABS(-100);# 求绝对值
SELECT sqrt(9); # 求平方根
SELECT mod(10,3);# 求余数
SELECT pow(2,3); # 求次方
SELECT rand();# 求随机值
3.2 字符串类函数
拼接字符串
SELECT CONCAT("用良心做教育","做真实的自己");
截取字符串(目标字符串,第几个字符,截取长度)
SELECT SUBSTR("用良心做教育",2,2);
获取长度(字节)
SELECT length("用良心做教育");
3.3 日期时间类函数
获取当前日期时间
SELECT now();
SELECT YEAR(NOW());# 获取年
SELECT MONTH(NOW());# 获取月
SELECT DAYOFMONTH(NOW());# 获取日
SELECT HOUR(NOW());# 获取时
SELECT MINUTE(NOW());# 获取分
SELECT SECOND(NOW());# 获取秒
SELECT DATE_FORMAT(NOW(),"%Y年%m月%d日 %H时%i分%s秒");
4.自定义函数
注意:MySQL的函数必须有返回值
需求:创建一个函数,传入学生id,返回学生信息
delimiter xx
CREATE FUNCTION fun(s_id INT(3)) RETURNS VARCHAR(32) DETERMINISTICBEGINDECLARE s_name VARCHAR(32);SELECT name INTO s_name FROM student WHERE id=s_id;RETURN s_name;END xx
delimiter ;
调用函数
SELECT fun(3);