组合查询

MySQL允许执行多个查询,并将结果作为单个查询结果集返回,这些组合查询通常称为并获复合查询。

有两种基本情况,需要使用组合查询:

  • 在单个查询中从不同的表返回类似结构的数据
  • 对单个表执行多个查询,按单个查询返回数据

使用UNION关键字来组合多个查询,将它们的结果组成单个结果集。

规则:

  • UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔
  • 每个查询必须包含相同的列、表达式或聚集函数
  • 列数据类型必须兼容:类型不必完全相同,但必须时DBMS可以隐含转换的类型。
SELECT id, price FROM products WHERE price <=5
UNION 
SELECT id, price FROM products WHERE id IN     (1001,1002)

UNION从查询结果集中自动去除了重复的行。如果想返回所有的行,可使用UNION ALL。

对组合查询结果排序使用ORDER BY子句。
对于结果集不存在用一种方式排序一部分,而又用另一种方式排序另一部分的情况,因此不允许使用多条ORDER BY子句。

全文本搜索

MyISAM支持全文本搜索,InnoDB不支持全文本搜索。

一般在创建表的时候启动全文本搜索。CREATE TABLE语句接受FULLTEXT子句,它给出被索引列的列表,在定义之后,MySQL自动维护该索引,在增加、更新或删除时,索引也随之更新。

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

SELECT note_text FROM products WHERE Match(note_text) Against ('rabbit');

除非使用BINARY方式,否则全文本搜索不区分大小写。

全文本搜索会对结果进行排序,具有较高等级的行先返回。如果指定多个搜索项,则包含多数匹配词的那些行将比具有必包含较少词的行等级高,

全文本搜索提供列简单LIKE搜索不能提供的功能,而且由于数据时索引的,所以全文本搜索还相当快,

使用查询扩展

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

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

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

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

布尔搜索

MySQL支持全文本搜索的另一种形式称为布尔方式。
但是这种全文本搜索方式的操作非常缓慢,其性能将随着数据了的增加而降低。

在布尔方式中,不按等级值降序排序返回的行。