MySQL学习笔记5(组合查询,全文本搜索)

17组合查询

1UNION实现组合查询

有两种基本情况,其中需要使用组合查询

  • 在单个查询中从不同的的表返回类似结构的数据。
  • 对单个表执行多个查询,按单个查询返回数据。

多数情况下,组合相同表的两个查询完成的工作与具有多个WHERE子句条件的单条查询完成的工作相同。UNION的使用较为简单,所需做的只是给出每条SELECT语句,在各条语句之间放上关键字UNION。

先看两个SELECT语句的返回结果:

第一条SELECT检索价格不高于5的所有商品。第二条SELECT使用IN找出供应商1001和1002生产的所有物品。

使用UNION组合这两条语句:

也可以使用OR返回同样的结果:

SELECT vend_id,prod_id,prod_price

FROM products

WHERE prod_price <=5

       OR  vend_id IN (1001,1002);

可见上述UNION语句较为冗杂,但是对于更复杂的过滤条件,例如从多个表(而不是单个表)中检索数据的情形,使用UNION会更容易。

例如,检索两个不同表的数据:

2UNION使用规则

  • UNION必须必须由大于等于两条的SELECT语句组成,语句之间用关键字UNION分隔。
  • UNION的每个查询必须包含相同数目的列、表达式、或聚集函数。
  • 列数据类型必须兼容:类型不必相同,但是必须是DBMS可以隐含转换的类型。

3去重

1中单独使用SELECT语句时分别返回4,5行,而UNION组合查询时一共返回8行,原因是使用UNION默认去重。如果想返回所有匹配行,可以使用UNION ALL。

18全文本搜索

并非所有的引擎都支持全文本搜索,最常用的两个搜索引擎MyISAM和InnoDB,前者支持全文本搜索,后者不支持。

1全文本搜索

8、9中分别介绍了LIKE关键字(通配符)和正则表达式用来检索数据,但存在几个限制:

  • 两者都尝试匹配表的所有行,被搜索数据不断增加是将会非常耗时
  • 两者很难明确地控制匹配什么和不匹配什么
  • 不区分包含单个匹配的行和多个匹配的行;一个特殊词搜索将不会找出不包含该词但包含其他相关词的行。

上述限制都可以通过全文本搜索来解决。使用全文本搜索时,MySQL不需要分别查看每个行,不需要分析处理每个词。MySQL创建指定列中各词的一个索引,搜索可以针对这些词进行。

2使用全文本搜索

为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。在对表列进行适当设计后,MySQL会自动进行所有的索引和重新索引。

一般在建表之处使用FULLLTEXT关键字指定列为全文本搜索。

举例如下(已指定note_text列为全文本搜索):

Match(note_text)指示MySQL针对指定的列搜索,Against('rabbit')指定词rabbit作为所搜文本。

3布尔文本搜索

即使没有FULLTEXT索引也可以使用,但其性能较差。

检索包含词heavy的所有行。(使用了关键字 IN BOOLEAN MODE,但实际没有使用任何布尔操作符)

再看匹配包含heavy但不包含任意以rope开始的词的行:

对比前一个结果,这一次仍然匹配heavy,但-rope*明确指示MySQL排除包含rope*(任何以rope开始的词,包含ropes)的行,于是上一个例子中的第一行被排除。

全文本布尔操作符

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值