一、组合查询
有两种基本情况,其中需要使用组合查询:
- 在单个查询中从不同的表返回类似结构的数据;
- 对单个表执行多个查询,按单个查询返回数据
1 创建组合查询
可用UNION
操作符来组合数条SQL查询。利用UNION
可给出多条SELECT语句,将它们的结果组合成单个结果集。
1.1 使用UNION
创建UNION
涉及编写多条SELECT语句。使用示例如下:
SELECT id,name FROM table1 WHERE price <= 9
UNION
SELECT id,name FROM table1 WHERE id IN (1,4);
结果如下:
这条语句由前面的两条SELECT
语句组成,语句中用UNION
关键字分隔。UNION
指示mysql执行两条SELECT
语句,并把输出组合成单个查询结果集。
1.2 UNION规则
在使用时需要注意以下规则:
UNION
必须由两条或两条以上的SELECT
语句组成,语句之间用关键字UNION
分隔(因此,如果组合4条SELECT
语句,将要使用3个UNION
关键字)。UNION
中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)。- 列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型(例如,不同的数值类型或不同的日期类型)。
1.3 包含或取消重复的行
UNION
从查询结果集中自动去除了重复的行(即其行为与单条SELECT语句中使用多个WHERE
子句条件一样)。若想返回所有匹配行,可使用UNION ALL
而不是UNION
。
1.4 包含或取消重复的行
SELECT
语句的输出用ORDER BY
子句排序。在用UNION
组合查询时,只能使用一条ORDER BY
子句,它必须出现在最后一条SELECT
语句之后。对于结果集,不存在用一种方式排序一部分,而又用另一种方式排序另一部分的情况,因此不允许使用多条ORDER BY
子句。
二、全文本搜索
2 使用全文本搜索
为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。在对表列进行适当设计后, MySQL会自动进行所有的索引和重新索引。在索引之后,SELECT
可与Match()
和Against()
一起使用以实际执行搜索。
2.1 启用全文本搜索支持
一般在创建表时启用全文本搜索。CREATE TABLE
语句接受FULLTEXT
子句,它给出被索引列的一个逗号分隔的列表。在定义之后,MySQL自动维护该索引。在增加、更新或删除行时,索引随之自动更新。下面的CREATE
语句演示了FULLTEXT
子句的使用:
CREATE TABLE productnotes
(
nots_id int NOT NULL AUTO_INCREMENT
prod_id char(10) NOT NULL,
note_date datetime NOT NULL,
note_text text NULL,
PRIMARY KEY(note_id),
FULLTEXT(note_tetx)
)ENGINE=MyISAM;
分析: 其中名为note_text
的列,为了进行全文本搜索,MySQL根据子句FULLTEXT(note_text)
的指示对它进行索引。
2.2 进行全文本搜索
在索引之后,使用两个函数Match()
和Against()
执行全文本搜索,其中Match()
指定被搜索的列,Against()
指定要使用的搜索表达式。
SELECT note_text FROM table1 WHERE Match(note_text) Against('rabbit');