mysql一点基础东西
8.用通配符进行过滤
通配符本身实际是SQL的WHERE子句中有特殊含义的字符
为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较
最常使用的通配符是百分号(%)。在搜索串中,%表示任何字符出现任意次数。
where prod_name LIKE 'jet%';
下划线(_)。下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符
通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长
9.用正则表达式进行搜索
正则表达式是用来匹配文本的特殊的串(字符集合)
where prod_name REGEXP 'xxx';
10.创建计算字段
直接从数据库中检索出转换、计算或格式化过的数据;而不是检索出数据,然后再在客户机应用程序或报告程序中重新格式化
使用Concat()函数来拼接两个列,例:Concat(vend_name, '(', vend_country, ')');
还可以执行算术计算
11.使用数据处理函数
文本处理函数:
- Left() 返回串左边的字符
- Length() 返回串的长度
- Locate() 找出串的一个子串
- Lower() 将串转换为小写
- LTrim() 去掉串左边的空格
- Right() 返回串右边的字符
时间处理函数:
- AddDate() 增加一个日期(天、周等)
- AddTime() 增加一个时间(时、分等)
- CurDate() 返回当前日期
- CurTime() 返回当前时间
数值处理函数:
。。。
15.连结表
内部联结(INNER JOIN):目前为止所用的联结称为等值联结(equijoin),它基于两个表之间的相等测试。这种联结也称为内部联结
自联结:一张表和自己联结,需要使用别名
自然联结:标准的联结返回所有数据,甚至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次。
外部联结(LEFT/RIGHT OUTER JOIN):与内部联结关联两个表中的行不同的是,外部联结还包括没有关联行的行。在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字指定包括其所有行的表
不要联结不必要的表。联结的表越多,性能下降越厉害。
17.组合查询
在单个查询中从不同的表返回类似结构的数据;对单个表执行多个查询,按单个查询返回数据时可以使用组合查询
UNION的使用很简单。所需做的只是给出每条SELECT语句,在各条语句之间放上关键字UNION
在用UNION组合查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后
18.全文本搜索
两个常用的数据库引擎MyISAM和InnoDB,前者支持全文本搜索,而后者不支持
一般在创建表时启用全文本搜索。CREATE TABLE语句接受FULLTEXT子句
为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引
select xxx from xxx where Match(xxx) Against(‘xxx’);
全文本搜索的一个重要部分就是对结果排序。具有较高等级的行先返回(因为这些行很可能是你真正想要的行)。
布尔文本搜索提供关于如下内容的细节
- 要匹配的词;
- 要排斥的词(如果某行包含这个词,则不返回该行,即使它包含其他指定的词也是如此);
- 排列提示(指定某些词比其他词更重要,更重要的词等级更高);
- 表达式分组;
where Match(xxx) Against('xxx' IN BOOLEAN MODE)- 需要搭配布尔操作符使用可以有更好的效果
MySQL规定了一条50%规则,如果一个词出现在50%以上的行中,则将它作为一个非用词忽略
23.存储过程
存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件,虽然它们的作用不仅限于批处理。
简化对变动的管理。如果表名、列名或业务逻辑(或别的内容)有变化,只需要更改存储过程的代码。使用它的人员甚至不需要知道这些变化。
可以传入或传出参数,就像函数一样
24.游标
需要在检索出来的行中前进或后退一行或多行。这就是使用游标的原因
游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。
在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。
游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改。
25.使用触发器
触发器是mysql响应 delete,insert,update语句时自动执行的一条 mysql 语句
一共有六种,在delete语句前后各一个,所以3*2 = 6
create trigger xxx after insert on tablex for each row select ‘product added’;
只有表支持触发器,视图,临时表不支持
drop trigger xxx 删除触发器
使用触发器时可使用 old 或 new 指定特定的行或表
26.管理事务处理
使用 start transaction 指令创建事务
使用 rollback 指令进行回退,直接回退到 start transaction 处
使用 commit 指令对sql语句进行明确的提交
可以设置 savepoint 保留点来创建占位符, rollback to 保留点来回退到想要的位置
27.字符集的编码和校对
- 字符集为字母和符号的集合;
- 编码为某个字符集成员的内部表示;
- 校对为规定字符如何比较的指令
show character set 指令显示所支持的字符集完整列表
show collation 指令显示所有可用的校对(_cs表示区分大小写, _ci表示不区分大小写)
不仅可以对数据库指定默认编码和校对,还可以对表和列设置
同时可以在写sql语句时临时设置校对来区分大小写,如用于select,order by,group by,having等
29.数据库维护
使用 backup table 或 select into outfile 转储所有数据到某个外部文件
analyze table xxx 用来检测表键是否正确
check table xxx 针对许多问题进行检查
有一系列日志文件可查看,如错误日志,查询日志
30.改善性能
- mysql 具有特定的硬件建议,遵循这些建议
- mysql使用时用一系列的默认设置预先配置,但使用一段时间后可根据需要调整内存分配,缓冲区大小等
- 决不要检索比需求还要多的数据。换言之,不要用SELECT *(除非你真正需要每个列)
- 应该总是使用正确的数据类型
- 使用EXPLAIN语句让MySQL解释它将如何执行一条SELECT语句
- 总是有不止一种方法编写同一条SELECT语句。应该试验联结、并、子查询等,找出最佳的方法
- 必须索引数据库表以改善数据检索的性能。确定索引什么不是一件微不足道的任务,需要分析使用的SELECT语句以找出重复的WHERE和ORDER BY子句。如果一个简单的WHERE子句返回结果所花的时间太长,则可以断定其中使用的列(或几个列)就是需要索引的对象。
- 你的SELECT语句中有一系列复杂的OR条件吗?通过使用多条SELECT语句和连接它们的UNION语句,你能看到极大的性能改进
- LIKE很慢。一般来说,最好是使用FULLTEXT而不是LIKE
- 索引改善数据检索的性能,但损害数据插入、删除和更新的性能。如果你有一些表,它们收集数据且不经常被搜索,则在有必要之前不要索引它们
- 最重要的规则就是,每条规则在某些条件下都会被打破