MySql学习之组合查询和全文本搜索(Match()和Against())

组合查询

一.何为组合查询?
组合查询的目的就是利用UNION操作符将多条SELECT语句组合成一个结果集,供我们使用。

有两种基本情况下需要使用组合查询:
1.在单个查询中从不同的表返回类似结构的数据
2.对单个表执行多个查询,按单个查询返回数据

二.创建组合查询
我们可以用UNION操作符来组合数条SQL查询,利用UNION可以给出多条SELECT语句,将他们的结果组合成单个结果集。

例子:假如我们需要价格小于等于5的所有物品的一个列表,而且还想包括供应商1001和1002生产的所有物品。

我们先来看单条语句的实现:

SELECT vend_id, prod_id,prod_price
FROM products
WHERE prod_price<=5;

这个查询价格小于等于5的所有物品的列表。

SELECT vend_id,prod_id, prod_price
FROM products
WHERE vend_id IN(1001,1002);

这个查询供应商1001,1002生产的所有物品。

下面是用UNION组合两条语句,一次执行:

SELECT vend_id, prod_id,prod_price
FROM products
WHERE prod_price<=5
UNION
SELECT vend_id,prod_id, prod_price
FROM products
WHERE vend_id IN(1001,1002);

我们得出的结果集就是上面两条单语句结果的并集。

当然,上面的功能我们也可以用WHERE来实现,也更为简介,但对于更复杂的过滤条件,或者从多个表中检索数据的情形,使用UNION可能会更简单。

三.UNION规则

1.UNION必须由两条或以上的SELECT语句组成,语句之间用关键字UNION分隔
2.UNION中的每个查询必须包含相同的列,表达式或聚集函数(各个列不需要以相同的次序列出)
3.列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换地类型。

四.包含或取消重复的行
在执行UNION语句时,UNION从查询结果集中自动去除了重复地行,这是默认的行为,如果有需要我们可以改变它,如果想返回所有匹配行,可以使用UNION ALL而不是UNION。

五.对查询结果排序
SELECT语句的输出用ORDER BY子句排序,在用UNION组合查询时,只能用一条ORDER BY子句,他必须出现在最后一条SELECT语句之后,对于结果集,不存在用一种方式排序一部分,再用另一种方式排序另一部分,所以不允许使用多条ORDER BY子句。

例子:

SELECT vend_id, prod_id,prod_price
FROM products
WHERE prod_price<=5
UNION
SELECT vend_id,prod_id, prod_price
FROM products
WHERE vend_id IN(1001,1002)
ORDER BY vend_id, prod_price;

上面语句查询出的结果将以vend_id,prod_price 的顺序排序输出。

全文本搜索

一.使用全文本搜索
为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。
在索引之后,SELECT可与Match()和Against()一起使用以执行搜索。

1.启用全文本搜索支持
一般在创建表时启用全文本搜索:

CREATE TABLE productnotes
(
 note_id int  NOT NULL AUTO_INCERMENT,
 prod_id char(10) NOT NULL,
 note_date datetime  NOT NULL,
 note_text text NULL,
 PRIMARY KEY(note_id),
 FULLTEXT(note_text)
)ENGINE=MyISAM;

上面的语句中有一个列名为note_text,为了进行全文搜索,MySQL根据子句FULLTEXT(note_text)的指示对它进行索引,在定义之后,MySQL自动维护该索引,在增加,更新或删除行时,索引随之自动更新。

注意:不要在导入数据时使用FULLTEXT。

2.进行全文本搜索
在索引之后,使用两个函数Match()和Aginst()执行全文本搜索,其中Match()指定被搜索的列,Against()指定要使用的搜索表达式。

例子:

SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('rabbit');//Match()指示MySQL针对指定的列进行搜索,Against()指定词作为搜索文本

注意:
1.传递给Match()的值必须与FULLTEXT()定义中的相同,如果指定多个列,则必须列出它们。
2.搜索不区分大小写,除非使用BINARY方式。

全文本搜索的一个重要部分就是对结果排序,具有较高等级的行(搜索文本靠前的行)先返回。

3.使用查询扩展
查询扩展用于设法放宽所返回的全文本搜索结果的范围。
在使用查询扩展时,MySQL对数据和索引进行两遍扫描来完成搜索:

首先,进行一个基本的全文本搜索,找出与搜索条件匹配的所有行

其次,MySQL检查这些匹配行并选择所有有用的词。

然后,MySQL再次进行全文本搜索,这次不仅使用原来的条件,而且还使用所有有用的词。

例子:

SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('anvils' WITH QUERY EXPANSION);

4.全文本搜索的使用说明
1.在索引全文本数据时,短词被忽略且从索引中排除,短词定义为那些具有3个或3个以下字符的词。
2.MySQL带有一个内建的非用词列表,这些词在索引全文本数据时总被忽略,如果需要,可以覆盖这个列表。
3.许多词出现的频率很高,搜索它们没有用处,所以MySQL规定了一条50%的规则,如果一个词出现在50%以上的行中,则将它作为一个非用词忽略。
4.如果表中的行数少于三行,则全文本搜索不反回结果。
5.忽略词中的单引号。
6.不具有词分隔符的语言不能恰当地返回全文搜索结构。

7.仅在MyISAM数据库引擎中支持全文本搜索。

猜你喜欢

转载自blog.csdn.net/c1776167012/article/details/108144414
今日推荐