关于《mysql必知必会》的一些读书笔记

1.      use mysql

show命令:  show columns from table_name;(等价于describe table_name)

                     showstatus;用于显示广泛的服务器状态信息

                     showcreate database/show create table;

                     showgrants;用来显示授予用户(所有用户或特定用户)的安全权限

                     showerrors/show warnings;用来显示服务器错误或警告信息

2.      检索数据

Limit:          带一个值的limit总是从第一行开始,给出的数为返回的行数

                     带两个值的limit可以指定从行号为第一个值的位置开始

                     MySql5中,limit 3,4等同于limit 4 offset 3,表示从行3开始取4行

3.      排序和检索数据

Desc:          desc关键字只应用到直接位于其前面的列名。

                     如果想在多个列上进行降序排序,必须对每个列都指定desc关键字

Order by 和 limit组合,能够找出一个列中最高或最低的值。

4.      过滤数据

Where:        操作符=、<>、!=、<、<=、>、>=、between

Mysql支持使用not对in、between、exists子句取反,这与多数其他DBMS允许使用not对各种条件取反有很大的差别

通配符:       %任何字符出现任意次数

                     _任何字符出现一次

                     使用技巧:    不要过度使用通配符

                                          在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处

                                          仔细注意通配符的位置

Binary:     在匹配时区分大小写

正则表达式: 基本字符匹配                   wherecolumn_name regexp ‘abc’

            进行or匹配                      wherecolumn_name regexp ‘abc|def’

            匹配几个字符之一            where column_name regexp ‘[abc]’ 匹配a或b或c

where column_name regexp ‘[^abc]’ 除了a、b、c之外的字符

                      匹配范围                          wherecolumn_name regexp ‘[a-z]’

匹配特殊字符                   wherecolumn_name regexp ‘\\[’,\\也用来引用元字符

                      匹配字符类                      

                   匹配多个实例                   重复元字符(* + {n} {n,} {n,m})

                     定位符                              定位元字符(^ $ [[:<:]] [[:>:]])

简单的正则表达式测试                            select ‘hello’regexp ‘[0-9]’

5.      创建计算字段

拼接              多数DBMS使用+或||来实现拼接,mysql则使用Concat()函数来实现

                      在进行拼接的时候,一定要特别注意:如果要拼接的列中有null值,要对null值做一些处理,不然拼接之后的值为null

6.      使用数据处理函数

文本处理函数 left(str,len) right(str, len)    返回串左边的字符

                      Lower() upper()

                   Ltrim() rtrim()

Locate(substr,str)              返回子串 substr 在字符串 str中第一次出现的位置。如果子串 substr str中不存在,返回值为 0

Locate(substr,str, pos)              返回子串 substr 在字符串 str中的第 pos位置后第一次出现的位置。如果 substr不在 str中返回

Substr() soundex()

日期和时间处理函数

Adddate(date,days)

Adddate(date,interval expr type)              同Date_add()

Curdate()curtime()

Date()                               返回日期时间的日期部分

Datediff()date_add()        参考:http://www.2cto.com/database/201110/107788.html

Date_format()                   参考:http://www.w3school.com.cn/sql/func_date_format.asp

Day()dayofweek() hour() minute() month()

Now() second()time() year()

数值处理函数

                      Abs() cos() exp() mod() pi() rand() sin()sqrt() tan()

7.      分组数据

Group by:      

                      Group by子句可以包含任意数目的列

                      如果在group by子句中嵌套了分组,数据将在最后规定的分组上进行汇总

                      Group by子句中列出的每个列都必须是检索列或者是有效的表达式(但不能是聚集函数)。如果在select中使用表达式,则必须在group by子句中指定相同的表达式。不能使用别名。

                      除聚集计算语句外,select语句中的每个列都必须在groupby子句中给出(如果不给出的话,mysql不会报语法错误,但是查询出来的数据可能不是原来想要的)

                      如果分组列中具有null值,则null将作为一个分组返回。如果列中具有多行null值,它们将分为一组

Having           having支持所有where操作符

8.      全文本搜索

并非所有引擎都支持全文本搜索(MyISAM支持,InnoDB不支持)

       为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。在对表列进行适当设计后,mysql会自动进行所有的索引和重新索引。

       在索引之后,select可与match()和Against()一起使用以实际执行搜索。

1.      启用全文本搜索支持

一般在创建表时启用全文本搜索。

Create tablemodel(

       Id int auto_increment,

       Notes text,

       …,

       Primary key(id),

       Fulltext(notes)

) ENGINE=MyISAM;

也可以在建立表之后添加全文本搜索,如:

Alter tablemodel add fulltext index index_name(notes)

Create fulltextindex index_name on model(notes);

不要在导入数据时使用fulltext

2.      进行全文本搜索

在索引之后,使用两个函数match()和against()执行全文本搜索,match()指定被搜索的

列,against()指定要使用的搜索表达式。

       传递给match()的值必须与fulltext()定义中的相同,而且次序正确

       Selectnotes from model where match(notes) against(‘abcd’)

3.      使用查询扩展

Select notesfrom model where match(notes) against(‘abcd’ with query expansion)

4.      布尔文本搜索

以布尔方式,可以提供关于如下内容的细节:

要匹配的词;

要排斥的词;

排列提示;

表达式分组;

另外一些内容;

即使没有fulltext索引也可以使用。

Select notesfrom model where match(notes) against(‘abcd –def*’ in boolean mode)

全文本布尔操作符:+ - > < () ~ * “”

参考:http://lgn0402.blog.163.com/blog/static/126692363201092964210534/

使用说明:

9.      创建和操纵表

每个表只允许一个auto_increment列,而且它必须被索引。

对于auto_increment列,可使用last_insert_id()函数获得这个值:select last_insert_id()

Mysql不允许使用函数作为默认值,它只支持常量

引擎:

       InnoDB是一个可靠的事务处理引擎,它不支持全文本搜索;

       MyISAM是一个性能极高的引擎,支持全文本搜索,但是不支持事务处理;

       Memory在功能上等同于MyISAM,但由于数据存储在内存中,速度很快,特别适合于临时表;

10.  视图

创建:   

       Createor replace view view_name as select … from … where …

更新:

       如果视图定义中有以下操作,则不能进行视图的更新:

              分组(使用group by和having);

              联结;

              子查询;

              并;

              聚集函数;

              Distinct;

              导出(计算)列

11.  存储过程

创建:

       Createprocedure procedure_name(

[IN|OUT|INOUT] paramname type,

……

)

       Begin

              …

       End;

       存储过程的参数允许的数据类型与表中使用的数据类型相同

       所有mysql变量都必须以@开始

       Showcreate procedure procedure_name

       Showprocedure status

       Showprocedure status like ‘test’

12.  使用游标

Mysql游标只能用于存储过程和函数

使用游标:

       在能够使用游标前,必须声明它。这个过程实际上没有检索数据,它只是定义要使用的select语句;

       一旦声明后,必须打开游标以供使用。这个过程用前面定义的select语句把数据实际检索出来;

       对于填有数据的游标,根据需要取出各行;

       在结束游标使用时,必须关闭游标;

创建游标;

       一个例子:

CREATE PROCEDURE COUNTSOME()

BEGIN

       DECLAREdone boolean DEFAULT 0;

       DECLAREmstr VARCHAR(4);

       DECLAREmcount INTEGER;

 

       DECLAREmonthcursor CURSOR

       FOR

       SELECTDISTINCT SUBSTRING(DATE_FORMAT(start_date,'%Y-%m-%d'),5,4) AS str FROMt_project;

 

       #DECLARECONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

       DECLAREEXIT HANDLER FOR NOT FOUND SET done = 1;

 

       CREATETABLE IF NOT EXISTS monthcursortest(monthstr VARCHAR(4), monthcount INTEGER);

 

       OPENmonthcursor;

 

       REPEAT

              FETCHmonthcursor INTO mstr;

              CALLmonthcount(mstr, mcount);

              INSERTINTO monthcursortest(monthstr, monthcount)

              VALUES(mstr,mcount);

       UNTILdone END REPEAT;

 

       CLOSEmonthcursor;

END

13.  使用触发器

只有表才支持触发器,视图和临时表不支持

使用触发器:

       Insert触发器:

       在insert触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行;

       在before insert触发器中,NEW中的值也可以被更新;

       对于auto_increment列,NEW在insert之前包含0,在insert执行之后包含新的自动生成值;

       Delete触发器:

       在delete触发器代码内,可以引用一个名为OLD的虚拟表,访问被删除的行;

       OLD中的值全都是只读的,不能更新;

       Update触发器:

       在update触发器代码中,可以引用一个名为OLD的虚拟表访问以前的值,引用一个名为NEW的虚拟表访问新更新的值;

       在before update触发器中,NEW中的值可能也被更新;

       OLD中的值全都是只读的,不能更新;

Mysql触发器中不支持call语句,不能从触发器内调用存储过程。

14.  全球化和本地化

Show character set;              查看mysql支持的字符集完整列表

Show collation;             显示所有可用的校对,以及它们适用的字符集

show VARIABLES LIKE 'character%';showvariables like ‘collation%’确定所用的字符集和校对

       字符集很少是服务器范围(甚至是数据库范围)的设置。不同的表,甚至不同的列都可能需要不同的字符集,而且两者都可以在创建表时指定。

       如果需要用与创建表时不同的校对顺序排序特定的select语句,可以在select语句自身中进行:select * from table_nameorder by column_name collate utf8

       如果绝对需要,串可以在字符集之间进行转换,使用cast()或convert()函数

15.  改善性能

总是有不止一种方法编写同一条select语句,应该试验联结,并,子查询等,找出最佳

的方法;

       使用explain语句让mysql解释它将如何执行一条select语句;

       一般来说,存储过程执行得比一条一条地执行其中的各条mysql语句快;

       应该总是使用正确的数据类型;

       决不要检索比需求还要多的数据;

       在导入数据时,应该关闭自动提交。还可以删除索引,然后在导入完成后再重建它们;

       必须索引数据库表以改善数据检索的性能;

       对于有一系列负责的or条件的select语句,通过使用多条select语句和连接它们的union语句,会有一定的性能改进;

       最重要的规则是,每条规则在某些条件下都会被打破。

16.      MySQL数据类型

串数据类型

       MySQL处理定长列远比处理变长列快得多,MySQL不允许对变长列进行索引。

       Char                     1~255个字符

       Enum             接受最多64K个串组成的一个预定义集合的某个串

       Longtext         与text相同,最大长度4GB

       Mediumtext    与text相同,最大长度16K

       Set                 接受最多64个串组成的一个预定义集合的零个或多个串

       Text               最大长度为64K的变长文本

       Tinytext         与text相同,最大长度255字节

       Varchar          长度可变,最多不超过255字节

数值数据类型

       Bit                 位字段,1~64位

       Bigint             -9223372036854775808~9223372036854775807

       Boolean          0/1

       Decimal          精度可变的浮点值

       Double           双精度浮点值

       Float              单精度浮点值

       Int/Integer      整数值,-2147483648~2147483647

       Real               4字节的浮点值

       Smallint          -32768~32767

       Tinyint           -128~127

日期和时间数据类型

       Date              

       Datetime         date和time的组合

       Timestamp     功能和datetime相同,但范围较小

       Time              格式为HH:MM:SS

       Year

二进制数据类型

       Blob               最大长度64KB

       Mediumblob    最大长度16MB

       Longblob        最大长度4GB

       Tinyblob         最大长度255字节

       



你可能感兴趣的:(读书笔记,mysql,读书笔记)