OR语句也能实现上面的查询
SELECT vend_id ,prod_id , prod_price FROM products
WHERE prod_price <= 5 OR vend_id IN (1001,1002)
从上面这个简单的例子中,使用UNION可能比使用WHERE子句更为复杂。但对于更复杂的过滤条件,或者从多个表而不是单个表中检索数据的情形,使用UNION肯会使处理更简单
UNION规则
正如所见,并是非常容易使用的,但在进行并时有几条规则需要注意
1 UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔
2 UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各列不需要以相同的次序列出)
3 列数据类型必须兼容:类型不完全相同,但不想是DBMS可以隐含滴转换的类型。
包含或取消重复的行
如果SELECT语句中返回的行相同,UNION会自动的去除重复的行。这是他的默认行为,但是如果需要,可以改变它,可以使用UNION ALL 而不是UNION
SELECT vend_id ,prod_id , prod_price FROM products WHERE prod_price <= 5
UNION ALL
SELECT vend_id ,prod_id , prod_price FROM products WHERE vend_id IN (1001,1002)
对组合查询结果排序
SELECT语句的输出用ORDER BY子句排序。在UNION组合查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后。
SELECT vend_id ,prod_id , prod_price FROM products WHERE prod_price <= 5
UNION ALL
SELECT vend_id ,prod_id , prod_price FROM products WHERE vend_id IN (1001,1002)
GROUP BY vend_id,prod_price;
第十八章 全文本搜索
理解全文本搜索
并非所有的引擎都支持全文本搜索。最常使用的是MyISAM和InnoDB,前者支持全文本搜索,而后者不支持。如果你需要全文本搜索功能,应该记住这一点
关键字LIKE,它利用通配操作匹配的文本(和部分文本)。使用LIKE,能够查找包含特殊值或部分值的行(不管这些值位于那些位置)
基于文本的搜索作为正则表达式匹配列值的更进一步的介绍。使用正则表达式,可以编写查找所有行的非常复杂的匹配模式
虽然这些搜索机制非常有用。但存在几个重要的限制:
1 性能——通配符和正则表达式匹配通常要求MYSQL尝试匹配表中所有的行(而且这些搜索极少使用表索引),因此,由于被搜索行数不断增加,这些搜索非常耗时
2 明确控制——使用通配符和正则表达式匹配,很难(而且并不总能)明确的控制匹配什么和不匹配什么
3 智能化的结果——虽然前两者都能提供了非常灵活的搜索,但它们都不能提供非常智能化的匹配结果。
前面的很多限制都可以使用全文本搜索来解决。使用全文本搜索。Mysql创建指定列中各词的一个索引, 搜索可以针对这些词进行。
使用全文本搜索
启用全文本搜索
一般在创建表时启用全文本搜索。CREATE TABLE语句接受FULLTEXT子句。它给出被索引列的一个逗号分隔的列表。
CREATE TABLE productontes
(
note_id int NOT_NULL AUTO_INCREMENT,
prod_id char(10) NOT_NULL,
note_date datetime NOT_NULL,
note_text text NOT_NULL,
PRIMARY KEY(note_id),
FULLTEXT(note_text)
)ENGINE=MyISAM;
为了进行全文本搜索,mysql根据子句FULLTEXT(note_text)的指示对它进行索引。这里FUNLL_TEXT索引了单个列,如果需要可以索引多个列,多列之间用逗号分隔
在定义之后mysql对自动维护该索引,在增加、更新和删除行时,索引随之自动更新。
不要在导入数据时使用FUNLLTEXT,否则会耗费很多时间,应该先导入数据,再定义FULLTEXT这样有助于更快的导入数据
进行全文本搜索
在索引之后,使用两个函数Match()和Against()执行全文本搜索,其中Match()指定被搜索的列Against()指定要使用的搜索表达式。
SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit');
使用完整的Match()说明: 传递给Match()的值必须和与FULLTEXT()定义中的相同。如果指定了多个列,则必须列出它们(而且次序正确)
除非使用BINARY方式,否则全文本搜索不区分大小写
使用SELECT 语句同样可以检索出两行,但次序不同。
全文本搜索返回一文本匹配的良好程度的数据。具有较高等级的行先返回。
使用查询扩展
查询扩展用来设法放宽所返回的全文本搜索结果的范围。想找出与搜索有关的其他行。不包含要搜索才字母。
如SELECT note_text FROM productnotes WHERE Match(note_text) Against('anvils');
返回一行数据
使用查询扩展
SELECT note_text FROM productnotes
WHERE Match(note_text) Against('anvils' WITH QUERY EXPANSION);
返回7行
布尔文本搜索
Mysql支持全文本搜索的另一种形式,称为布尔方式。布尔方式可以提供以下细节:
1 要匹配的词
2 要排斥的词(如果该行包含这个词,则不返回该行,即使它已经包含指定的词也是如此)
3 排列提示(指定某些词比其他词重要,更重要的词的词等级更高)
4 表达式分组
5 另外一些内容
即使没有FULLTEXT索引也可以使用 布尔方式不同迄今为止使用的全文本搜索语法的地方在于,即使没有定义FULLTEXT索引,也可以使用它,但这是一种非常缓慢的操作(其性能将随着数据量的增加而降低)
例如:匹配包含heavy但不包含任意以rope开始的词的行,可以使用以下查询: