事务用于将某些操做的多个 sql 做为原子性操做,一旦某一个出现错误,便可回滚到原来状态,从而保证数据库数据完整性。mysql
使用方法:sql
start transaction; # 建立一个事物 SQL指令1; SQL指令2; ... SQL指令n; # 若是数据出现异常,或因为某些缘由致使不能继续进行下去,能够随时将事物开始后的数据操做取消 rool back;# 回滚数据到事物开始前 # 若是全部操做正常完成,在提交事物前,别的用户是不能看到更改后的数据的,且当前用户若是没有提交,操做也不会保存 commit; # 提交事物更新数据
事物的特性:(ACID)数据库
视图是一个虚拟表,本质是根据 SQL 语句获取动态的数据集,并为其命名使用视图名便可获取结果集,并将结果集看成表来使用,视图就是用来保存这个虚拟表的。服务器
视图也是表,因此可使用 show tables;
进行查看。网络
使用方法函数
# 通常用于须要大量重复使用某一个查询 SQL,每次都须要重写SQL指令会很麻烦,可使用视图将这个查询 SQL 的结果虚拟成一个表进行保存, 建立视图 create view 视图名 as SQL指令; # 将 SQL 指令的结果保存成一个视图,并命名 使用视图 select * from 视图名 修改视图中的数据 - 修改 update 视图名 set 列=值; - 插入 insert into 视图名 values(值1,值2,...) 删除视图 drop view 视图名;
注意优化
若是使用 SQL 过度依赖数据库中的视图,即具备强耦合性,那么扩展 SQL 将极为不便,所以不推荐使用。code
定制用户对表进行增、删、改操做先后的行为。orm
建立触发器对象
create or replace trigger 触发器名 (before/after/instead of) (inser/delete/update) on 表名 [for each row] when (condition) declare begin 触发器代码 # 一句或多句 end; (before/after/instead of)能够选择 before 或 after 或 instead of - before:语句实施前执行触发器 - after:语句实施以后执行触发器 - instead of:用在对视图的更新上 (inser/delete/update):DML语句,能够选择一个或多个,若是选择多个,用 or 隔开 [for each row]:可选项,若是注明了 for each row ,则说明了该触发器是一个行级的触发器,DML语句处理每条记录都会执行触发器;若是没有注明,则是一个语句级的触发器,每一个DML语句触发一次。 when 后的(condition)是触发器的响应条件,只对行级触发器有效,当操做的记录知足 condition 时,触发器才被执行,不然不执行 condition 中能够经过 new 对象和 old 对象来引用操做的记录
使用触发器
# delimiter:设定 SQL分隔符,默认为分号‘ ;’,mysql执行语句的标志 建立触发器 delimiter // # 当向表1中添加数据的时候,表2添加指定的数据 create trigger tri_before_insert_tb1 before insert on t2 for each row begin insert into t3 (name) values ('aa'); end // delimiter ; 查看触发器结构 show teiggers\G 删除触发器 drop teigger 触发器名;
存储过程包含了一系列的可执行sql代码,存放于 MySQL 中,经过调用它的名字能够执行内部的一堆 SQL。
建立存储过程
无参
delimiter // create procedure 存储过程别名() begin SQL指令 end // delimiter ;
有参
delimiter // create procedure 存储过程别名( in # 传入参数 out # 返回值 inout # 既能够传入参数又能够看成返回值 begin SQL指令 end // delimiter ;
执行存储过程
# 无参数 call 存储过程名(); # 有参数,全 in call 存储过程名(1,2) # 有参数,有 in,out,inout set @t1=0; set @t2=3; call proc_name(1,2,@t1,@t2)
删除存储过程
drop procedure 存储过程名;
MySQL中提供的内置函数
char_length(str) 返回值为字符串 str 的长度,长度的单位为字符。一个多字节字符算做一个单字符。 对于一个包含五个二字节字符集, length()返回值为 10, char_length()的返回值为5。 contact(str1,str2,...) 字符串拼接 若有任何一个参数为NULL ,则返回值为 NULL。 format(x,d) 将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若 D 为 0, 则返回结果不带有小数点,或不含小数部分。 例如: select format(12332.1,4); 结果为: '12,332.1000' instr(str,substr) 返回字符串 str 中子字符串的第一个出现位置。 left(str,len) 返回字符串 str 从开始的 len 位置的子序列字符。 lower(str) 字符串变小写 upper(str) 字符串变大写 ltrim(str) 返回字符串 str ,其引导空格字符被删除 rtrim(str) 返回字符串 str ,结尾空格字符被删去 substring(str,pos,len) 获取字符串子序列 locate(substr,str,pos) 获取子序列索引位置 repeat(str,count) 返回一个由重复的字符串str 组成的字符串,字符串str的数目等于count 若 count <= 0,则返回一个空字符串。 若str 或 count 为 NULL,则返回 NULL 。 replace(str,from_str,to_str) 返回字符串 str 以及全部被字符串 to_str 替代的字符串 from_str reverse(str) 返回字符串 str ,顺序和字符顺序相反。 right(str,len) 从字符串 str 开始,返回从后边开始len个字符组成的子序列
将重要的数据另外保存一份,防止意外丢失、故障等问题
语法
mysqldump -h 服务器 -u用户名 -p密码 数据库名 表1名, 表2名,.... > aaa.sql
用法
#单库备份 mysqldump -uroot -p123 db1 > db1.sql mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql #多库备份 mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql #备份全部库 mysqldump -uroot -p123 --all-databases > all.sql
导入备份恢复数据
source 备份文件路径.sql