- 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)的行,于是上一个例子中的第一行被排除。
全文本布尔操作符
---------------------
原文:https://blog.csdn.net/captainNYS/article/details/87925582