组合查询&全文本搜索
组合查询
创建组合查询
组合查询很简单易懂,主要使用 UNION 关键词
理论上组合查询与多个WHERE条件完成的问题相同,但在复杂的查询语句中使用,会让我们轻松很多;
例: 我们想要知道年龄小于20岁的和名字叫做zhangsan,lisi的所有行的信息。
我们先分开来写
SELECT * FROM ms WHERE age < 20;
SELECT * FROM ms WHERE name IN ('zhangsan','lisi');
这是我们可以使用组合查询来合并两条语句
SELECT * FROM ms WHERE age < 20
UNION
SELECT * FROM ms WHERE name IN ('zhangsan','lisi');
当然我们也可以使用多个WHERE条件完成
SELECT *
FROM ms
WHERE age < 20
OR name IN ('zhangsan','lisi');
注:我们使用组合查询是它会自动合并重复列,如果我们不想取消重复列我们可以使用关键词UNION ALL 来代替 UNION。
SELECT * FROM ms WHERE age < 20
UNION ALL
SELECT * FROM ms WHERE name IN ('zhangsan','lisi');
注: 当我们要对组合查询结果排序时我们只能使用一条ORDER BY 子句且必须放在最后一个查询语句的后边。
SELECT * FROM ms WHERE age < 20
UNION ALL
SELECT * FROM ms WHERE name IN ('zhangsan','lisi')
ORDER BY age;
全文本搜索
1.启用全文本搜索支持
启用全文本搜索支持需要在创建表的时候对所要启用的列进行使用FULLTEXT子句
CREATE TABLE productnotes
(
note_id int NOT NULL AUTO_INCREMENT,
prod_id char(10) NOT NULL,
note_text text NULL,
PRIMARY KEY(note_id),
FULLTEXT(note_text)
)ENGINE=MyISAM;
2.进行全文本搜索
进行全文本搜素需要用到两个函数Match()和Against()执行全文本搜索,其中Mathch()指定被搜索的列,Against()指定要使用的搜索表达式。
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('double');
3.查询扩展
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('double' WITH QUERY EXPANSION);
扩展查询可以返回包含'double'字符串的串,并扩展与包含'double'串含有相同单词的串。
4.布尔文本搜索
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('double' IN BOOLEAN MODE);
布尔文本搜索可以使用布尔操作符
例:
SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('double -int*' IN BOOLEAN MODE);
这段代码的意思是返回包含'double'但不包含以'int'开头的词,的串
全文本布尔操作符
布尔操作符 | 说明 |
---|---|
+ | 包含,词必须存在 |
- | 排除,次必须不出现 |
> | 包含,而且增加等级值 |
< | 包含,而且减少等级值 |
() | 把词组成子表达式 |
~ | 取消一个词的排序值 |
* | 词尾的通配符 |
“” | 定义一个短句 |