MySQL学习笔记(六)

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. 不具有词分隔符的语言(包括中文和日语)不能恰当的返回全文搜索结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值