Outfile
注意:
Insert详解
delete和update相关
视图
01.视图创建
02.视图相关定义
03.视图创建详解
04.删除视图
05.视图查询
06.更新视图
07.视图的执行过程
触发器
01.定义触发器
02.操作触发器
03.注意
Outfile
将检索到的数据,保存到服务器的文件内。
通过:select * from outfile “文件地址” from XXXX;
注意:
1.可以自动创建文件,但是对已有文件不能操作。
2.生产的文件格式:默认使用制表符区分字段,用换行符区分记录,也会使用其他方式进行区分。
Insert详解
1.可以不将所有的字段插入数据,
2.如果插入部分字段,可以使用set语句:insert into teacher set t_name=’...’,c_name=’...’;
3.可以一次性插入多条语句,使用括号区分,逗号分开;
4.有主键冲突的时候,插入不成功,可以继续执行更新操作:insert into teacher(id,t_name,c_name) values(...) on duplicate key update t_name=””,c_name=””;
5.插入数据源可以是select语句查询到的数据;insert into teacher(..) select * from XXX;
6.如果字段不写,可以使用默认值;也可以强制使用default()函数或者default关键字使用默认值。
7.Replace:主键或唯一索引冲突,则替换;否则插入。
8.可以使用load data file导入数据:load data infile ‘文件路径’ into table tb_name;
注意: 数据写入时,可能会引发多种异常,需要小心处理。
如: 主键冲突、唯一性约束、字段长度超标、数据类型不匹配、not null等
delete和update相关
delete
DML删除:
DELETE FROM 表名 WHERE 条件;
允许使用条件(删除符合条件的数据)
允许使用limit,限制删除的记录数,
常见的是limit 配合order by来使用,先将 结果排序,再删除固定数量的记录。
允许连接删除:先提供表名,再提供连接条件。
Truncate:
DDL删除:
truncate table 表名;
a) 不会返回删除的记录数
b) 重新自动增长主键
如何快速把一个表里面的数据清空: truncate table 表名;
重点: 如何数据含有子记录,如何删除?
删除的时候,需要判断异常返回值,如果存在完整性约束异常,则转为逻辑删除(打删除标记),否则物理删除!
Delete:逐行删除
Truncate:删除表,新建表
视图
作用:
1.安全性:将底层数据结构隐藏
2.易用性:复杂变简单
01.视图创建
Create table info_teacher(
Id int primary key auto_increment,
T_name varchar(10),
Salary decimal(10,2)
);
Create view v_teacher as select i,t_name from info_teacher;
02.视图相关定义
视图就是一张虚拟表,是一个存在与数据库中的虚拟表;视图本身没有数据,只是通过执行相关的select语句完成获得相应的数据。
03.视图创建详解
01)建立视图
Create view <视图名> [(<列名>,[,<列名>])]
As <子查询>
[with check option]
With check option表示对视图进行update、insert、delete操作时要保证视图的操作的行满足视图定义中谓词条件(即子查询中的条件表达式)。
组成视图的属性列名或者全部省略或者全部指定。在下面三种情况下必须指定视图列名:01.某个目标列不是单纯的属性名,而是聚集函数或者列表达式;02.多表连接时选出了几个同名列作为视图的手段;03.需要在视图为某个列启用更合适的名字。
定义基本表时,为了减少数据库的冗余数据,表中中存放基本数据,由基本数据经过各种计算派生出的数据一般是不存储的。创建视图也可以创建基本表中不存在的列,即创建派生列(比如avg(列名))。
视图可以创建在单个表上,也可以建立在多个基本表上。视图不仅可以建立在一个或者多个基本表上,也可以建立在一个或者多个已定义的视图上,或者建立在基本表和视图上。
04.删除视图
Drop view <视图名>[cascade];
05.视图查询
视图定义之后,用户就可以像对基本表一样对视图进行查询了。
视图消解:关系型数据库管理系统执行对视图的查询的时候,首先进行有效性检查,检查查询中涉及的表、视图是否存在。如果存在,则从数据字典中取出视图的定义,吧定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。
06.更新视图
更新视图就是对视图进行crud操作,真正操作也会经历视图消解。为了防止通过视图对数据进行更新的时候,有意无意对不属于视图的基本表进行操作,可以在视图定义的时候加上With check option。
07.视图的执行过程
视图的执行算法:merge,temptable
指的是一个视图是在什么时候执行,依据哪些方式执行;
Merge:合并的执行方式,每当执行的时候,先将我们视图的sql与语句与外部查询视图的sql语句,混合在一起,最终执行;
Temptable:临时表模式,每当查询的时候,将视图所使用的select语句生成一个结果的临时表。再在当前的临时表内查询。
每当用户创建视图的时候,mysql默认使用一种undefined的处理算法;就是会自动在合并和临时表内进行选择。
触发器
01.定义触发器
Create trigger <触发器名称>
{before|after} <触发器名> on <表名>
Referencing new|old row as <变量> /*Referencing 指出引用的变量*/
For each {row|statement}
[when <触发条件>] <触发动作体>
02.操作触发器
删除:drop trigger<触发器名> on <表名>;
查看:show create trigger name;
03.注意
如果一个触发程序,由多条sql语句组成。
应该:1.语句组成语句块(begin end标识);2.语句块的语句需要独立的语句结束符,分号。
命令行:由于触发程序内使用分号作为语句结束符。那么当命令行客户端碰到分号时,就应该理解成触发程序内子语句结束,而不是整个创建触发器的语句结束。
应该通过修改命令行的语句结束符达到目的。
Delimiter语句可以完成设置语句结束符。
Delimiter $$
Create trigger ruxue after insert on student
For each row
Begin
Update class set stu_count=student_count+1;
Update class set cz_money=cz_money+20;
End
$$
Delimiter ;
Old:监听事件所在表上的数据,在事件发生之前时的数据;
New:监听表上,事件发生之后,新处理完毕的数据。
事件是insert时:不能使用old;事件为delete:不能使用new;
本文转自 叫我北北 51CTO博客,原文链接:http://blog.51cto.com/qinbin/1953871