启动全文本搜索支持
一般在创建时启用全文本搜索,在create table语句接受fulltext子句,如
create table productnotes
(
note_id int not null auto_increment,
prod_id char(10) not null,
note_text text null,
primary key(note_id),
fulltext(note_text)
)engine=myisam;
进行全文本搜索
在索引之后,使用两个函数match()和against()执行全文本搜索,其中前者为被搜索的列,against指定要搜索的字符段
select note_text from productnotes where match(note_text) against(‘rabbit’);
上面的语句等同下面:
select note_text from productnotes where note_text like ‘%rabbit%’;
使用查询扩展
查询扩展用来设法放宽所返回的全文本搜索结果的范围。考虑下面的情况.你想找出所有提到anvils的注释.只有一个注释包含词anvils,但你还想找出可能与你的搜索有关的所有其他行,即使它们不包词anvils。
这也是查询扩展的一项任务。在使用查询扩展时,MySQL对数据和索引进行两遍扫描来完成搜索:
1.首先,进行一个基本的全文本搜索,找出与搜索条件匹配的所有行;
2.其次,MySQL检查这些匹配行并选择所有有用的词(我们将会简要地解释MySQL如何断定什么有用,什么无用)。
3.再其次,MySQL再次进行全文本搜索,这次不仅使用原来的条件,而且还使用所有有用的词。
利用查询扩展,能找出可能相关的结果,即使它们并不精确包含所查找的词。
select note_text from productnotes where match(note_text) against(‘anvils’ with query expansion);
布尔文本搜索
MySQL支持全文本搜索的另一种形式,称为布尔方式,可以提供关于如下内容的细节
要匹配的词
要排斥的词
排列提示
表达式分组
另外一些内容
即使没有fulltext索引也可以使用 布尔方式不同于迄今为止使用的全文本搜索语法的地方在于,即使没有定义fulltext索引,也可以使用它,也可以使用它
select note_text from productnotes where match(note_text) against(‘anvils’ in boolean mode);
引擎类型
create table语句全都可以engine=innodb,与其他DBMS一样,MySQL有一个具体管理和处理数据的内部引擎,在你使用create table语句时,该引擎具体创建表,在你使用select 语句或其他数据库处理时,该引擎在内部处理你的请求
当然,你完全可以忽略这些数据库引擎。如果省略ENGINE=语句,则使用默认引擎(很可能是MyISAN),多
数SQL语句都会默认使用它。但并不是所有语句都默认使用它,这就是为什么ENGINE=语句很重要的原
因(也就是为什么本书的样列表中使用两种引擎的原因。
以下是几个需要知道的引擎:
InnoDB是一个可靠的事务处理引挂(参见第26章),它不支持全文本搜索;
MEMORY在功能等同于MyISAM,但由于数据存储在内存(不是磁盘)中,速度很快(特别适合于临时表);
MyISAM是一个性能极高的引擎,它支持全文本搜索(参见第18章),但不支持事务处理。
游标
MySQL检索操作返回一组称为结果集的行,这组返回的行都是相匹配的行,但没有办法得到第一行,下一行或前10行,这就是使用游标的原因
在能够使用游标前,必须声明(定义它。这个过程实际上没有检索数据,它只是定义要使用的SELECT语句。
一但声明后,必须打开游标以供使用。这个过程用前面定义的SELECT语句把数据实际检索出来。
对于填有数据的游标,根据需要取出(检索)各行。
在结束游标使用时,必须关闭游标。
在声明游标后,可根据需要频繁地打开和关闭游标。在游标打开后,可根据需要频繁地执行取操作。
创建游标
create procedure processorders()
begin
declare ordernumbers cursor
for
select order_num from order;
end;
打开和关闭游标
open ordernumbers;
在处理open语句时执行查询,存储检索出的数据以游览和滚动
close ordernumber;
close释放游标使用的所有内部和资源,因此在每个游标不再需要时都应该关闭
隐含关闭:如果你不明确关闭游标,MySQL将会在到达end语句时自动关闭它
使用有表数据
在一个游标被打开后,可以使用fetch语句分别访问它的每一行。fetch指定检索什么数据,检索出来的数据存储在什么地方,它还向前移动游标中的内部行指针,使下一条fetch语句检索下一行
declare o int;
open ordrnumbers;
fetch ordernumbers into o;
close ordernumbers;
循环检索数据
在open和close之间语句
repeat
fetch ordernumbers into o
until done end repeat
done的初始化和停止的条件
declare done boolean default 0
declare continue handler for sqlstate ‘02000’ set done=1;
触发器
MySQL语句在需要时被执行,存储过程也是如此,但是,如果你想要某条语句在事件发生时自动执行
触发器是MySQL响应以下任意语句而自动执行的一条MysqL语句:DELETE;INSERT;UPDATE;其他语句不支持触发器
创建触发器
在创建触发器时,需要给出4条信息
唯一的触发器名
触发器关联的表
触发器应该响应的活动
触发器何时执行(处理之前或之后)
create trigger newproduct after insert on products for each row select ‘procuct added’;
删除触发器
drop trigger newproduct;
使用触发器
每种触发器有差别
INSERT触发器,在执行之前或之后执行
在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行
在BEFORE INSERT触发器中,NEW中的值也可以被更新
对于AUTO_INCREMENT列,NEW在INSET执行之前包含0,在INSET执行之后包含新的自动生成值
create trigger neworder after insert on orders for each row select new order_num;