布尔文本搜索
布尔文本提供的功能:(主要)(通过布尔文本搜索运算符实现)
- 要匹配的词;
- 要排斥的词(如果某行包含这个词,则不返回该行,即使它包含其他指定的词也是如此);
- 排列提示(指定某些词比其他词更重要,更重要的词等级更高);
- 表达式分组;
例:
select note_text
from productnotes
where match(note_text) against('heavy'in boolean mode);
这一段语句的作用是查找note_text字段中含有heavy一词的数据。(没有使用布尔文本搜索运算符,所以有没有in heavy boolean mode搜索的结果是没区别的)。
|-------|---------------------------------------|
| 布尔操作符 | 说明 |
| + | 包含,词必须存在 |
| - | 排除,词必须不出现 |
| > | 包含,而且增加等级值 |
| < | 包含,且减少等级 |
| () | 把词组成子表达式(允许这些子表达式作为一个组被包含、排除、排列等) |
| ~ | 取消一个词的排序值 |
| * | 取消一个词的排序值 |
| "" | 定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语) |
例:
select note_text
from productnotes
where match(note_text) against('heavy -hope'in boolean mode);
//作用:搜索note_text中带有heavy一词并且不包含hope一词的数据
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('+rabbit +bait' IN BOOLEAN MODE);
//匹配包含词rabbit和bait的行。
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('rabbit bait' IN BOOLEAN MODE);
//匹配包含rabbit和bait中的至少一个词的行
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('"rabbit bait"' IN BOOLEAN MODE);
//匹配rabbit bait而不是匹配两个词
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('>rabbit <bait' IN BOOLEAN MODE);
//匹配rabbit和carrot,增加前者的等级,降低后者的等级
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('+safe +(<combination)' IN BOOLEAN MODE);
//匹配词safe和combination,降低后者的等级
注意
- 在索引全文本数据时,短词被忽略且从索引中排除。短词定义为 那些具有3个或3个以下字符的词(如果需要,这个数目可以更改)。
- MySQL带有一个内建的非用词(stopword)列表,这些词在索引全文本数据时总是被忽略。如果需要,可以覆盖这个列表(请参阅MySQL文档以了解如何完成此工作)。
- 许多词出现的频率很高,搜索它们没有用处(返回太多的结果)。 因此,MySQL规定了一条50%规则,如果一个词出现在50%以上 的行中,则将它作为一个非用词忽略。50%规则不用于IN BOOLEAN MODE。
- 如果表中的行数少于3行,则全文本搜索不返回结果。
- 忽略词中的单引号。例如,don't索引为dont。
- 不具有词分隔符(包括日语和汉语)的语言不能恰当地返回全文本搜索结果。
- mysql不具有邻近操作符。
插入数据
insert into关键字
- 插入完整的行
- 插入行的一部分
- 插入多行
- 插入某些查询的结果
插入数据
简单的向表中插入数据
insert into topic
values("homework",NULL,"student");
这样插入的数据会根据你的给出的顺序插入,如果想只对最后一个数据进行插入就很难做到。
所以我们可以指定列名:
insert into topic(work,answer,user)
values("homework",NULL,"student");
不管哪种insert into语法,都必须给出values的正确数目,如果不提供列名,则必须给每个列提供一个值。
如果提供列名,则必须对每个列出的列值给出一个值。
列名被明确列出时,可以省略列,如果表的定义允许则可以省略列
- 该列定义为允许NULL值(无值或空值)
- 在表定义中给出默认值。
插入多行
当插入多行时只需要指定列名和values一次,然后每一行的数据都用括号括起来,中间使用逗号隔开。
例:
insert into topic(work,answer,user)
values //插入两行数据
("homework",NULL,"student"),
("home",NULL,"teacher");
插入检索出的数据
insert into topic(work,answer,user)
select work,answer,user from homework;
更新数据
update关键字
- 更新指定列(一个或多个)
更新指定列
update topic set answer=12,content=2 where id=1;
更新多列
update topic set answer=12 where id=1;
更新单列
ignore关键字:在使用update和insert关键字进行多列修改时只要有一列的修改数据出现错误那么整个update语句的修改都会被撤销(已被修改的数据会被回溯成没有修改之前的值),为了在出现错误时也可以进行修改,遇到重复插入可以不进行插入,就会使用到ignore关键字,可以使update和insert在发生错误时也可以运行。
使用格式:
update ignore 表名
insert ignore into 表名
删除数据
delete关键字
- 删除指定行(一个或多个)
删除指定行
delete from topic where id=1;
删除单行
delete from topic where id=1 and id=2;
删除多行
更新和删除的指导原则
下面是许多SQL程序员使用UPDATE或DELETE时所遵循的习惯。
- 除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE子句的UPDATE或DELETE语句。
- 保证每个表都有主键,尽可能像WHERE子句那样使用它(可以指定各主键、多个值或值的范围)。
- 在对UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确。
- 使用强制实施引用完整性的数据库,这样MySQL将不允许删除具有与其他表相关联的数据的行。
创建表
create table关键字
- 新表的名字,在关键字CREATE TABLE之后给出。
- 表列的名字和定义,用逗号分隔。
例:
CREATE TABLE customers
(
cust_id int NOT NULL AUTO_INCREMENT,
cust_name char(50) NOT NULL,
cust_address char(50) NULL,
PRIMARY KEY (cust_id)
) ENGINE=InnoDB;
在创建新表时,要确保表名时唯一的,如果在创建表时发现表名有重复会报错。如果只想在表不存在时创建可以在表名后加上if not exists。
表中的列是否可以为NULL是在创建表时规定的。
主键
主键值必须唯一。可以由一个或者多个。
- 如果主键使用单个列,则它的值必须唯一。
- 如果使用多个列,则这些列的组合值必须唯一。
例:
PRIMARY KEY (order_num, order_item)
组合主键
使用auto_increment
auto_increment告诉MySQL,本列每当增加一行时自动增量。每次 执行一个insert操作时,MySQL自动对该列增量(从而才有这个关键字auto_increment),给该列赋予下一个可用的值。这样给每个行分配一个唯一的cust_id,从而可以用作主键值。
覆盖auto_increment:如果一个列被指定为auto_increment,则它需要使用特殊的值吗?你可以简单地insert语句中指定一个值,只要它是唯一的(至今尚未使用过)即可,该值将被用来替代自动生成的值。后续的增量将开始使用该手工插入的值。
指定默认值
MySQL不允许使用函数作为默认值,只支持常量。
例:
CREATE TABLE orderitems
(
order_num int NOT NUL,
order_item int NOT NULL,
prod_id char(10) NOT NULL,
quantity int NOT NULL DEFAULT 1, //默认为1
item_price decimal(8,2) NOT NULL,
//其数据类型为十进制(decimal)总共8位数字,其中包括两位小数
PRIMARY KEY (order_num,order_item)
) ENGINE = InnoDB;
引擎类型
- InnoDB是一个可靠的事务处理引擎,它不支持全文本搜索;【后面版本已经支持了~】
- MEMORY在功能等同于MyISAM,但由于数据存储在内存(不是磁盘) 中,速度很快(特别适合于临时表);
- MyISAM是一个性能极高的引擎,它支持全文本搜索,但不支持事务处理。
- 引擎类型可以混用。
注意:不同类型的引擎之间的表不能混合引用,即使用一个引擎的表不能引用具有使用不同引擎的表的外键。
更新表
alter table关键字用于更改表的结构,给出表名和更改的列表
例:
alter table topic
add user char(20);
为了对单个表进行多个更改,可以使用单条ALTER TABLE语句,每个更改用逗号分隔.
例:
alter table topic
add user char(20),
drop column user;
删除表
drop table topic;
重命名表
rename table topic to work;
重命名单个表
rename table
topic to work,
home to homework;