mysql的进阶用法
视图 类似临时表取别名,可反复使用。不推荐使用 -- 创建 create view v1 as select * from student where sid > 10; -- 使用 select * from v1; # 使用v1视图 -- 修改 alter view v1 as SQL; -- 删除 drop view v1; 触发器(不推荐使用) delimiter \\ create trigger t1 before/after insert/delete on table1 for each row begin SQL; -- insert 可使用 NEW 变量; delete 可使用 OLD 变量 end \\ delimiter ; 函数 ---- 内置函数 select curdate(); -- 当前日期 current_timestamp(); -- 当前日期 length('asdf'); -- 字符串长度 concat('alex', '123'); -- 拼接 date_format('2020-02-02', "%Y-%m") -- 时间格式化 ---- 自定义函数 delimiter \\ create function f1( i1 int, i2 int) returns int begin -- 可以写 存储过程 语句 declare num int default 0; set num = i1 + i2; return(num); end \\ delimiter ; select f1(); 存储过程 (更重要,DBA与程序员之间的分工活) 保存在MySQL上的一个别名,它是一堆SQL语句,用于替代程序员写SQL语句 delimiter \\ create procedure p1( in n1 int, -- in, out, inout out n2 int) begin set n2 = 123123; select * from user where id > n1; end \\ delimiter ; set @v1 = 0; call p1(1, @v1); -- @v1只用于取值,无法传入值,如果为inout,则皆可 select @v1; 事务(性能不高) delimiter \\ create procedure p2( out return_code tinyint) begin -- 定义异常 declare exit handler for sqlexception begin set return_code = 1; # 异常状态 rollback; # 回滚操作 end; -- 原子性事务操作 start transaction; delete from tb1; insert into tb2(name) values('seven'); commit; set return_code = 0; # 正常状态 end \\ delimiter ; 游标(略) 动态执行SQL(防SQL注入) delimiter \\ create procedure p2( -- in tpl varchar(255), in arg int) begin set @arg = arg; -- 创建session变量 prepare prod_name from 'select * from user where id = ?'; execute prod_name using @arg; -- 只能是session变量 deallocate prepare prod_name; end \\ delimiter ; 索引(Index) 创建额外文件,某种格式存储。 普通索引: 加速查找 主键索引: 加速查找 + 不能重复 + 不能为空 唯一索引: 加速查找 + 不能重复 联合索引: (多列) 联合主键索引 联合唯一索引 联合普通索引 create index id_name on user(name); drop index id_name on user; ORM操作 (SQLAlchemy)
