16. 组合查询
MySQL也允许执行多条查询语句(多条select语句),并将结果作为单个查询结果集返回。这些组合查询通常称为并或者复合查询。
16.1 创建组合查询
使用关键词Union.使用很简单:在多条select语句中间放上关键词UNION就可以。
mysql> select t_id,t_name from test
-> where length(t_name)>4;
+------+---------+
| t_id | t_name |
+------+---------+
| 4 | Jerry |
| 6 | Helen |
| 1 | Helen |
| 3 | Helen |
| 7 | Erdison |
| 8 | Linda |
| 10 | Tomson |
+------+---------+
7 rows in set (0.00 sec)
mysql> select t_id,_name from _test
-> where length(_name)>4;
+------+--------+
| t_id | _name |
+------+--------+
| 2 | Linda |
| 4 | Tomson |
| 6 | Helen |
+------+--------+
3 rows in set (0.00 sec)
mysql> select t_id,t_name from test
-> where length(t_name)>4
-> union
-> select t_id,_name from _test
-> where length(_name)>4;
+------+---------+
| t_id | t_name |
+------+---------+
| 4 | Jerry |
| 6 | Helen |
| 1 | Helen |
| 3 | Helen |
| 7 | Erdison |
| 8 | Linda |
| 10 | Tomson |
| 2 | Linda |
| 4 | Tomson |
+------+---------+
9 rows in set (0.00 sec)
从例子中可以看出两个表包含的相同行被覆盖了,因此,要想得到所有的结果,我们可以利用UNION ALL关键词
mysql> select t_id,t_name from test
-> where length(t_name)>4
-> union all
-> select t_id,_name from _test
-> where length(_name)>4;
+------+---------+
| t_id | t_name |
+------+---------+
| 4 | Jerry |
| 6 | Helen |
| 1 | Helen |
| 3 | Helen |
| 7 | Erdison |
| 8 | Linda |
| 10 | Tomson |
| 2 | Linda |
| 4 | Tomson |
| 6 | Helen |
+------+---------+
10 rows in set (0.00 sec)
17. 全文本查询
最常用的引擎是InnoDB和MyISAM,后者支持全文本查询
LIKE通配符匹配文本,正则表达式匹配文本与全文本查询的比较
1. 性能:通配符LIKE和正则表达式往往需要搜索表的所有行,由于行数的不断增加,这些搜索可能会非常费时。
2. 明确控制:是用通配符和正则表达式匹配,将会很难明确的控制匹配什么和不匹配什么。
3. 智能化结果:一个词的搜索将不会找出不包含该词但包含其他相关词的行。
17.1 使用全文本搜索
首先先创建一个引擎为MyISAM的表
mysql> create table ftext(
-> f_id int not null auto_increment,
-> f_name char(10) not null default '',
-> f_date datetime null default '2019-03-02',
-> f_text text null,
-> primary key(f_id),
-> fulltext(f_text)
-> )engine=MyISAM;
Query OK, 0 rows affected (0.11 sec)
插入数据
mysql> insert into ftext(f_name,f_text)
-> values(
-> 'American',
-> 'Customer complaint: rabblt has been able to detect
'> trap, food apparently less effective now.
'> Quantity varies,sold by the sack load. All guaranteed to
'> be breight and orange,and suitable for use as rabbit bait.');
Query OK, 1 row affected (0.00 sec)
使用通配符LIKE进行匹配
mysql> select f_text from ftext
-> where f_text like'%rabbit%';
使用全文本搜索
mysql> select f_text from ftext
-> where match(f_text) against('rabbit');
利用全文本搜索来返回结果的等级
mysql> select f_text,match(f_text) against('rabbit') as rank
-> from ftext;
查询拓展:可以搜索相关的内容,不一定含有搜索词
mysql> select f_text from ftext
-> where match(f_text) against('rabbit' with query expansion);
17.2 布尔文本搜索
可以搜索不包含某个词的结果
mysql> select f_text from ftext
-> where match(f_text) against('rabblt -sack*'
-> in boolean mode);
搜索包含rabblt和不包含以sack开头的结果
全文本布尔操作符常用如下:
布尔操作符 | 说明 |
+ - > < * ~
| 包含词,词必须存在 词必须不存在 包含且增加等级词 包含且减少等级词 词尾通配符 取消一个词的排序值
|
必须包含rabblt sack两个词
mysql> select f_text from ftext
-> where match(f_text) against('+rabblt +sack'
-> in boolean mode);
包含rabblt sack其中一个词
mysql> select f_text from ftext
-> where match(f_text) against('rabblt sack'
-> in boolean mode);
包含 rabblt sack这个短语
mysql> select f_text from ftext
-> where match(f_text) against('"rabblt sack"'
-> in boolean mode);
下面这个搜索匹配词rabblt和sack,降低后者的等级
mysql> select f_text from ftext
-> where match(f_text) against('+rabblt +(<sack)'
-> in boolean mode);
17.3 全文本搜索的使用说明
1. 索引短词(具有三个或者三个以下字符的词)通常被忽略。
2. 许多次出现的频率很高总是被忽略,搜索它们没有用处。规定一个词出现在50%及以上的行中,则将它作为一个非用词忽略。
3.如果表中的行数少于三行,则搜索不返回结果。
4. 忽略词的单引号,即don't索引为dont
5. 不具有词分隔符的语言(包括中文和日语)不能恰当的返回全文搜索结果