组合查询
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支持全文本搜索的另一种形式称为布尔方式。
但是这种全文本搜索方式的操作非常缓慢,其性能将随着数据了的增加而降低。
在布尔方式中,不按等级值降序排序返回的行。