CASE流程控制函数
1
CASE value
WHEN [compare-value] THEN result
[WHEN [compare-value] THEN result ...]
[ELSE result]
END
2
CASE WHEN [condition] THEN result
[WHEN [condition] THEN result ...]
[ELSE result]
END
一个CASE表达式的默认返回值类型是任何返回值的相容集合类型,但具体情况视其所在语境而定。如果用在字符串语境中,则返回结果字符串。如果用在数字语境中,则返回结果为十进制值、实值或整数值。
语法:IF(expr1,expr2,expr3)。
如果 expr1 是TRUE (expr1 <> 0 AND expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。
IFNULL(expr1,expr2)
如果expr1不为NULL,则 IFNULL()的返回值为 expr1,否则其返回值为 expr2。
IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。
NULLIF(expr1,expr2)
如果expr1 = expr2 成立,那么返回值为NULL,否则返回值为 expr1。这和CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END相同。
ASCIi()函数——返回字符串的ASC码值
语法:ASCIi(str)。
返回值为字符串str的最左字符的ASC码值。如果str为空字符串,则返回值为0。如果str为NULL,则返回值为NULL。ASCIi()用于带有从0到255的数值的字符,示例如下。
mysql> SELECt ASCIi('2'); -- 50
mysql> SELECT ASCIi(2); -- 50
mysql> SELECT ASCIi('dx'); -- 100
ORd(str)函数包含ASCIi(str)的全部功能,主要用于获得多字节字符代码值。
BIn()函数——返回二进制值的字符串
语法:BIn(N)。
返回值为N的二进制值的字符串表示,其中N为一个long数字。这等同于CONv(N,10,2) ——“CONv(N,FROM_base,to_base)——在基数之间进行转换。该函数返回值N从FROM_base到to_base转换的字符串。最小基数值是2,最大值为36。如果任一参数为NULL,则该函数返回NULL。”如果N为NULL,则返回值为NULL。
BIT_LENGTH()函数——返回字符串的二进制长度
语法:BIT_LENGTH(str)返回值为二进制的字符串str长度,示例如下:
mysql> SELECT BIT_LENGTH('text'); -- 32
CHAR函数——将整数值转换为字符串
语法:CHAr(N,...)。
CHAr()将每个参数N理解为一个整数,其返回值为一个包含这些整数的代码值所给出的字符的字符串,NULL值被省略,示例如下:
mysql> SELECT CHAr(77,121,83,81,'76'); -- 'MySQL'
mysql> SELECT CHAr(77,77.3,'77.3'); -- 'MMM'
CONCAt()函数——字符串拼接
语法:CONCAt(str1,str2,...)。
返回结果为连接参数产生的字符串。如有任何一个参数为NULL,则返回值为NULL,或有一个或多个参数。如果所有参数均为非二进制字符串,则结果为非二进制字符串。如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型CAST,例如:SELECT CONCAt(CAST(int_col AS CHAR),char_col),示例如下:
mysql> SELECT CONCAt('My', 'S', 'QL'); -- 'MySQL'
mysql> SELECT CONCAt('My', NULL, 'QL'); -- NULL
mysql> SELECT CONCAt(14.3); -- '14.3'
索引是提高查询速度的有效方法。
没有索引查询大量数据很慢
如果是多表联合查询,那将是更痛苦的事情了。
事物都有两面性,索引在提高速度的同时,也有一些缺点。
● 索引需要使用更多的磁盘空间,索引越多,占用磁盘空间就越多。
● 索引在加快检索速度的同时,还降低了插入、更新、删除的操作速度,因为它们多了一项工作就是更新索引,索引越多,速度就越慢。
1.最好使用唯一化的索引
在唯一化的数据列加索引效果是最明显的,如果一个字段存在许多相同的值,加上索引后效果不会比原来好;如果某列存放性别“男”和“女”两种值,在这种情况下,MySQL很有可能不使用索引进行全盘扫描。当查询优化程序发现某数据在超过30%的行里都有出现时,通常会不使用索引而进行全表扫描。
2.索引长度要尽量短
如果要对一个字符型的字段添加索引,可以指定一个前缀长度,如一个CHAr(50)型的字段添加索引。如果它的前10个字节不同后面基本相同,那么可以只对这前10个字节创建索引,这样既减少了索引所占的空间,又可以加快检索速度。
3.要充分利用最左侧前缀
这个是针对于复合索引而言的,例如对某表中的cl、c2、c3这3个列创建了一个复合索引,索引项的顺序为c1、c2、c3,这样如果查询时,以c2、c3、c2+c3作为条件时,基本是用不到创建的复合索引的,因为它们都没有最左侧的c1字段,所以这个复合索引适用于以下检索条件:
c1, c2, c3
c1, c2
c1
注意:
如果检索条件没有涉及索引的最左前缀,MySQL就用不到复合索引了,如对c2或c3进行检索时,这个复合索引是用不到的。
索引并不是越多越好,每增加索引,就会占用更多的磁盘空间,更新删除的操作速度也会变慢。
MySQL中使用索引
MySQL中创建索引的语法如下:
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX INDEX_name
[USING index_type]
ON tbl_name (index_col_name,...)
INDEX_col_name:
col_name [(length)] [ASC | DESC]
创建唯一索引可以使用关键字UNIQUE随表一同创建
示例如下:
MySQL> CREATE TABLE cms_blog (id SMALLINT(8) unSIGNED NOT NULL,catid SMALLINT(5) UNSIGEND NOT NULL DEFAULT '0',title varchar(80) NOT NULL DEFAULT '',content TEXT NOT NULL,PRIMARY KEY (id), UNIQUE KEY cms_blog_catid (catid)) ;
9 Query OK, 0 rows affected (0.24 sec)
上面代码为cms_blog表的“catid”字段创建名为cms_blog_catid的唯一索引。
在创建表之后使用CREATE UNIQUE 命令来创建
示例如下:
MySQL> CREATE UNIQUE INDEX cms_blog_catid_2 ON wb_blog(catid);
Query OK, 0 rows affected (0.47 sec)
索引的增加
示例如下:
MySQL>ALTER table cms_blog add unique cms_blog_catid_2 ON (catid);
Query OK, 0 rows affected (0.85 sec)
主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的同时创建主键索引。示例如下:
mysql>CREATE TABLE cms_index(i_id INT NOT NULL AUTO_INCREMENT,cms_name VARCHAr(16) NOT NULL,PRIMARY KEY(i_id));
当然也可以用ALTER命令。
UNIQUE类型索引列的值必须是唯一的,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种维护方式。
(1)创建索引。
CREATE UNIQUE INDEX INDEXNAME ON tablename(tablecolumns(length))
(2)修改索引。
ALTER tablename ADD UNIQUE [INDEXNAME] ON (tablecolumns(length))
(3)创建表的时候直接指定索引。
CREATE TABLE tablename ( [...], UNIQUE [INDEXNAME](tablecolumns(length));
MySQL事务的ACID说明如下。
A(atomicity)表示原始性。
C(consistency)表示一致性。
I(isolation)表示隔离性。
D(durability)表示持久性。
一个事务若具备了这4个特性,就确保了数据库的可靠性。



