Mysql高级部分(1)索引(index)..............................................................................1(2)视图(view)................................................................................3(3)触发器(trigger)......................................................................6(4)游标(cursor).............................................................................8(5)事务(Transaction).....................................................................10(6)存储过程(StoredProcedure)................................................13(1)索引(index)索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。优点:大大加快数据的检索速度;创建唯一性索引,保证数据库表中每一行数据的唯一性;加速表和表之间的连接;在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。缺点:索引需要占物理空间当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。更好的理解索引的提示:如果经常使用表中的某一列或某几列为条件进行查询,且表中的数据量比较大时,可以创建索引,以提高查询的速度。索引是与表关联的可选结构。通过有目的的创建索引,可以加快对表执行SELECT语句的速度。不管索引是否存在,都无需修改任何SQL语句的书写方式。索引只是一种快速访问数据的途径,它只影响查询执行的效率。可以使用CREATEINDEX命令在一列或若干列的组合上创建索引。创建索引时,将获取要创建索引的列,并对其进行排序。然后,将一个指针连同每一行的索引值存储起来,组成键值对(目录名和页码)。使用索引时,系统首先通过已排序的列值执行快速搜索,然后使用相关联的指针值来定位具有所要查找值的行。一旦创建了索引,MySQL会自动维护和使用它们。只要修改了数据,如添加新行、更新现有行或删除行,MySQL都会自动更新索引。但是为表创建过多的索引会降低更新、删除以及插入的性能,因为MySQL还必须更新与该表关联的索引。索引的分类普通索引:这是最基本的索引,它没有任何限制唯一索引:它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一主键索引(通过主键约束间接创建):它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引组合索引:在表中的多个列上创建的索引。组合索引中列的顺序是任意的,可以是相邻的列,也可以是不相邻的列。索引的创建:普通(唯一)索引的创建:CREATE[UNIQUE]INDEXindex_nameONtbl_name(index_col_name,…)index_col_name:col_name[(length)][ASC|DESC]对于字符类型的列,可以编制“前缀索引”,Length表示按照列的指定长度的字符串索引创建组合索引:CREATEINDEXindex_nameONtbl_name(index_col_name1,index_col_name2,..)基于(列A,列B)两列创建索引:可应用索引的情况:A;AB两列结合;不可用索引的情况:BCreateindexindex_nameontable_name(列A,列B);其他创建索引的方式:创建表时创建索引:CREATETABLEtbl_name(列的定义,……,INDEX|KEY[idx_name](index_col_name));Eg:CREATETABLEt1(tidintprimarykey,#既创建约束,又创建索引tnamevarchar(20),indexidx_tname(tname),#创建一个普通索引tbirthdaydate);修改表时创建索引:ALTERTABLEtbl_nameADDINDEX|KEY[idx_name](indxe_col_name);Eg:ALTERTABLEt1ADDKEY(tbirthday);查看索引:Showindex|keysfrom表名;(SHOWKEYSFROMt1;)删除索引:dropindex索引名on表名。(dropindexcont3;)(2)视图(view)从用户角度来看,一个视图是从一个特定的角度来查看数据库中的数据。从数据库系统内部来看,一个视图是由SELECT语句组成的查询定义的虚拟表,视图是由一张或多张表中的数据组成的,从数据库系统外部来看,视图就如同一张表一样,对表能够进行的一般操作都可以应用于视图,例如查询,插入,修改,删除操作等。视图是一个虚拟表,其内容由查询定义。概述:视图以经过定制的方式显示来自一个或多个表的数据视图是一种数据库对象,用户可以象查询普通表一样查询视图。视图内其实没有存储任何数据,它只是对表的一个查询。视图的定义保存在数据字典内。创建视图所基于的表为“基表”。视图一经定义以后,就可以像表一样被查询、修改、删除和更新作用:简化数据查询语句使用户能从多角度看到同一数据提高了数据的安全性提供了一定程度的逻辑独立性减少带宽流量、优化后还可提高执行效率优点:提供了另外一种级别的表安全性隐藏的数据的复杂性简化的用户的SQL命令通过重命名列,从另一个角度提供数据视图的创建:CREATE[ORREPLACE][ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]VIEWview_name[(column_list)]ASselect_statement[WITH[CASCADED|LOCAL]CHECKOPTION]说明:ORREPLACE:给定了ORREPLACE子句,语句能够替换已有的同名视图。ALGORITHM:可选的mysql算法扩展,算法会影响MySQL处理视图的方式。有以下三个值:UNDEFINED--MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。MERGE--会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。TEMPTABLE--视图的结果将被置于临时表中,然后使用它执行语句。veiw_name:视图名。column_list:要想为视图的列定义明确的名称,列出由逗号隔开的列名。column_list中的名称数目必须等于SELECT语句检索的列数。若使用与源表或视图中相同的列名时可以省略column_list。select_statement:用来创建视图的SELECT语句,可在SELECT语句中查询多个表或视图。但对SELECT语句有以下的限制:1.定义视图的用户必须对所参照的表或视图有查询(即可执行SELECT语句)权限;2.在定义中引用的表或视图必须存在;WITH[cascaded|local]CHECKOPTION:在关于可更新视图的WITHCHECKOPTION子句中,当视图是根据另一个视图定义的时,LOCAL和CASCADED关键字决定了检查测试的范围。LOCAL关键字对CHECKOPTION进行了限制,使其仅作用在定义的视图上,CASCADED会对将进行评估的基表进行检查。如果未给定任一关键字,默认值为CASCADED。WITHCHECKOPTION指出在可更新视图上所进行的修改都要符合select_statement所指定的限制条件,这样可以确保数据修改后,仍可通过视图看到修改的数据。视图定义服从下述限制:SELECT语句不能包含FROM子句中的子查询。SELECT语句不能引用系统或用户变量。SELECT语句不能引用预处理语句参数。在存储子程序内,定义不能引用子程序参数或局部变量。在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECKTABLE语句。在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图。在视图定义中命名的表必须已存在。不能将触发程序与视图关联在一起。修改视图:ALTER[ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]VIEWview_name[(column_list)]ASselect_statement[WITH[CASCADED|LOCAL]CHECKOPTION]说明:该语句用于更改已有视图的定义。其语法与CREATEVIEW类似。该语句需要具有针对视图的CREATEVIEW和DROP权限,也需要针对SELECT语句中引用的每一列的某些权限。查看视图:SHOWCREATEVIEWview_name说明:该语句给出了1个创建给定视图的CREATEVIEW语句。删除视图:DROPVIEW[IFEXISTS]view_name[,view_name]...[RESTRICT|CASCADE]说明:DROPVIEW能够删除1个或多个视图。必须在每个视图上拥有DROP权限。可以使用关键字IFEXISTS来防止因不存在的视图而出错。如果给定了RESTRICT和CASCADE,将解析并忽略它们。更新视图:概述:视图的使用与表一样,有增删改查四种操作,且语法也与表相同。在视图上也可以使用修改数据的DML语句,如INSERT、UPDATE和DELETE可以统称为“通过视图更新数据”。通过视图更新数据有如下限制:一次只能修改一个底层的基表如果修改违反了基表的约束条件,则无法更新视图如果视图中的列不是表中的原始列(如创建视图时使用了连接操作符、聚合函数等),则不能通过视图更新。视图更新操作:可更新的视图:要通过视图更新基本表数据,必须保证视图是可更新视图,即可以在INSET、UPDATE或DELETE等语句当中使用它们。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。如果视图包含下述结构中的任何一种,那么它就是不可更新的:聚合函数;DISTINCT关键字;GROUPBY子句;ORDERBY子句;HAVING子句;UNION运算符;位于选择列表中的子查询;FROM子句中包含多个表;SELECT语句中引用了不可更新视图;插入数据:使用INSERT语句通过视图向基本表插入数据注意:当视图所依赖的基本表有多个时,不能向该视图插入数据,因为这将会影响多个基本表。对INSERT语句还有一个限制:SELECT语句中必须包含FROM子句中指定表的所有不能为空的列。修改数据:使用UPDATE语句可以通过视图修改基本表的数据注意:若一个视图依赖于多个基本表,则一次修改该视图只能变动一个基本表的数据。删除数据:使用DELETE语句可以通过视图删除基本表的数据注意:对依赖于多个基本表的视图,不能使用DELETE语句。(3)触发器(trigger)它是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。触发器可以从DBA_TRIGGERS,USER_TRI