使用Microsoft Excel的时候,觉得很方便,可是当一个数据变得多起来的时候,一个接一个的表格就显得有些力不从心,关联也不是很理想,直到后来接触MySQL数据库,才发现数据库的便捷。

        我听到的最形象的比喻是把数据库比作图书馆。一本本的书就是一个个数据,在图书馆中如何把相同种类的书放在一类,如何把不同种类的书排列,思考这样的问题实际上就接触到了数据库的内容。

        闲话不多说了,在学习MySQL的时候,最后身旁有一本《MySQL入门很简单》这样一本书。我推荐大家在MySQL的官网去下载该软件,在官方网站你总能找到最新版的MySQL,其实不只是它,其他软件都应该养成去官网下载的习惯,这样不仅是正版,而且是最新的。在学习其他计算机语言的时候,我觉得MySQL的语言真的很简明,像什么CREATE、SELECT的,只要你的英文没有问题,很多关键字你都可以“顾名思义”的使用(好吧作者承认水平不足,其实只是其他语言的数据类型简写作者不懂而已)当你真正投入的学习MySQL语言,学习操作数据库的时候,你会发现,就像那本书名一样,MySQL入门很简单。

        在了解了数据库的概念以后,我就开始学习MySQL数据库的基本操作,我学习的顺序不同于书上,这是适合我的顺序,供大家参考。先开始学习①MySQL数据类型、然后②操作数据库,③创建、修改和删除表,④插入、更新与删除数据,⑤查询数据、⑥索引、⑦视图、⑧触发器、⑨存储过程和函数。

        MySQL的数据类型分为整数类型、浮点数类型和定点数类型。常用的整数类型是INT类型,在MySQL中INT类型和INTEGER类型因为字节数、取值范围都是一样的,所以它们是一样的。浮点数类型包括单精度浮点数(FLOAT型)和双精度浮点数(DOUBLE型),FLOAT型和DOUBLE型默认会保存实际精度。DECIMAL(M,D)定点数类型,有效取值范围是可以自己决定的。

        日期与时间类型比较简单,在数据库中存储日期与时间,只要注意输入的范围即可。纪录日期和时间,注意DATETIME类型和TIMESTAMP类型的区别,范围较大的用DATETIME类型,TIMESTAMP类型在根据时区显示,不用换算时间比较有用。

        字符串类型的话,VARCHAR类型比CHAR类型好用,VARCHAR类型范围可变,所以方便,值得注意的是CHAR类型会把输入的空格自动滤掉。TEXT类型和BLOB类型很像,BOLB类型可以存储二进制数据,存储相对大的文件图片、PDF之类的,用BOLB类型。

         ENUM类型和SET类型像一对兄弟,只需形象的记住,ENUM类型是单选,SET类型是多选。

         如果你不习惯命令行程序中去操作MySQL数据库,那你可以在MySQL的官方网站下载一个MySQLWorkbench这样一款由图形操作界面来控制的软件去操作。

         在MySQL中,创建数据库需要通过SQL语句来实现,其实我们学习的目的也是为了学习SQL语句,这样无论你换了其他的数据库,语法可能有差异,操作上可以大同小异。用CREATE DATEBASE 数据库名;来创建,删除数据库的话把CREATE换成DROP就行。

          创建完成数据库之后,我们来学习插入数据。表,是存储数据的基本单位。下面来看两个表:

Information

Id


name



 

Grade

Id


grade


        现在我们在数据库中有两个简易的表,一个信息表,一个成绩表。把成绩表中的id设置为主键,那这个id就变成了唯一的,也就是在输入学生的学号的时候是不能有相同的学号的学生的,学号是学生的唯一标识,在录入成绩的时候,我们同样需要学号,这个时候在输入一遍学号就变得麻烦了,我们可以引用信息表中的学生的学号,而这个时候,成绩表中的id依赖于信息表的id,于是成绩表中的id就变成了外键,并且因为这个外键把信息表和成绩表两个表联系在一起,可以给这个外键起名,也可以不起名,根据自己的需求。信息表中的id和成绩表中的id应该是一一对应的,这也就是外键关联的必须是父表的主键,很好理解。

       设置表的唯一性约束,唯一,顾名思义就是独一无二的,就是说已经设置好的字段不能重复。

       设置表的属性值自动增加,也就是你插入一条新的数据,字段会自动增加1,而你强制插入一个值,MySQL会自动在你设置的这个值上增加。

       设置表的属性的默认值,也就是你插入数据的时候没有给字段指定的值,那么它就会按照你原先设定的默认的值给数据。  


       做了那么多对表的操作,那么怎么了解我们表的结构呢?用DESC 表名; 这条语句来查看表的定义。

       我们已经创建好了几张表,当我们创建的时候忘记了一些需求,或者是增加了新的要求呢?那么就需要修改表。

       修改表名,ALTER TABLE 旧表名 RENAME [TO]新表名 ;当然中间的[TO]可以省略。

       修改字段的数据类型ALTER TABLE 表名 MODIFY 属性名 数据类型 ;用modify的话是不需要重新给字段命名的。

       修改字段名ALTER TABLE 表名 CHANGE 旧属性名 新属性名 新数据类型 ;change语句是需要旧、新两个字段名的,所以很好理解,使用CHANGE修改字段的数据类型,那么就需要把两个相同的字段名放到之后。还有一条需要注意的是,更改的时候,一定要把约束条件在修改的时候加入进去,否则系统不会默认加入未更改的约束条件。

       如果数据需要完善,那就需要增加字段。MySQL中,ALTER TABLE语句增加字段是:ALTERTABLE 表名 ADD 属性名1 数据类型 [完整性约束条件] [FIRST] | AFTER 属性名 2] ;[]之中的根据需要的不同,可以选择省略与否,FIRST顾名思义,在表的第一个位置增加字段,AFTER使用的话,根据需要的位置,在位置的后一个位置增加,如果都没有修饰的话,那就会自动加入到表中的最后一个位置。

       数据中有累赘的地方,那么就需要在表中删除字段,删除字段就是删除已经定义好的表中的某个字段。ALTER TABLE 表名 DROP 属性名 ;

       如果只需要修改字段的排列位置,ALTER TABLE 表名 MODIFY 属性名1 数据类型 FIRST|AFTER 属性名2;道理与增加字段的相同。

删除表。如果没有被关联的普通表,DROP TABLE 表名 ;如果被其他表关联的父表,那么首先就需要删除子表中外键约束,ALTER TABLE 表名 DROP FOREIGN KEY 外键别名 ;然后再删除父表,这时候就可以删除父表了。

       MySQL的字符集有很多,如果表中既有中文,又有英文的话,那么最好使用国际编码utf8,在选择创建数据库时不选择字符集的话,在使用表的时候用default charset = utf8;设置存储字符编码,还有一种方法是ALTER TABLE 表名 convert to charset utf8;课本上是没有介绍的,我们也不推荐这样去做,只是告诉大家补救的方法。

       在创建好表增加字段之后,就需要插入、更新与删除数据了。

       插入数据,插入不在指定具体的字段名INSERT INTO 表名 VALUES(值1,值2…,值n),没有描述的话,插入的数据会根据你插入时候的顺序为表插入数据。

       INSERT语句中列出所有字段,为表插入数据。INSERT INTO 表名(属性1,属性2,…,属性n) VALUES(值1,值2,…,值n);这就是插入的每个值,与你输入的字段对应,这样缺点就是你必须要列出所有字段的名称,当字段多的时候,就会比较冗长,但是优点特征也很明显,那就是不需要按照你表中的定义的顺序来插入数据。

       为表的指定字段插入数据INSERT INTO 表名(属性1,属性2,…,属性m) VALUES(值1,值2,…,值m);这就很好理解,不用过多解释了。

       值得注意的是,没有赋值的字段,数据库系统会为其插入默认值。这个默认值是在创建表的时候定义的。

       一条一条的插入数据是会比较准确,可是效率不会太高,同时插入多条记录,就解决了这个问题。INSERT INTO 表名 [(属性列表)] VALUES(取值列表1) (取值列表2)…,(取值列表n);

       将查询结果插入到表中,INSERT INTO 表名1 (属性列表1) SELECT 属性列表2 FROM 表名2 WHERE 条件表达式;在这里“表名1”参数说明是往哪个表插入数据,“表名2”,是从哪个表中查询出来,“属性列表1”表示为哪些字段赋值,“属性列表2”表示从表中查询出来的那些字段的数据,“条件表达式”参数设置了SELECT语句的查询条件,“*”代表所有字段的数据,比较便捷的表达方式。

       更新数据,UPDATE 表名 SET 属性名1=取值1,属性名2=取值2,…,属性名n=取值n WHERE 条件表达式;MySQL中可没有撤销,一旦更改了数据,那就是永久性的,所以在更新数据之前最好先执行SELECT语句判断满足WHERE条件的纪录是否是确实需要更新的。

       删除数据,DELETE FROM 表名 [WHERE 条件表达式],省略[]中的内容就会删除表中的所有数据。

       更新和删除对数据的破坏性极大,需要引起操作者的注意。

       修改数据的原则,先执行INSERT语句插入数据,在执行UPDATE更新部分数据。


        之前,我们接触到了简单的查询语句,现在开始正式进入查询数据的章节。

基本查询语句,形式如下:

SELECT 属性列表


   FROM 表名和视图列表

   [WHERE 条件表达式]

[GROUP BY 属性名1 [HAVING 条件表达式2]]

[ORDER BY 属性名2 [ASC|DESC]]

属性列表,表示需要查询的字段名,属性名1进行分组,属性名2进行排序,其中ASC参数表示升序,DESC参数表示降序,升序是系统默认的。需要注意的是,单独使用SELECT语句的话,是查询“行”的,加上“WHERE”使用的话,是查询“列”的。

         单表查询,查询所有字段有两种方法,第一种是列出表的所有字段,SELECT 查询字段 FROM 表名;第二种是使用“*”查询所有字段,SELECT * FROM 表名;我们不难发现,第一种方式很灵活,查询的顺序也可以随心所欲,但是字段比较多的情况下就麻烦起来,第二种方式言简意赅,使用起来非常简单,所以根据具体情况不同,选择合适的查询方式才是明智的选择。

          查询指定字段,在属性列表中列出需要查询的字段。

          查询指定记录,WHERE + 条件表达式,指定查询条件。

          带IN关键字的查询,如果不在,前缀加NOT,[NOT] IN (元素1,元素2,…,元素n),IN关键字的使用表示数据在一个集合中,也就是表达某个字段的取值在某个范围中,这个范围是括号里的所有值,需要注意的是,IN是把所需所有元素都写出来,这个范围不是区间!加上NOT的话,就表示不在集合中满足条件,就像集合中的补集。

          带BETWEEN AND的范围查询,[NOT] BETWEEN 取值1  AND取值2,这两个关键字把范围定界的很标准,同时也可以用比较的符号=、<、<=、>、=>、!=,这几个和C语言的用法相同,最为常用。

          带LIKE的字符匹配查询,[NOT]LIKE ‘字符串’,关键字可以匹配字符串是否相等,经常与通配字符一同使用,两种通配字符“%”可以代表任意长度的字符串,所以长度可以为0,“_”只能表示单个字符,连续使用的话可以使查询更精确。在不使用通配符时,LIKE关键字和“=”的作用是一样。如果使用,那么“=”不能代替LIKE完成查询。

         查询空值,IS [NOT] NULL。

         带AND的多条件查询。这个使用的频率很高,因为工作中,我们需要的条件往往不是那么单一,经常需要符合很多条件,这样AND就派上用场了,可以连接更多的条件表达式以应付更多的条件。

         带OR的多条件查询。条件表达式1OR 条件表达式 2 […OR 条件表示n],顾名思义,或者的话,就是满足其中一个查询条件即可。

        使用AND和OR关键字的时候,一定要考虑它们的优先级,不然结果就会大相径庭,AND的优先级高于OR,也就是先执行AND,所以使用的时候考虑清楚。

        查询结果不重复。SELECT DISTINCT 属性名,字段没有唯一性约束,那就加上DISTINCT让你找出来的数据更明显。

       对查询结果排序。ORDER BY 属性名 [ASC|DESC],升序或降序,符合你的心意。


       在MySQL中特有的关键字LIMIT。用LIMIT限制查询结果的数量。查询数据的时候,用户只需要一部分数据,不需要大量全部数据,用LIMIT来控制显示记录的数量,不指定初始位置,LIMIT 记录数,从第一条数据到你限定的个数,如果记录数大于实际纪录的数量,那只会显示全部纪录;指定初始位置的话用LIMIT 初始位置,记录数,初始位置参数是从指定位置开始的,记录数指的是纪录的条数,值得注意的是,第一条纪录的位置是“0”,后面的纪录以此类推。从第几个位置,显示几条纪录,这样就能实现了。“LIMIT 0,2”ó“LIMIT 2”这样是等价的。


       分组查询应该是SQl语句中比较特别的了,GROUP BY关键字可以将查询结果按字段或多个字段进行分组。单独使用GROUP BY关键字来分组,对已有查询结果进行分组,分组后对每组只显示其第一条数据,以说明共有几组,所以group by很特殊,它的主要作用就是用来和集合函数(count)、having子句配合使用,对所有数据进行分组,然后对各分组进行统计,然后提出约束条件选择分组。GROUP BY 负责分组,集合函数负责统计各组内的数据。分组的话,是按照表中的列来分的,查询函数也可以查其他的列。

       GROUP BY加上HAVING 条件表达式,可以限制输出的结果,我们之前接触过WHERE字句,它们很相似,都是来限制显示的,不过有不同的作用,“WHERE 条件表达式”是用于查询一条符合条件的记录的,也就是表的一行,而“HAVING 条件表达式”作用在分组过后组中的符合条件的纪录,区别还是比较大的。

       MySQL中,还可以用GROUP BY按多个字段来分组,也就是先按条件分一个组,在按第二个条件在第一个组的基础上继续分组,以此类推。

       GROUP BY关键字还可以和WITH ROLLUP一起使用,这样查询完成后会增加一条纪录,来记录每组纪录的总和。

       使用集合函数查询,可以用COUNT()函数统计纪录的总数,与GROUP BY联合使用的话,在()中写入查询的字段,可以针对需要的组来统计数据的总数,用SUM()函数来求出需要字段的总和,AVG()函数求平均值,MAX()函数求最大值,MIN()函数求最小值,刚才一直强调GROUP BY和集合函数是一对“黄金搭档”,一起使用可以发挥更大的作用。


         连接查询是将两个或两个以上的表按公共字段连接起来,从中选取需要的数据。分两种,内连接查询,就是两个表中根据公共字段连接两个表,字段值相同,就查询出纪录。外连接查询,可以查询有公共字段的多个表,字段取值不相等的时候,系统会自动在不匹配的地方帮你补充NULL,为你显示一张表。外连接查询包括左查询和右查询,就是根据显示的顺序不同来定义的,语法如下:

SELECT 属性名列表

                   FROM 表名1 LEFT|RIGHT JOIN 表名2

                   ON 表名1.属性名1 = 表名2.属性名2 ;

根据查询表的顺序不同,左右连接也可以相互转换。

       子查询就是一种嵌套查询。内层的查询结果,为外层查询语句提供查询条件。

       带IN关键字的子查询,一个SELECT语句查询的结果在另一个查询条件的范围中,可以通过IN关键字来判断,需要注意的是,当查询的结果是一段数据的时候,IN和“=”是不能互相替代的,只有当内层查询是一个数据的时候,IN和“=”的作用才是相同的。

       带比较运算符的子查询。用比较运算符去选择更合适的条件去查询。

       带EXISTS关键字的子查询。EXISTS关键字表示存在,内层查询语句不返回查询的纪录,而返回一个真假值。查询到符合条件的数据,返回true,外层继续查询,返回false时,不进行。


       带ANY关键字的子查询。使用ANY关键字,表示满足任一条件,内层查询语句返回的结果任何一个,可以通过外层查询语句查询。

       带ALL关键字的子查询。ALL关键字表示满足所有条件,只有这样,才执行外层查询条语句。

       合并查询结果。使用UNION关键字,数据库系统会将所有的数据不重复的查询结果合并到一起, UNION ALL是全部合并。语法如下:

SELECT 语句1

   UNION | UNIONALL

SELECT 语句2

   UNION | UNIONALL…

SELECT 语句n ;需要的语句合并到一起。

       为表取别名,这样的目的是把复杂的表名化成简单的表名,改名之后,在SELECT语句中查询只能使用别名,原来的表名已经失效。

       为字段去别名,把简单的字段名改变成容易用户理解的名字,方便阅读。改变之后,原来的字段名和现有的别名都能用,字段别名只能在SELECT之后、FROM之前使用,不能用于WHERE子句。


       一般取别名都可以用空格隔开,然后后面跟上要起得新名字,只不过我们习惯上,为表取别名就照这样的格式,为字段去别名加上AS关键字,用以区分。


       下面我们来学习一个比通配字符的查询能力更强大,更灵活的方式——正则表达式。在MySQL中,使用REGEXP关键字来匹配查询正则表达式,形式:属性名 REGEXP  ‘匹配方式 ’。

       查询以特定字符或字符串开头的纪录。使用字符“^”加上需要查询的字符开头。

       查询以特定字符或字符串结尾的纪录。字母结尾加上字符“&”。

       用符号“.”来代替字符串中任意一个字符。以“^”开头,以“&”结尾,中间有几个字符就使用几个“.”。

       匹配指定字符中的任意一个。使用方括号([])将需要查询字符组成一个字符集。正则表达式简洁强大,匹配字母不需要用符号隔开,甚至空格也不需要。匹配一个范围,使用“-”就代表一个范围了。

       匹配指定字符串。正则表达式可以匹配字符串,放入单引号中,指定多个字符串的话,匹配任意一个,使用“|”来分隔需要的字符串。

       使用“*”和“+”来匹配多个字符。正则表达式中,使用“*”代表0个或多个字符,“+”代表至少一个字符,在这里值得注意一下,教材上的实例有些不完整,如果表示一个字符前至少有一个字符的话,应该与“.”配合使用。

       使用{M}或者{M,N}来指定字符串连续出现的次数。“字符串{M}”表示字符串连续出现M次,“字符串{M,N}”表示字符串连续出现至少M次,最多N次。查询出现重复字符串的个数,非常灵活,贴近生活。教材上有一些问题在使用上,字符串最好用“()”来包围起来,不然根据结合的不同,查询出来的结果出入会变得很大。

       从刚才的介绍中不难看出正则表达式的强大,而且使用它可以灵活的设置字符串匹配的条件。不仅在MySQL中,Java语言、C#语言、PHP语言和Shell脚本语言都使用正则表达式,由此可以看出它的重要。


       之后我们来学习新的一章知识——索引。索引是一种特殊的数据结构,由表中的一列或多列组合而成,其实书上也没有明确的定义索引究竟是什么东西,我们只需知道它的作用是提高对表中数据的查询速度。

       索引有很显著的优点,那就是可以提高检索数据的速度,缺点也很明显,创建和维护索引需要耗费时间。

       索引分为六类:1.普通索引、2.唯一性索引、3.全文索引、4.单列索引、5.多列索引、6.空间索引。一般我们把重点放在1~3的索引,4、5两种实际上可以是前面的3种任意一种或几种组合,6对于初学者很少用到。

       普通索引,即不加任何限制条件的索引。

       唯一性索引,使用UNIQUE参数设置索引的唯一性,限制该索引的值也必须是唯一的。

       以上两种索引适用的字段是数值。

       全文索引,使用FULLTEXT参数可以设置索引为全文索引,只能在创建CHAR、VARCHAR或TEXT类型的字段上,查询数据量较大的字符串类型的字段,可以提高查询速度。

       单列索引,就是在表中的单个字段上创建索引。

       多列索引,就是在表中的多个字段上创建索引,需要注意的是,只有查询条件中使用了这些字段中第一个字段才会被使用。

       空间索引,使用SPATIAL参数设置为空间索引。

       为了把索引的使用效率变得更高,必须考虑合适的方式,索引有设置原则:

1.      选择唯一性索引,可以快速确定纪录。

2.      为经常需要排序、分组和联合操作的字段建立索引,有效避免排序。

3.      为常作为查询条件的字段建立索引,这样可以提高整个表的查询速度。

4.      限制索引的数目,每个索引都占用磁盘空间,越少越快。

5.      尽量使用数据量少的索引。

6.      尽量使用前缀来索引。

7.      删除不再使用或者很少使用的索引。

       选择索引还是为了使查询的速度更快,以上的原则要灵活运用。

       然后我们来看看如何创建索引。

       创建表的时候创建索引,这种方式更简单。基本形式:

CREATE TABLE 表名 (……

[UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY

[别名](属性名1 [(长度)][ASC|DESC])

);

       UNIQUE可选,顾名思义,FULLTEXT为全文索引,SPATIAL为空间索引,INDEX和KEY参数指定字段,作用相同,别名可以取名称,索引也可以升降序。也可以在已经存在的表中创建索引。还可以用ALTER TABLE语句来创建索引。

       有索引的情况下插入数据是相对慢的,最好的方式先删除索引,然后插入数据,最后新建索引。删除索引使用DROP INDEX 索引名 ON 表名;


         我们接下来看一个新的内容——视图。


  视图由数据库中的一个表或多个表导出的虚拟表,它是来代替复杂的SELECT语句的,定义视图为复杂语句,然后直接查询视图,可以简化SELECT语句。视图可以隐藏表的部分信息,这样保护数据的安全,还可以屏蔽原来表结构变化带来的影响,提高表的逻辑独立性。

         创建视图通过SQL语句CREATE VIEW实现,之前我们一直没有详细的介绍如何观察语法格式,[]内的内容是可有可无的,用|相隔的内容,是“或者”的关系,可以任取其一,{}只是把分散的一些值圈起来。

CREATE [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]

VIEW 视图名[(属性清单)]

AS SELECT语句

[WITH [CASCADED|LOCAL] CHECK OPTION];

以上就是创建视图的语法形式,ALGORITHM表示试图选择的算法;WITH CHECK OPTION保证更新视图时在该视图的权限范围之内。

         ALGORITHM包括3个选择,UNDEFINED表示MySQL将自动选择要使用的算法、MERGE表示视图语句与定义合并起来和TEMPTABLE表示将视图存入临时表,然后使用临时表去执行语句。

         CASCADED是可选参数,表示更新视图时要满足所有相关视图和表的条件,该参数为默认值;LOCAL表示更新视图时,要满足定义的条件。

         视图的左右总结有以下四点:

  第一点:使用视图,可以定制用户数据,聚焦特定的数据。

  解释:在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话,

采购人员,可以需要一些与其有关的数据,而与他无关的数据,对他没

有任何意义,我们可以根据这一实际情况,专门为采购人员创建一个视

图,以后他在查询数据时,只需select * from view_caigou 就可以了。

  第二点:使用视图,可以简化数据操作。

  解释:我们在使用查询时,在很多时候我们要使用聚合函数,同时还要

显示其它字段的信息,可能还会需要关联到其它表,这时写的语句可能

会很长,如果这个动作频繁发生的话,我们可以创建视图,这以后,我

们只需要select * from view1就可以了,很方便。

  第三点:使用视图,基表中的数据就有了一定的安全性

  因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以

将基表中重要的字段信息,可以不通过视图给用户,视图是动态的数据的集

合,数据是随着基表的更新而更新。同时,用户对视图,不可以随意的更改

和删除,可以保证数据的安全性。

  第四点:可以合并分离的数据,创建分区视图。

  随着社会的发展,公司的业务量的不断的扩大,一个大公司,下属都设有很

多的分公司,为了管理方便,我们需要统一表的结构,定期查看各公司业务

情况,而分别看各个公司的数据很不方便,没有很好的可比性,如果将这些

数据合并为一个表格里,就方便多了,这时我们就可以使用union关键字,

将各分公司的数据合并为一个视图。

         在多表上创建视图,也就是在SELECT语句中用上连接查询。

         查看视图,就和查看表的格式是一样的,只不过把TABLE换成VIEW,查询的语句都相仿。

         在MySQL中,使用CREATE ORREPLACE VIEW语句修改视图,视图存在就进行修改,视图不存在,那就创建视图,所有参数和创建视图的参数是一样的。

         ALTER语句可以修改表的定义,也可以创建索引,还可以作用于视图,参数和创建视图相同。

         更新视图是指通过插入、更新和删除表中的数据,视图是一张虚拟的表其中当然没有数据,更新实际上转到基本表来完成操作。更新视图,超出更新视图权限的数据也不能完成更新。

         视图中包涵函数、UNION、UNION ALL、DISTINCT、GROUP BY、HAVING等关键字、常量、子查询、由不可更新的视图导出的视图、临时表ALGORITHM为TEMPTABLE、视图对应的表存在没有默认值的列,这些都不能使视图完成更新。

         WITH[CASCADED|LOCAL]CHECKOPTION也同样决定视图能否更新,LOCAL表示更新满足视图本身定义,CASCADED表示满足所有相关视图和表的条件。

         删除视图,使用DROPVIEW来删除视图,只能删除视图的定义,不会删除数据,DROP VIEW [IF EXISTS] 视图名列表 [RESTRICT|CASCADE],IF EXISTS判断视图是否存在,存在就删除,不存在则不会执行。


         接着,我们来学习一下触发器。触发器是由INSERT、UPDATE和DELETE等事件来触发某种特定操作,满足触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。

         在MySQL中,创建只有一个执行语句的触发器的基本形式如下:

         CREATETRIGGER 触发器名 BEFORE|AFTER 触发事件

                            ON 表名 FOR EACHROW 执行语句

“BEFORE”指触发事件之前执行触发语句,“AFTER”则表示之后,FOR EACH ROW表示任何一条记录上的操作满足触发事件就会触发。

         创建有多个执行语句的触发器,

CREATE TRIGGER 触发器名BEFORE|AFTER 触发事件

ON 表名 FOR EACH ROW

BEGIN

执行语句列表

END

BEGIN和END就像{}的作用一样,表示一个语句块。不同的执行语句之间用分号隔开,创建触发器的过程需要用到“;”,当用户在BEGIN和AND之间执行多条语句,“;”很容易影响数据库的识别,为了避免这种情况,用命令DELIMITER,来把MySQL的默认结束执行语句的“;”改成“&&”,最后记得创建触发器之后,再次使用命令改回来。

         需要注意的是,一个表在相同触发事件的相同触发事件,只能创建一个触发器。

         创建好触发器之后,我们可以查看触发器,SHOW TRIGGERS ;查看只能查询全部的触发器。

         在MySQL中,所有触发器的定义都存在informantion_schema数据库吓得triggers表中,查询tiggers表,SELECT  * FROM information_schema.triggers ;查询数据库中触发器的详细信息。

         触发器执行的顺序是BEFORE触发器、表操作(INSERT、UPDATE和DELETE)、AFTER触发器。

         不再使用的触发器,使用DROPTRIGGER 触发器名 ;来删除触发器,防止造成数据的变化。为了确定删除的情况,还可以到数据库informantion_schema下的TRIGGER_NAME中再次确认。

  现在学习MySQL其实学习的也是SQL语句,当前阶段只要学好SQL语句就很棒了。