1.数据库:存放有组织的数据的容器。(注意区分:数据库与数据库软件(DBMS))
2.表:一种结构化的文件,可以用来存储特定类型的数据。(某种特定类型的数据的结构化清单)表由列组成,列中存储着表中的某部分信息。
3.模式(schema):关于数据库和表的布局及特性的信息。
4.列(column):表中的一个字段,所有的表都是有一列或多列组成。
5.数据类型:数据库中每一列都有对应的数据类型,数据类型表明该列可以存储的数据种类。数据类型限制可存储在列中的数据种类。
6.行:表中的一条记录。表中的数据是按行存储的,所保存的每条记录都保存在自己的行内。(注:在很大程度上,行和记录是通用的。)
7.主键(primary key):一列(或多列),其值能够唯一区分表中每一行。唯一标识表中的每行的这个列或这组列称为主键。
列作为主键的条件:1)任意两行都不具有相同的主键值。 2)每个行都必须有一个主键值(主键列不允许为空)
主键的好习惯:1)不更新主键列中的值 2)不重用主键列的值 3)不在主键列中使用可能会更改的值
8.SQL:Structured Query Language。专门用来与数据库通信的语言。SQL语句不区分大小写,但标识符可能区分。(注:开发过程中一般SQL关键字大写,表明、列名小写。)
9.MySQL是一种DBMS,其优点:1)成本(开源,免费使用 ) 2)性能(执行快) 3)可信赖(许多大公司在用)
4)简单(易于安装和使用) 缺点:不总是支持其他DBMS提供的功能和特性
10.DBMS分两类:一类为基于文件共享系统的DBMS(Access FileMaker)。另一类为基于客户机服务器上的DBMS(MySQL、SQLServer、Orcale)。
11.客户机-服务器应用分两个部分:服务器部分负责数据的访问和处理,运行在被称为数据库服务器的计算机上。客户机部分主要发出请求或更改。
12.mysql命令行实用程序:1)命令输入在mysql>之后。 2)命令用分号;或\g结束。 3)输入help或\h获得帮助。4)输入qiut或 exit退出命令行实用程序。
13.MySQL Administrator(MySQL管理器):是一个图形交互客户机,用来简化MySQL服务器的管理。MySQL Query Browser:编写和执行MySQL命令。
14.常用基本命令:1)USE关键字:用于选择一个数据库。 2)SHOW:显示内部表的一些信息。SHOW DATABASES:返回可用数据库的一个列表。SHOW TABLES:返回一个数据库内的表的列表。SHOW COLUMNS FROM tableName(DESCRIBE tableName):对表中的每一个字段返回一行。SHOW STATUS:用于显示广泛的服务器状态信息。 SHOW CREATE DATABASE或SHOW CREATE TABLE:显示创建特定数据库或表的MySQL语句。 SHOW GRANTS:用来显示授权用户的安全权限。SHOW ERRORS和SHOW WARNINGS:用来显示服务器错误或警告消息。
15.检索数据:1)检索单个列:SELECT columname FROM tablename;2)多列检索:SELECT columname1, columname2, columname3,...... FROM tablename;3)检索所有列:使用通配符*。SELECT * FROM tablename
4)检索不同行:使用DISTINCT,SELECT DISTINCT columname FROM tablename;5)限制结果:SELECT columname FROM tablename LIMIT num 返回不多于num行的记录;SELECT columname FROM tablename LIMIT num1,num2;num1检索的开始行,num2要检索的行数。6)使用完全限定的表名:SELECT tablename.columname FROM tablename;
16.子句(clause):一个子句通常由一个关键字和所提供的数据组成。关系数据库设计理论认为:如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有意义。
17.排序检索数据:1)SELECT columname FROM tablename ORDER BY sortcondition;2)按多个条件排序:SELECT columname FROM tablename ORDER BY sortcondition1,sortcondition2;3)指定排序方向:ASC升序排列 DESC降序排列(注:ASC DESC只应用到直接位于其前面的列名。如果想对多个列进行降序排列,需要对每个条件指定DESC关键字) 注:如果使用LIMIT关键字应位于ORDER BY之后。
18.过滤数据:1)使用WHERE 子句:SELECT columname FROM tablename WHERE condition;WHERE 子句操作符:=、!=、<>、>=、<=、<、>、BETWEEN。2)检查单个值:SELECT columname FROM tablename WHERE condition 3)不匹配检查: WHERE子句中使用<> 、!=。3)范围检查:WHERE子句中使用BETWEEN。4)空值检查:WHERE子句中使用 IS NULL。
19.数据过滤:操作符:用来连接或改变WHERE子句中的子句的关键字(也称为逻辑操作符)。1)AND操作符:用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。2)OR操作符:指示MySQL检索匹配任一给定条件的行。3)计算次序:AND操作符的计算次序比OR高,为了防止计算次序发生错误,可以使用圆括号明确地分组相应的操作符。3)IN操作符:用来指定条件范围,范围中的每一个条件都可以进行匹配。SELECT columname FROM tablename WHERE columnname IN(condition1,condition2,...)。IN操作符的有点:(1)在使用长的合法选项清单时,IN操作符的 语法更清楚且更直观。(2)在使用IN时,计算的次序更容易管理(3)IN操作符比OR操作符清单执行更快(4)IN的最大优点是可以包含其他SELECT语句,使得能更动态的建立WHERE子句。IN WHERE 子句中用来指定要匹配值的清单的关键字,功能与OR相同。4)NOT操作符:用来否定后跟条件的关键字。
20.用通配符进行过滤: 通配符:用来匹配值得一部分特殊字符。搜索模式:有字面值、通配符或两者组合构成的搜索条件。通配符本身实际是SQL的WHERE子句中有特殊含义的字符。1)LIKE操作符:在搜索子句中使用通配符,必须使用LIKE操作符。2)百分号(%)通配符:在搜索串中%表示任何字符出现任意次数。通配符可以在搜索模式中任意位置使用,并且可以使用多个通配符。注意:(1)尾空格可能会干扰通配符。(2)注意NULL,通配符不匹配NULL值。3)下划线(_)通配符:只匹配单个字符。
21通配符使用技巧:1)不要过度使用通配符。 2)在确实需要使用通配符时,除非必要,否则不要把通配符放在搜索模式的开始处。3)注意通配符的位置。
22.用正则表达式进行搜索:正则表达式是用来匹配文本的特殊的串(字符集合)。正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。1)基本字符匹配:SELECT columnname FROM tablename WHERE field REGEXP '匹配内容' 。点(.)是正则表达式语言中一个特殊字符,表示匹配任意一个字符。MySQL正则表达式匹配(自版本3.23.4)不区分大小写。LIKE与REGEXP区别:LIKE匹配整个列,如果被匹配的文本在列值中出现,LIKE将不会找到它,对应的行也不会被返回(除非使用通配符),而REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。2)进行OR匹配。SELECT columnname FROM tablename WHERE field REGEXP '匹配内容1|匹配内容2' 。|为正则表达式的OR操作符,它表示匹配其中之一。3)匹配几个字符之一。通过指定一组用[]括起来的字符完成。字符集合的否定:在集合的开始出放置一个^([^被否定内容])。4)匹配范围。[1-9] [a-z] 5)匹配特殊内容:为了匹配特殊字符,必须使用\\为前导。\\也用来引用元字符(具有特殊含义的字符),注空白元字符:\\f:换页 \\n :换行 \\r:回车 \\t :制表 \\v:纵向制表。 \\\表示匹配\。5)匹配字符类:预定义的字符集
6)匹配多个实例
eg: SELECT * FROM tablename where clause regex '^[[:digit:]]{4}':匹配连在一起的四位数字。
7)定位符 :用于匹配特定字符的文本。
eg: SELECT * FROM tablename where clause regex '^[0-9//.]'。^两重作用:在集合中用来否定集合,否在用来制定串的开始处。LIKE和REGEXP的区别在于,LIKE匹配整个串,而REGEXP匹配字串,通过用^开始每个表达式,$结束每个表达式,可以使REGEX与LIKE的作用一样。REGEXP检查总是返回0(未匹配)或1(匹配)。
23计算表达式:(1)字段(field)基本上与列(column)的意思相同,经常互换使用,不过数据库的列一般称为列,而字段通常用在计算字段的连接上。(2)拼接:将值连接到一起构成单个值。在MySQL的SELECT语句中,使用Concat来拼接两个列。(注:多数DBMS使用+或||实现拼接)。eg:SELECT Concat(column1,'(',column2,')') FROM tablename .Concat()拼接串,即把多个串连接起来成为一个较长的串。(3)RTrim去掉值右边的空格。Trim去掉串左右两边的空格。LTrim去掉串左边的空格。(4)别名(alias):一个字段或值得替换名。别名有时候也称为导出列。(5)MySQL支持的算术运算:+、-、*、/。注:省略FROM字句的SELECT可以用来进行简单的测试,如正则表达式测试、算术运算测试等。
24.使用数据处理函数:(1)能运行在多个系统上的代码称为可移植的(portable)。(2)常用的文本处理函数:Upper():将文本转化为大写。Left():返回串左边的字符。Length():返回串的长度。Locate():找出串的一个字串。Lower():将串转换为小写。LTrim():去除串左边的空格。Trim():去除串左右两边的空格。RTrim():去除串右边的空格。Soundex():返回串的SOUNDEX的值。SOUNDEX是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。SubString():返回字串的字符。(3)日期和时间处理函数:
MySQL使用日期的格式:无论什么时候指定一个时期,日期格式必须为:yyyy-mm-dd。
(4)数值处理函数:
25.汇总数据:(1)聚集函数:运行在行组上,计算和返回单个值得函数。
COUNT(*):对表中行的数目进行计数,不管列值是否为空。使用COUNT(column):对特定列表中具有值的行进行计数,忽略NULL值。MAX()函数忽略列值为NULL的行。MIN()函数忽略列值为NULL的行。MySQL 5及后期版本 可以如下使用:对所有的行执行计算,指定ALL参数或不给参数。只包含不同的值,指定DISTINCT参数。如果指定列名,DISTINCT只能用于COUNT()。
聚集函数可以组合使用。
26分组数据:(1)创建分组:分组是在SELECT语句的GROUP BY子句中建立的。关于GROUP BY的规定:GROUP BY子句可以包含任意数目的列;如果在GROUP BY子句嵌套了分组,数据将在最后规定的分组上进行汇总;GROUP BY子句列出的每个列都必须是检索列或有效的的表达式;除聚集计算语句外,SELECT语句中的每一个列都必须在GROUP BY子句中给出;如果分组列中具有NULL值,则NULL将作为一个分组返回,如果列中有多行NULL值,它们将分为一组。GROUP BY 子句必须出现在WHERE子句之后,ORDER BY子句之前。使用WITH ROLLUP关键字可以得到每个分组以及每个分组汇总级别的值。(2)过滤分组:HAVING子句用于过滤指定分组。WHERE过滤行,HAVING过滤分组。HAVING支持所有WHERE操作符。HAVING与WHERE的差别:WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。WHERE排除的行不包括在分组中。(3)分组与排序:GROUP BY与ORDER BY的区别:
(4)SELECT子句的顺序:
26.子查询:MySQL从4.1版本引入了对子查询的支持。子查询是指嵌套在其他查询中的查询。在SELECT中子查询总是从内向外执行。相关子查询:涉及外部查询的子查询。在WHERE子句中使用子查询,应该保证SELECT语句具有与WHERE子句中相同数目的列。子查询一般与IN操作符结合使用,但也可以用于测试等于(=)、不等于等。如果列名可能有多义性,必须使用完全限定列名。用子查询建立查询(或测试)的最可靠方法是,逐行进行。首先建立和测试最内层的查询,然后用硬编码数据建立和测试外层查询,并且仅在确认它正常后才嵌入子查询。
27.联接表:关系表的设计就是要保证把信息分解成多个表,一类数据一个表,各表通过某些常用的值(即关系设计中的关系)互相关联。外键:外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。(1)创建联接:eg:SELECT table1.column1, table1.column2,table2.column1, table2.column2 FROM table1,table2 where table1.column=table2.column (2)等值连接:基于两个表之间的相等测试,也称为内部联接。eg:SELECT table1.column1, table1.column2,table2.column1, table2.column2 FROM table1 INNER JOIN table2 ON table1.column=table2.column。
28.高级联接:(1)给表名起别名的用途:缩短SQL语句;允许在单条SELECT语句中多次使用相同的表。表别名只在查询执行中使用,与列别名不同,表别名不返回到客户机。(2)自连接:使用表别名的主要原因是能在单条SELECT语句中不止一次引用相同的表。eg:SELECT t1.column1, t2.column3 FROM table AS t1,table AS t2 WHERE t1.column=t2.column AND t2.column="字段值";(3)自然联接:自然联接排除多次出现,使每个列只返回一次。eg:SELECT t1.*, t2.column[1..n],t3.column[1..n] FROM table1 AS t1,table2 AS t2, table3 AS t2 WHERE t1.column=t2.column AND t2.column=table3.column and t[i].column="字段值";(4)外部联接:联接包含了那些在相关表中没有关联行的行,这种联接称为外部联接,eg:SELECT table1.column1,table2.column1, FROM table1 RIGHT OUT JOIN table2 ON table1.column=table2.column.(注:MySQL不支持*=和=*。)存在两种基本类型的外部联接,左外部联接和右外部联接,它们之间唯一的差别是所关联的表的顺序不同。(4)联接及其使用要点:注意所使用的联接类型;保证使用正确的联接条件;应该总是提供联接条件;在一个联接中可以包含多个表,甚至对于每个联接可以使用不同的联接类型。
29.组合查询:(1)使用组合查询的二种基本情况:在单个查询中,从不同的表返回类似结构的数据;对单个表执行多个查询,按单个查询返回数据。(注:任何具有多个WHERE子句的SELECT语句都可以作为一个组合查询给出。)(2)创建组合查询:利用UNION,可给出多条SELECT语句,将它们的结果组合成单个结果集。UNION指示MySQL执行两条或两条以上SELECT语句,并把输出组合成单个查询结果集。eg:SELECT * FROM table1 UNION SELECT * FROM table2.UNION规则:UNION必须由两条或两条以上的SELECT语句组成,语句间用关键字UNION分割;UNION中的每个查询必须包含相同的列、表达式或聚集函数;列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐士转换的。(注:UNION ALL 返回所有匹配行,UNION从查询结果中自动去除了重复的行。UNION ALL为UNION的一种形式,它完成了WHERE 子句完成不了的工作。)在使用UNION组合查询时,只能使用一条ORDER BY语句,它必须出现在最后一条SELECT语句之后。
30.全文本搜索:(1)并非所有的数据库引擎都支持全文本搜索,两个最常使用的引擎:MyISAM和InnoDB,前者支持全文本搜索,后者不支持。为了进行全文本搜索必须索引被搜索的列,而且要随着数据的改变不断的重新索引。(2)一般在创建表时启用全文本搜索。eg:CREATE TABLE tablename(
声明字段
FULLTEXT(列名)
)ENGINE=MyISAM;(注:在导入数据时不要使用FULLTEXT),索引之后使用函数 Match和Against()执行全文本搜索,Match()制定要搜索的列,Against()制定要使用的表达式。eg:SELECT column FROM table WHERE Match(要搜索的列) Against(搜索表达式) 注意:传递给Match()的值必须与FULLTEXT中定义的相同,如果指定多个列则必须按照次序列出它们。除非使用BINARY方式,否则全文本搜索不区分大小写。全文本搜索的一个重要部分就是对结果排序,具有较高等级的行先返回。如果指定多个搜索项,则包含多数词的那些行将比包含少数词的那些行高的等级。查询扩展用来设法放宽所返回的全文本搜索结果的范围。在使用查询扩展时,MySQL对数据和索引进行两遍扫描完成搜索:首先进行基本的全文本搜索,找出与搜索条件匹配的所有行;其次,MySQL检查这些匹配行,并选择所有有用的词;再其次,MySQL再次进行全文本搜索,这次不仅使用原来的条件而且还使用所有用的词。(3)布尔文本搜索:以布尔方式,可以提供如下内容:要匹配的词,要排斥的词,排列提示,表达式分组,另外一些内容。
eg:SELECT column FROM table WHERE Match(要搜索的列) Against(搜索表达式 IN BOOLEAN MODE)
(4)全文本搜索的使用说明:在索引全文本数据时,短词被忽略且从索引中排除(短词被定义为那些具有三个或三个以下字符的词);MySQL带有一个内建的非用词(stopword)列表,这些词在索引全文本数据时总是被忽略;许多词出现的频率很高搜索他们没有用处,因此MySQL规定了一条50%规则,如果一个词出现在50%以上的行中,则将它作为一个非用词忽略,50%规则不用于IN BOOLEAN MODE;如果表中的数据少于三行,则全文本搜索不返回结果;忽略词中的单引号;不具有词分隔符的语言不能恰当的返回全文本搜索结果;仅在MyISAM数据库引擎中支持全文本搜索。
31.插入数据:(1)INSERT是用来插入(或添加)行到数据库表的。插入的方式:插入完整的行;插入行中的一部分;插入多行;插入某些查询的结果。(2)插入完整的行:eg:INSERT INTO table VALUES(value1,value2,....,value n);(注:各个列必须以他们在表定义中出现的次序填充) .eg:INSERT INTO table(column1,column2,...,column n) VALUES(value1,value2,....,value n),省略的列必须满足:该列定义为允许NULL值或在表定义中给出默认值。(3)插入多行:.eg:INSERT INTO table(column1,column2,...,column n) VALUES(value1,value2,....,value n),(value1,value2,....,value n)...;(4)插入检索出的数据
eg:INSERT INTO table(column1,column2,...,column n) SELECT column1,column2,...,column n FROM table2.
32.更新和删除数据:(1)更新有两种方式:更新表中的特定行;更新表中的所有行。UPDATE语句的组成:要更新的表;列名和它们的新值;确定要更新的过滤条件。eg:UPDATE table[IGNORE] SET column=“新值”[column2="新值2",...] WHERE 过滤条件。如果使用IGNORE关键字即使发生错误也继续进行更新。删除某个列的值可以通过把该列的值设置为NULL实现。(2)删除数据:从一个表中删除数据使用DELETE语句,删除分为:从表中删除特定的行和删除表中所有的行。eg:DELETE FROM table WHERE 删除条件。(注1:DELETE删除的是表中的行而不是表本身.注2:如果想从表中删除所有的行可使用TRUNCATE TABLE语句,效率比DELETE更高一些。TRUNCATE实际是删除原来的表并重新创建一个表,而不是逐行删除表中的数据。)(3)更新或删除的指导原则:i:除非确实打算更新或删除每一行,否则绝对不要使用不带WHERE子句的DELETE或UPDATE语句。ii:保证每个表都有主键,尽可能像WHERE子句那样使用它。iii:在对UPDATE或DELETE语句使用WHERE子句前,应先用SELECT进行测试确保它过滤的是正确的记录。iv:使用强制实施引用完整性的数据库,这样MySQL将不允许删除具有与其他表相关联的数据的行。
33.创建和操纵表:(1)创建表的两种方法:使用具有交互式创建和管理表的工具或直接使用MySQL语句创建。创建表必须给出的信息:新表的名字,在关键字CREATE TABLE之后给出;表列的名字和定义,用逗号分割。eg:CREATE TABLE table (
column1 dataType NULL|NOT NULL AUTO_INCREMENT ,
column2 dataType NULL|NOT NULL ,
.....
column n dataType NULL|NOT NULL ,
PRIMARY KEY(column)
)ENGINE=引擎名;如果仅想在一个表不存在时创建,可在表明后给出IF NOT EXISTS进行判断。(2)使用NULL值:NULL值就是没有值或缺值,允许NULL值得列允许在插入行时不给出该列的值,不允许NULL值的列不接受该列为NULL值得行。NULL值是没有值,不是空串,如果指定''(两个单引号)这在NOT NULL中是允许的,空串是一个有效的值。(3)主键:主键值必须唯一,如果主键使用单个列。则它的值必须唯一,如果使用多个列,则这些列的组合值必须唯一。主键只能使用不允许为NULL值得列。eg:PRIMARY KEY(column1,column2,...)。(4)AUTO_INCREMENT:每个表只允许一个AUTO_INCREMENT列,而且它必须被索引。(5)指定默认值:默认值用CREATE TABLE语句的列定义中的DEFAULT关键字指定。MySQL不允许使用函数作为默认值。(6)引擎类型:不同的引擎具有不同的功能和特性,为不同的任务选择正确的引擎能获得良好的功能和灵活性。MySQL默认引擎是MyISAM。常用引擎:i:InnoDB是一个可靠的事务处理引擎,它不支持全文本搜索。ii:MEMORY在功能上等同MyISAM,但由于数据存储在内存中,速度很快。iii:MyISAM是一个性能极高的引擎。它支持全文本搜索,但不支持事务处理。引擎可以混用但外键不能跨引擎,即使使用一个引擎的表不能引用具有不同引擎的表的外键。(7)更新表:更新表定义使用ALTER TABLE语句。使用ALTER TABLE更新表必须给出:要更改的表名和所做更改的列表。添加:ADD,删除:DROP.(8)删除表:DROP TABLE 语句。(9)重命名表:RENAME TABLE oldname TO newname;
34.视图:(1)视图是虚拟的表,视图只包含使用时动态检所数据的查询。(注:MySQL 5 才开始支持视图)视图的作用:i:重用SQL语句。ii:简化复杂的SQL操作。iii:使用表的组成部分而不是整个表。iv:保护数据。iiv:更改数据格式和表示。(注:视图本身不包含数据,因此它们返回的数据是从其他表中检索出来的在添加或更改这些表中的数据时视图将返回改变过的数据。)
(2)视图的规则和限制:i:视图必须唯一命名。ii:对可以创建的视图数目没有限制。iii:必须有足够的权限。iv:视图可以嵌套。iiv:ORDER BY 可以用在视图中,但如果从该视图检索数据SELECT中也含有ORDER BY,那么该视图中的ORDER BY将会被覆盖。v:视图可以和表一起使用。(3)创建视图用:CREATE VIEW viewname语句。使用:SHOW CREATE VIEW viewname查看创建视图的语句。使用:DROP VIEW viewname删除视图。更新视图时可以先用DROP再用CREATE ,也可以直接用CREATE OR REPLACE VIEW ,如果视图不存在则创建一个视图,如果视图存在则替换原来的视图。 (4)如果从视图检所数据时 使用了一条WHERE 子句,则两组子句将自动组合。(5)更新视图:视图是否可更新视情况而定,通常视图是可更新的,更新一个视图将更新其基表,对视图进行增加或删除行,其实是对基表增加或删除行。并非所有的视图都是可更新的,如果MySQL不能正确的确定被更新的基数据,则不允许更新。如果视图中定义有以下操作则不能进行更新:分组、联接、子查询、并、聚集函数、DISTINCT、导出(计算)列。(注;一般应将试图用于检索。)
35.存储过程:(1)MySQL 5支持了对存储过程的支持。存储过程:简单的将就是为了以后的使用而保存的一条或多条SQ语句的集合。可将其视为批文件,但它们的作用不限于批处理。使用存储过程的原因:i:通过把处理封装容易使用的单元中,简化复杂的操作。ii:由于不要求反复建立一系列处理步骤,这保证了数据的完整性。如果所有开发人员和应用程序都使用同一存储过程,则所使用的代码都是相同的。iii:简化对变动的管理。iv:提高性能。v:存在一些只能用在单个请求中的MySQL元素和特性,存储过程可以使用它们来功能更强、更灵活的代码。存储过程的好处简单讲就是简单、安全、高性能。缺点:v:存储过程的编写比基本SQL语句复杂。vi:创建存储过程的权限限制。(2)使用存储过程:MySQL称存储过程的执行为调用,因此MySQL执行存储过程的语句是CALL.CALL接受存储过程的名字以及需要传递给他的任意参数。删除存储过程:DROP PROCEDURE procedurename。如果指定的存储过程不存在会报错,可用DROP PROCEDURE IF EXISTS.一般存储过程不显示结果而是把结果返回给指定的变量。关键字OUT指出相应的参数用来从存储过程传出一个值,MySQL支持IN(传递给存储过程)、OUT(从存储过程传出)和INOUT(对存储过程传入传出)类型的参数。(注:存储过程的参数允许的数据类型与表中使用的数据类型相同,记录集是不允许的类型,不能通过一个参数返回多个行和列。)所有的MySQL变量都必须以@开头。SHOW PROCEDURE STATUS列出所有存储过程。
36游标:(1)MYSQL 5添加了对游标的支持。游标(cursor):是一个存储在MYSQL 服务器上的数据库查询,它不是一条SELECT 语句而是被该语句检索出来的结果集,在存储了游标之后,应用程序可以根据需要滚动或者浏览其中的数据,游标主要用于交互式应用,其中用户需要滚动屏幕上的数据并对数据进行浏览或作出更改。MySQL的游标只能用于存储过程和函数。使用游标的步骤:i:使用游标前必须先声明(定义)它。ii:声明后,必须打开游标以供使用。iii:对于填有数据的游标根据需要取出(检索)各行。iv:结束游标使用时,必须关闭游标。(2)创建游标:游标用DECLARE语句创建。DECLARE命名游标并定义相应的SELECT语句。打开游标:OPEN cursorname; 关闭游标:CLOSE cursorname;(注:MySQL会在到达END语句时自动关闭游标。).eg:CREATE PROCEDURE demoprocedure()
BEGIN
DECLARE esncursor CURSOR
FOR
SELECT esn FROM z_whs_tracking WHERE woid='7202615';
OPEN esncursor;
CLOSE esncursor;
END;
(3)使用游标数据:一个游标被打开后可以使用FETCH语句分别访问它的每一行。FETCH指定检索什么数据、检索出的数据存储在什么地方。DECLARE语句的次序:用DECLARE语句定义的局部变量必须在定义任意游标或句柄之前定义,而句柄必须在游标之后定义。MYSQL支持循环语句用来重复执行代码,直到使用LEAVE语句手动退出为止。REPEAT语句更适合对游标进行循环。
37.触发器:(1)MySQL 5开始支持触发器。触发器是MySQL响应DELETE、INSERT、UPDATE任意语句而自动执行的一条MySQL语句。(2)创建触发器;创建触发器需要给出以下信息:唯一的触发器名、触发器关联表、触发器应该响应的活动(DELETE、INSERT、 UPDATE)、触发器何时执行。只有表才支持触发器,视图不支持,临时表也不支持。触发器按每个表每个事件依次地定义每个表每个事件每次只允许一个触发器 。因此每个表最多支持六个触发器。单一触发器不能与与多个事件多个表关联。(3)删除触发器:DROP TRIGGER triggername.(4)使用触发器:i:INSERT触发器,在INSERT语句执行之前或之后执行。在INSERT触发器代码内可引用一个名为NEW的虚拟表,访问被插入的行;在BEFORE INSERT触发器中,NEW中的值可以被更新;对于AUTO_INCREMENT列NEW 在INSERT执行之前包含0,在INSERT执行之后包含新的自动生成值。ii:DELETE触发器:在DELETE语句执行之前或之后执行。在DELETE触发器代码内,可以引用一个名为OLD的虚拟表,访问被删除的行。
38.管理事务:(1)事务处理:用来保证数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。利用事务处理,可以保证一组操作不会中途停止,它们要么作为整体执行,要么都不执行。如果没有错误发生整组语句提交给(写到)数据库表,如果发生错误,则进行回退以恢复数据库到某个已知且安全的状态。事务(transaction):一组SQL语句。回退(rollback):指撤销指定SQL语句的过程。提交(commit):指将未存储的SQL语句结果写入数据库表。保留点(savepoint):指事务处理中临时设置的占位符(placeholder),可以对其发布回退。(2)MySQL使用START TRANSACTION标识事务的开始。ROLLBACK只能在一个事务处理内使用(在执行一条START TRANSCATION命令之后)。eg:START TRANSACTION;
UPDATE table SET USER_ID='zzv' WHERE USER_NAME='XXX';
SELECT * FROM table WHERE USER_NAME='XXX';
ROLLBACK;
事务处理用来管理INSERT、UPDATE和DELETE语句,不能回退CREATE或DROP操作。事务处理块中可以使用CREATE 或DROP,但如果执行回退,他们不会被撤销。(3)commit:一般的MySQL语句都是直接针对数据库表执行和编写的,这就是所谓的隐含提交(implicit commit),即提交操作是自动进行的。但在事务块中提交不会隐含的进行。为进行明确的提交使用commit语句。当COMMIT或ROLLBACK语句执行后事务会自动关闭。(4)保留点:为了支持回退部分事务处理,必须在事务处理块中合适的位置放置占位符 。这样如果需要回退可以回退到某个占位符。这些占位符就是保留点。使用SAVEPOINT savepointname语句创建占位符。保留点越多越好,因为保留点越多越能按自己的意愿灵活的进行回退。保留点在事务处理完成后(执行一条ROLLBACK 、COMMIT语句)自动释放。MySQL 5支持用RELEASE SAVEPOINT明确的释放保留点。(5)默认提交行为:默认的MySQL行为是自动提交所有更改。使用SET autocommit=0指示MySQL不自动提交更改。autocommit标志决定是否自动提交更改,设置为0表示MySQL不自动提交更改。autocommit是针对每个连接而不是服务器的。
39.全球化和本地化:(1)字符集和校对顺序:字符集:字母和符号的集合。编码:某个字符集成员的内部表示。校对:规定字符集如何比较的指令。使用SHOW CHARACTER SET 可以查看MySQL支持的字符集完整列表。使用SHOW COLLATION查看所支持校对的完整列表。使用SHOW VARIABLES LIKE ' character%'; SHOW VARIABLES LIKE ' collation%';确定所用的字符集合校对。eg:CREATE TABLE tablename
(
column1 INT,
column2 varchar(20) CHARACTER SET latin1 COLLATE latin1_general_ci
)default CHARACTER SET hebrew
COLLATE hebrew_general_ci
(2)MySQL确定确定使用字符集合校对的原则:i:如果指定CHARACTER SET和COLLATE两者,则使用这些值。ii:如归只指定CHARACTER SET,则使用此字符集及其默认的校对。iii:如果既不指定CHARACTER SET又不指定COLLATE,则使用数据库默认。
40.安全管理:(1)MySQL服务器的安全基础:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少。访问控制就是给用户提供他们所需的访问权,且仅提供他们所需的访问权。(2)管理用户:MySQL用户账号和信息存储在名为mysql的MySQL数据库中,使用 USE mysql; SELECT * FROM user;可以查看所有用户信息。创建用户账号:CREATE USER username
IDENTIFIED BY 'p@$$w0rd'.IDENTIFIED BY制定的口令为纯文本,MySQL将在保存到user表之前对其进行加密。为了作为散列值指定口令使用IDENTIFIED BY PASSWORD。删除用户账号及相关权限使用DROP USER语句。(注:从MySQL 5开始删除用户账号和所有的相关权限,之前的版本不删除权限只删除账号,因此如果使用旧版本需要先用REVOKE删除与账号相关的权限然后再用DROP USER删除账号。)(4)设置访问权限:SHOW GRANTS FOR查看赋予用户账号的权限。使用GRANT语句设置权限要给出以下信息:要授予的权限、被授予访问权限的数据库或表、用户名。eg:GRANT SELECT ON 表或数据库 TO 用户名。GRANT的反操作为REVOKE用它来撤销相应的权限。eg:REVOKE SELECT ON 表或数据库 FROM 用户名。GRANT和REVOKE可在几个层次上控制访问权限:整个服务器、整个数据库、特定的表、特定的列、特定的存储过程。
(5)更改口令:更改用户口令使用SET PASSWORD口令,新口令必须传到Password函数进行加密。eg:SET PASSWORD=Password('n3w p@$$asw0rd');在不指定用户名时SET PASSWORD更新当前登录用户的口令。
41.数据维护:(1)备份数据:MySQL是基于磁盘的文件,普通的备份系统和例程就能备份MySQL数据。对于一些总是处于打开和使用状态的文件可以使用一下几种方式备份:i:使用命令行实用程序mysqldump转储所有所数据库内容到某个外部文件。 ii:可使用命令行实用程序mysqlhotcopy从一个数据库复制所有数据。 iii:可以使用MySQL的BACKUP TABLE或SELECT INTO OUTFILE转存所有数据到某个外部文件。为保证所有数据被写到磁盘可在备份前使用FLUSH TABLES语句进行刷新。(2)数据维护: i:ANALYZE TABLE,用来检查表键是否正确。 ii:CHECK TABLE用来针对对许多问题对表进行检查。CHANGED检查自最后一次检查以来改动过的表。EXTENDED,执行最彻底的检查,FAST只检查未正常关闭的表。MEDIUM检查所有被删除的链接并进行键检验,QUICK,只进行快速扫描。如果MyISAM表访问产生不正确和不一致的结果,可用REPAIR TABLE来修复相应的表。 如果从一个表中删除大量数据应该使用OPTIMIZE TABLE来收回所用的空间从而优化表的性能。(3)诊断启动问题:i:服务器启动问题通常在对NySQL配置或服务器本身进行更改时出现。排除系统启动问题时首先应该尽量用手动启动服务器。MySQL服务器自身通过在命令行上执行mysqlid启动。常用的mysqld命令行选项:--help显示帮助, --safe-mode装载减去某些最佳配置的服务器。 --verbose显示全文本消息。 --version显示版本信息然后退出。(4)查看日志文件:i):错误日志,包含启动和关闭问题以及任意关键错误的细节。此日志通常名为hostname.err,位于data目录中。此日志名可用--log-error命令行选项更改。 ii): 查询日志,记录所有MySQL活动,在诊断问题时非常有用。此日志文件会很快地变得非常大,因此不应该长期使用它。此日志通常名为hostname.log,位于data目录。此名字可用--log命令行选项更改。 iii):二进制日志,它记录更新过数据的所欲语句,此日志通常名为--log-bin,位于data目录,此名字可以用--log-bin命令行选项更改。 iv):缓慢查询日志:此日志记录执行缓慢的任何查询,这个日志在确定数据库何处需要优化很有用,此日志通常名为hostname-slow.log,位于data目录中,此名字可以用--log-show-queries命令行选项更改。 在使用日志时可用FLUSH LOGS语句来刷新和重新开始所有日志文件。
42.改善性能:(1)一般来说,关键的生产DBMS应该运行在自己的专用服务器上。(2)MySQL默认的预先配置开始通常都是很好的。查看当前设置可使用SHOW VARIABLES,和SHOW STATUS 。(3)MySQL是一个多用户多线程的DBMS,使用SHOW PROCESSLIST显示所有进程,使用KILL命令结束某个特定进程。(4)使用EXPLAIN语句让MySQL解释它将如何执行一条SELECT 语句。(5)一般来说,存储过程执行的比一条一条的执行其中的各条MySQL语句快。(6)应该总是使用正确的数据类型。(7)不要检索比需求还要多的数据。(8)导入时应关闭自动提交。(9)必须检索数据库表以改善数据检索性能。(10)索引改善数据的检索性能,但损害数据的插入、删除、更行性能。(11)LIKE很慢。一般来说最好使用FULLTEXT而不是LIKE。