首页 > 代码库 > mysql重点、视图、事务、备份还原【mysqldump】、mysql编程【触发器、存储函数、存储过程】、存储引擎
mysql重点、视图、事务、备份还原【mysqldump】、mysql编程【触发器、存储函数、存储过程】、存储引擎
1.删除数据需要注意的问题【删除记录delete】 删除数据本身没有太多说的,还是删除表的时候有truncate用法 delete from是逐条删除记录【加不加条件全删,效率低,在删除表方面】 truncate是重建表【删除表时效率高】
2.修改数据【update】
【一下重点性能】
3.视图(view)【是一张虚拟的表:使客户端在虚拟的表中进行操作】 视图就是一条查询语句的结果【因为查询之后的结果本身就会形成一张表给客户端】【视图使用到mysql的内置机制】 create view 视图名 AS 查询语句;【这样就是上面这个观点的语法,根据一条查询语句来形成一个表】 【视图的功能就是为了方便生成一个表,然后直接对这个表进行操作即可:其实是一个子查询(视图本身并没有数据)。只是有视图这个功能,mysql的机制简化了子查询的命令拼写的难度】
然后将这个生成的视图当做一个正常的数据表,就可以直接进行操作【注意这个】 【但是视图内是不保存真是数据的,视图内只有一条生成视图的select语句,每次从视图查询时,都需要利用视图,在真是的表中进行查找。这么看来就是两个查询的子查询】
【视图重点:】 【视图对性能上的提升很难提高,有两种算法,但是在性能上提升并不明显】 【http://wangyuanzju.blog.163.com/blog/static/130292007714102859807/ 使用视图之后的算法不能兼容聚合函数之类的情况】 【http://www.jb51.net/article/36363.htm 关于视图的使用】
【视图的算法,可以在创建视图时,指定算法来实现ALGORITHM】 (1)merge【对视图之后的子查询的语句进行合并处理,会出现问题】 (2)temptable【这种方式相当于将子查询按照临时表的方式进行处理】 (3)undefined:未定义【mysql自行决定使用算法】
4.事务【重点】transaction 一组sql的集合,只有全部执行成功,要么集体失败。 一个业务逻辑需要多个sql来保证执行。
语法: 开启事务:start transaction;【或使用begin】【先记录sql语句,然后执行这些sql】 提交:commit;【如果所有的sql都执行成功,则提交。将sql的执行结果持久化到数据表内!】【持久化:说的是sql的执行结果并没有写入数据表中,而是mysql将执行结果单独开辟的空间,只有全部sql执行完成,将执行结果持久化到数据表】 回滚:rollback;【如果存在sql执行失败的情况,则需要回滚。将退回到整个事务开启前】
以上三种语法使用的场景就是为了保证整个事务的合理使用。【三种语法需要进行组合来实现事务的机制】
如果不声明是事务的话,mysql对sql命令是默认自动提交的。 【所以开启事务就是关闭了自动提交的功能,而需要使用手动提交!!!】【autocommit变量保存的就是相关配置 set sutocommit = 0;即可实现设置变量(set names 设置编码也是这个原因)】 事务被Innodb引擎支持。
事务的特点:ACID 原子性:事务是不可分割的 一致性:保证数据在事务的执行周期内是一致的【数据会单独放在执行结果中,并不能影响到】 隔离性:多个事务之间的干扰会被隔离【隔离级别】 持久性:事务一旦被提交,就不会被回滚
【http://blog.csdn.net/forever_feng/article/details/4368003】
5.备份还原 (1)简单的数据备份【单表备份】 通过select语句将查询到的数据,以文本文件(但是该文本不能存在,相当于要在语句执行时进行创建)的形式,存储起来【select into outfile 文件名 from...】 通过对文件中的间隔符号等的控制来控制生成文件的格式。
另外还可以还原【将文件内的数据载入到库中】 load data infile ‘文件地址‘ into ‘表名‘;【实现将文件内的信息导入数据库中】
(2)【mysqldump】这个工具集成了这些备份和还原【相当于一个特殊的客户端(与mysql本身的客户端无关),与mysql服务器连接之后进行备份】 【mysqldump是在mysql的bin文件下的可执行文件:mysqldump启动即可实现备份和还原操作】 备份生成的是sql语句【注意】【使用这些sql语句,需要mysql执行source命令】
(3)直接复制数据文件进行备份【data目录下的相关库里的文件进行复制备份:但不是每次都生效,myisam引擎才可以】
6.触发器【编程】 当某个操作发生之后,来绝对触发的某种事件【类似js的事件触发情形】 触发器本身是一种编程设计,是通过在定义之初的一种设置【注册事件】,然后再程序开始之后进行事件监听,从而达到事件发生之后的情况的描述【实现事件发生之后的编程控制】
语法: create trigger 触发器名字 触发条件,监听内容,触发后执行的操作 触发程序是与表有关的命名数据库对象,当表上出现某种特定事件时,激发该对象 【before/after insert/delete/update】六个事件 例如: create trigger test_trigger//触发器名 after insert//触发条件 on select_student for each row//监听的对象 insert into student_log values()//触发后执行的操作【一组sql集合】 ;//完成整个触发器的定义
【另外标记触发器触发作用的事件的对象的关键字:new、old来标记作用的记录】
【需要对触发器的实现场景进行注意】 【触发器由多条sql语句组成,需要使用begin/end来将多条语句组成一个组合】
一个表上一个时间内只能有一个触发器【这个自然】 删除触发器 drop trigger 但是一条sql语句可能触发多个触发器【因为sql语句可能对多个表操作,引发触发器的执行】
7.mysql中的分支【用于sql组合时使用】: 分支中需要执行sql的语句的结束符和语法本身的分号会有矛盾 【解决这一问题,需要修改最外层的语句结束符:delimiter限制符】
8.自定义函数 sql编程问题【sql也是一门程序设计语言:所以编程的要素——变量,运算符,表达式,流程控制,函数也存在】 mysql的编程的使用场景: 触发器,存储过程,存储函数(自定义函数)
变量:就是字段名【这一点认识要注意】【另外还有特殊的变量,就是系统自定义的变量:set names gbk(names就是一个变量名)这是对变量的自定义设置】 【获取变量值的语法:select 变量名】 【这里的变量考虑到自定义函数的使用,也需要注意全局和局部,全局变量被局部改变需要传引用(全局变量定义时就需要使用@来声明)所以二者的作用域虽然有区分,但是可以被直接修改。与php区别,但是和js一致】
函数:mysql系统本身的内置函数【聚合函数都是】【要注意全局和局部变量的问题】 【自定义函数】 【create function function_name() returns int//这里的returns是因为sql强类型 begin 函数体 end 】 mysql中并没有花括号做函数体的包含 例子: delimiter $$//为了和内部的sql中的分号不冲突 create function hello_world() returns varchar(20) begin --这里是sql中的注释语句 return ‘hello world‘; end $$ delimiter ; 以上便创建了一个自定义的函数【调用时和正常【聚合函数】使用都一样】 注意,这里的自定义函数与自定义时的数据库有关,当切换库之后便不能调用该函数【在调用函数时,参数的类型也需要注意】。【所以该函数也被称为存储函数】
mysql中编程的流程控制【分支和循环】流程控制也是在mysql编程中使用,所以基本也只有那三种情形下使用 【存储过程】【存储函数】【触发器】
以上就是mysql自定义函数的知识点
9.存储过程 【与存储函数类似,也是一个功能模块的集合代码。区别在于,函数倾向于某个功能点。而存储过程倾向于某个业务逻辑的整体实现】 业务逻辑更加倾向于表现某些操作的执行情况,而函数的话表示的功能点表示的就是能够被任何业务逻辑调用 语法: delimiter $$ create procedure hello() beigin sql集合体 end $$ delimiter ;
调用时不是直接使用过程名进行调用,而是需要使用call进行调用【这点要注意】
存储过程中的参数: 输入【传入存储过程】in 输出【从存储过程中传递出来】out 输入输出【同时完成输入输出】inout
使用的位置: delimiter $$ create procedure say_hello(in name varchar(10))//这里进行参数的限制。。in begin select concat(‘hello‘,name); end $$ delimiter ;
call say_hello(‘itcast‘);//这里进行传递【in】。。。call
【out】 delimiter $$ create procedure say_hello(in n int,out r int) begin --过程的sql集合 end $$ delimiter; call say_hello(‘itcast‘, @r);//注意这里调用的@r的使用本身没有值,就是用来接收procedure的处理结果
【inout本身就是对一个变量进行过程处理的场景。语法和in类似,但是能够进行接收结果】
10.存储引擎 存储引擎主要说的是数据在mysql服务器上的数据的格式【非常多种】 myisam【三个文件:.frm(结构文件)/.myd(数据文件)/.myi(数据索引文件)】 innodb【当前默认】【.frm。innodb的表的数据和索引是统一管理的。位于ibdata文件中】【其实innodb的数据创建两个文件】 memory merge
myisam和innodb的区别: (1)创建的文件数量和路径不一致 (2)innodb支持外键、事务【保证数据的完整性和合理性】 (3)myisam对查询功能上有优化【innodb也是在发展中】
选择引擎时的判断依据: (1)先参考功能 (2)对增删改操作多使用innodb,查询多使用myisam
11.root密码问题 use mysql; 查找user表 将其他的user表的三个文件拷贝到mysql目录下【myisam方式存储】
或者mysqld服务器程序里,有一个选项【--skip-grant-table】能够绕过权限认证,然后使用update更新user表实现密码更新 mysql内部加密函数【password()】即可
以上是mysql的基础知识
mysql重点、视图、事务、备份还原【mysqldump】、mysql编程【触发器、存储函数、存储过程】、存储引擎