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中返回 0
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字节