MySQL阶段二——sql语句基础(3)

Outfile

注意:

    Insert详解

    delete和update相关

视图

    01.视图创建

    02.视图相关定义

    03.视图创建详解

    04.删除视图

    05.视图查询

    06.更新视图

    07.视图的执行过程

触发器

    01.定义触发器

    02.操作触发器

    03.注意


Outfile

将检索到的数据,保存到服务器的文件内。

通过:select * from outfile 文件地址 from XXXX;

注意:

1.可以自动创建文件,但是对已有文件不能操作。

2.生产的文件格式:默认使用制表符区分字段,用换行符区分记录,也会使用其他方式进行区分。

 

 

Insert详解

MySQL阶段二——sql语句基础(3)


 

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等

deleteupdate相关

delete

 DML删除:

    DELETE FROM  表名 WHERE 条件;

    允许使用条件(删除符合条件的数据)

    允许使用limit,限制删除的记录数,

    常见的是limit 配合order by来使用,先将 结果排序,再删除固定数量的记录。

    允许连接删除:先提供表名,再提供连接条件。


Truncate

 DDL删除:

     truncate table 表名;

    a) 不会返回删除的记录数

    b) 重新自动增长主键


如何快速把一个表里面的数据清空:  truncate table 表名;  

重点: 如何数据含有子记录,如何删除?

           删除的时候,需要判断异常返回值,如果存在完整性约束异常,则转为逻辑删除(打删除标记),否则物理删除!


Delete:逐行删除

Truncate:删除表,新建表


视图

MySQL阶段二——sql语句基础(3)

作用:

    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表示对视图进行updateinsertdelete操作时要保证视图的操作的行满足视图定义中谓词条件(即子查询中的条件表达式)。

组成视图的属性列名或者全部省略或者全部指定。在下面三种情况下必须指定视图列名:01.某个目标列不是单纯的属性名,而是聚集函数或者列表达式;02.多表连接时选出了几个同名列作为视图的手段;03.需要在视图为某个列启用更合适的名字。

定义基本表时,为了减少数据库的冗余数据,表中中存放基本数据,由基本数据经过各种计算派生出的数据一般是不存储的。创建视图也可以创建基本表中不存在的列,即创建派生列(比如avg(列名))。

视图可以创建在单个表上,也可以建立在多个基本表上。视图不仅可以建立在一个或者多个基本表上,也可以建立在一个或者多个已定义的视图上,或者建立在基本表和视图上。

 

04.删除视图

Drop view <视图名>[cascade];

 

05.视图查询

视图定义之后,用户就可以像对基本表一样对视图进行查询了。

视图消解:关系型数据库管理系统执行对视图的查询的时候,首先进行有效性检查,检查查询中涉及的表、视图是否存在。如果存在,则从数据字典中取出视图的定义,吧定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。

 

06.更新视图

更新视图就是对视图进行crud操作,真正操作也会经历视图消解。为了防止通过视图对数据进行更新的时候,有意无意对不属于视图的基本表进行操作,可以在视图定义的时候加上With check option

 

07.视图的执行过程

视图的执行算法:mergetemptable

指的是一个视图是在什么时候执行,依据哪些方式执行;

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

上一篇:MySQL的排序和分页语句(十八)


下一篇:基础才是重中之重~国外大牛对linq查询的扩展,有时还是T-SQL的样子好