«

mysql的进阶用法

benojan • 2022-11-02 23:56 • 304 次点击 • 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)

创建额外文件,某种格式存储。

  1. 普通索引: 加速查找
  2. 主键索引: 加速查找 + 不能重复 + 不能为空
  3. 唯一索引: 加速查找 + 不能重复
  4. 联合索引: (多列)
    • 联合主键索引
    • 联合唯一索引
    • 联合普通索引
create index id_name on user(name);
drop index id_name on user;

ORM操作 (SQLAlchemy)

mysql