MySQL学习笔记补知识点

启动全文本搜索支持

一般在创建时启用全文本搜索,在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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值