11.1.2、用户变量
用户变量指用户自己定义的变量,可以给用户变量分配值。可以使用set 和 select
语句定义赋值(不赋值默认为空值),其中 select 语句还可以查看所赋的值。
变量作用范围:当前连接的会话范围(如果断开当前的连接,那么之前定义的变量将无法访问)。
定义用户变量的形式:以’@‘开始,如:“@var_name”,从而区分用户变量和表中列名。可以使用 '=',':='
操作符赋值。如果使用 select 语句必须使用 ':='
操作符赋值
语法:
set @var_name = value1 [ , @var_name = value2];
set @var_name := value1 [ , @var_name := value2];
set语句
mysql> set @test=123; Query OK, 0 rows affected (0.00 sec) mysql> select @test; +-------+ | @test | +-------+ | 123 | +-------+ 1 row in set (0.00 sec) mysql> set @var1=1,@var2=2; Query OK, 0 rows affected (0.00 sec) mysql> select @var1,@var2; +-------+-------+ | @var1 | @var2 | +-------+-------+ | 1 | 2 | +-------+-------+ 1 row in set (0.00 sec)
select语句
mysql> select @var:=1,@var:=2; +---------+---------+ | @var:=1 | @var:=2 | +---------+---------+ | 1 | 2 | +---------+---------+ 1 row in set, 2 warnings (0.00 sec) mysql> select @var,@var; +------+------+ | @var | @var | +------+------+ | 2 | 2 | +------+------+ 1 row in set (0.00 sec)
11.2、SQL系统函数
11.2.1、条件判断函数
if函数
语法:if(expr1,expr2,expr3)
如果表达式的结果是true(布尔类型),则返回expr2的值,否则返回expr3的值。
case结构
case case_expr when when_value then statement_list [ when when_value then statement_list ]... end case
case_expr:条件判断表达式,决定哪一个 when 被执行。 when_value:表示表达式可能的值,如果某个 when_value 值与case_expr表达式值结果相同,则执行对应 then 关键字后的 statement_list 语句。
11.2.2、数学函数
常用的一种函数。主要用于处理数字,包括整型、浮点数等
11.2.3、字符串函数
字符串函数是非常常用的一种函数。针对数据类型 数据的处理。
11.2.4、日期函数
11.2.5、聚合函数
一般作用在指定字段上。
11.3、自定义函数
在函数种可以使用 if、case、loop、repeat、while、for语句,这部分内容请自行了解。
11.3.1、创建函数
语法:
create function func_name(func_parameter) returns type body
create function:创建函数的关键字
func_name:函数名称
func_parameter:函数参数列表,形式为 (param_nae type),如:(num1 int,num2 int)
type:函数放回值类型,如:int、char(50)等。
body一般格式为,如下:
begin retrun(select 查询语句); end
delimiter 定界符: MySQL默认定界符是分号 ‘;’ 。使用 delimiter 语句,可以修改默认定界符
例子:
创建一个函数,查询某读者的年龄。
delimiter $ create function func_reader_age2(name char(50)) returns int begin return(select year(curdate())-year(reader_birthday) from t_reader where reader_name=name); end $ delimiter ; select func_reader_age2("肖华");
11.3.2、删除函数
drop function function_name;
十二、触发器
触发器自动执行时,以响应特定事件的存储程序。(特定事件:对数据库表的增删改)
触发器可以被定义在INSERT、UPDATE、DELETE语句更改数据表之前或之后被自动执行。
12.1、创建触发器
语法:CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW [trigger_order] trigger_body
参数详解:
trigger_time:中发器执行的时间:AFTER(之后) | BEFORE(之前)
trigger_event:触发器触发的事件:DELETE | UPDATE | INSERT
FOR EACH ROW:表示任何一条记录上的操作满足触发事件都会触发该触发器
table_name:表元触发事件操作表的名字
trigger_body:创建触发器的SQL语句
(1)创建Insert触发器,每向t_student中插入一条记录后,则向t_log表中插入该表的表名t_student和插入的时间。
CREATE TABLE t_log (logno int AUTO_INCREMENT primary key, tname varchar(20), logtime datetime); SELECT * FROM t_log; create trigger tr_insert after insert on t_student for each row insert into t_log (tname,logtime) VALUES('t_student',now()); insert into t_student(stu_id) values("0123456789"); select * from t_student; select * from t_log;
(2)创建一个t_score1表的插入触发器,当向t_score1表中插入一条数据时,在t_student1自动添加一条stu_id对应的记录,在t_cours1e中自动添加一条course_id对应的记录。
create table t_score1 like t_score; insert into t_score1 select * from t_score; //创建触发器 create trigger t_insert3 after insert on t_score1 for each row begin insert into t_student1(stu_id) VALUES("1123456789") ; insert into t_course1(course_id) VALUES("12345678") ; end //验证 insert into t_score1(score_id,stu_id,course_id) values(1018,1631607101,16610001); select * from t_student1 where stu_id = "1123456789"; select * from t_course1 where course_id = "12345678";
12.2、查看触发器
show triggers;
12.3、删除触发器
drop trigger trigger_name;
12.4、NEW和OLD的应用
MySQL中定义了NEW和OLD两个临时表,用来保存触发器修改之前和之后的表,方便引用。
12.4.1、流程图
12.4.2、案例
(1)修改表t_student1中一个学生的生日时,向另一个表t_backup(需新建)表中插入修改前的生日与修改后的生日。
//创建触发器 create trigger t_updata1 after update on t_student1 for each row begin insert into t_backup(old_birthday,new_birthday) values(old.stu_birthday,new.stu_birthday); end //测试 update t_student1 set stu_birthday="1999-12-12" where stu_name="王伟";
(2)删除t_major1表中的一条记录时,将删除的这条记录插入到另一个表(需新建表)中。
//创建触发器 create trigger t_delete1 after delete on t_major1 for each row begin insert into t_major_back values(old.major_id,old.major_name); end //测试 delete from t_major1 where major_name="计算机应用技术";
十三、 事务
语法:
START TRANSACTION | BEGIN DML语句 COMMIT 或 ROLLBACK
START TRANSACTION、BEGIN:可以开始一项新的事务
DML语句:insert、delete、update
COMMIT、ROLLBACK:定义提交、回滚事务
13.1、介绍
事务是一个完整的业务逻辑,是一个工作单元。如:
假设转账,从A账户向B账户中转账10000。
- 将A账户的钱减去10000 (update语句)
将B账户的钱加上10000 (update语句)这就是一个完整的业务逻辑。这两个updata语句要求必须同时成功或同时失败。
只有DML语句才会有事务这一说,其它语句和事务无关! ! !
insert、delete、update
只有以上的三个语句和事务有关系,其它都没有关系。
所以,事务就是批量的DML语句同时成功,或者同时失败
13.2、提交、回滚事务
提交事务:commit; 语句 ,代表事务结束。
回滚事务:rollback; 语句(回滚永远都是只能回滚到上一次的提交点!)
13.3、事务包括4个特性
A(原子性):
说明事务是最小的工作单元。不可再分。
C(一致性):
所有事务要求,在同一个事务当中,所有操作必须同时成功,或者同时失败,以保证数据的一致性。
I(隔离性)重点:
A事务和B事务之间具有一定的隔离。
教室A和教室B之间有一道墙,这道墙就是隔离性。
A事务在操作一张表的时候,另一个事务B也操作这张表会那样? ? ?
D(持久性):
事务最终结束的一个保障。事务提交,就相当于将没有保存到硬盘上的数据保存到硬盘上!