组合查询

一.何为组合查询?
组合查询的目的就是利用UNION操作符将多条SELECT语句的查询结果组合成一个结果集,供我们使用。

有两种基本情况下需要使用组合查询:
1.在单个查询中从不同的表返回类似结构的数据
2.对单个表执行多个查询,按单个查询返回数据

二.创建组合查询
我们可以用UNION操作符来组合数条SQL查询,利用UNION可以给出多条SELECT语句,将他们的结果组合成单个结果集。

例子:假如我们需要价格小于等于5的所有物品的一个列表,而且还想包括供应商1001和1002生产的所有物品。

我们先来看单条语句的实现:

SELECT vend_id, prod_id,prod_price
FROM products
WHERE prod_price<=5;

上面语句查询的是价格小于等于5的所有物品的列表。

SELECT vend_id,prod_id, prod_price
FROM products
WHERE vend_id IN(1001,1002);

上面语句查询的是供应商1001,1002生产的所有物品。

下面是用UNION组合两条语句,一次执行:

SELECT vend_id, prod_id,prod_price
FROM products
WHERE prod_price<=5
UNION
SELECT vend_id,prod_id, prod_price
FROM products
WHERE vend_id IN(1001,1002);

我们得出的结果集就是上面两条单语句结果的并集。

当然,上面的功能我们也可以用WHERE来实现,也更为简洁,但对于更复杂的过滤条件,或者从多个表中检索数据的情形,使用UNION可能会更简单。

三.UNION规则

1.UNION必须由两条或以上的SELECT语句组成,语句之间用关键字UNION分隔
2.UNION中的每个查询必须包含相同的列,表达式或聚集函数(各个列不需要以相同的次序列出)
3.列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含转换的类型。

四.包含或取消重复的行
在执行UNION语句时,UNION从查询结果集中自动去除了重复地行,这是默认的行为,如果有需要我们可以改变它,如果想返回所有匹配行,可以使用UNION ALL而不是UNION。

五.对查询结果排序
SELECT语句的输出用ORDER BY子句排序,在用UNION组合查询时,只能用一条ORDER BY子句,且必须出现在最后一条SELECT语句之后,对于结果集,不存在用一种方式排序一部分,再用另一种方式排序另一部分,所以不允许使用多条ORDER BY子句。

例子:

SELECT vend_id, prod_id,prod_price
FROM products
WHERE prod_price<=5
UNION
SELECT vend_id,prod_id, prod_price
FROM products
WHERE vend_id IN(1001,1002)
ORDER BY vend_id, prod_price;

上面语句查询出的结果将以vend_id,prod_price 的顺序排序输出。

全文本搜索

一.使用全文本搜索
为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。
在索引之后,SELECT可与Match()和Against()一起使用以执行搜索。

1.启用全文本搜索支持
一般在创建表时启用全文本搜索:

CREATE TABLE productnotes
(note_id int  NOT NULL AUTO_INCERMENT,prod_id char(10) NOT NULL,note_date datetime  NOT NULL,note_text text NULL,PRIMARY KEY(note_id),FULLTEXT(note_text)//启用全文本搜索
)ENGINE=MyISAM;

上面的语句中有一个列名为note_text,为了进行全文搜索,MySQL根据子句FULLTEXT(note_text)的指示对它进行索引,在定义之后,MySQL自动维护该索引,在增加,更新或删除行时,索引随之自动更新。

注意:不要在导入数据时使用FULLTEXT。

2.进行全文本搜索
在索引之后,使用两个函数Match()和Aginst()执行全文本搜索,其中Match()指定被搜索的列,Against()指定要使用的搜索表达式。

例子:

SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('rabbit');//Match()指示MySQL针对指定的列进行搜索,Against()指定词作为搜索文本

注意:
1.传递给Match()的值必须与FULLTEXT()定义中的相同,如果指定多个列,则必须列出它们。
2.搜索不区分大小写,除非使用BINARY方式。

全文本搜索的一个重要部分就是对结果排序,具有较高等级的行(搜索文本靠前的行)先返回。

3.使用查询扩展
查询扩展用于设法放宽所返回的全文本搜索结果的范围。
在使用查询扩展时,MySQL对数据和索引进行两遍扫描来完成搜索:

首先,进行一个基本的全文本搜索,找出与搜索条件匹配的所有行

其次,MySQL检查这些匹配行并选择所有有用的词。

然后,MySQL再次进行全文本搜索,这次不仅使用原来的条件,而且还使用所有有用的词。

例子:

SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('anvils' WITH QUERY EXPANSION);

4.全文本搜索的使用说明
1.在索引全文本数据时,短词被忽略且从索引中排除,短词定义为那些具有3个或3个以下字符的词。
2.MySQL带有一个内建的非用词列表,这些词在索引全文本数据时总被忽略,如果需要,可以覆盖这个列表。
3.许多词出现的频率很高,搜索它们没有用处,所以MySQL规定了一条50%的规则,如果一个词出现在50%以上的行中,则将它作为一个非用词忽略。
4.如果表中的行数少于三行,则全文本搜索不返回结果。
5.忽略词中的单引号。
6.不具有词分隔符的语言不能恰当地返回全文搜索结构。

7.仅在MyISAM数据库引擎中支持全文本搜索。但在MySQL 8中InnoDB也支持全文索引了

MySql学习之组合查询(UNION)和全文本搜索(Match()和Against())相关推荐

  1. SQL学习之组合查询(UNION)

    1.大多数的SQL查询只包含从一个或多个表中返回数据的单条SELECT语句,但是,SQL也允许执行多个查询(多条SELECT语句),并将结果作为一个查询结果集返回.这些组合查询通常称为并或复合查询. ...

  2. MySQL(十)操纵表及全文本搜索

    一.创建表 MySQL不仅用于表数据操作,还可以用来执行数据库和表的所有操作,包括表本身的创建和处理. 创建表一般有如下两种方式: ①使用具有交互式创建和管理表的工具: ②直接使用MySQL语句操纵表 ...

  3. MySQL学习笔记:全文本搜索

    本文为本人学习书籍<MySQL必知必会>笔记系列,欢迎持续关注,有问题随时留言评论,一起探讨学习~ 18 全文本搜索 并非所有搜索引擎都支持全文搜索.最常用的两个搜索引擎MyISAM(支持 ...

  4. 《MySQL必知必会》学习笔记——组合查询、全文本搜索

    文章目录 第17章 组合查询 1. 创建组合查询 2. UNION规则 3. 包含或取消重复的行 4. 对组合查询结果排序 第18章 全文本搜索 1. 理解全文本搜索 2. 使用全文本搜索 2.1 启 ...

  5. 数据库9:联结表 高级联结 组合查询 全文本搜索

    第十五章联结表 Sql最强大的功能之一就是能在数据检索查询的执行中联结(join)表.联结是利用sql的select能执行的最重要的操作,能很好的理解联结及其语法是学习sql的一个极为重要的组成部分. ...

  6. MySQL数据检索+查询+全文本搜索

    [0]README 0.1)本文部分文字描述转自"MySQL 必知必会",旨在review"MySQL数据检索+查询+全文本搜索" 的基础知识: [1]使用子查 ...

  7. mysql 学习记录 全文本搜索

    第十八章 全文本搜索 mysql最常用的引擎是MYISAM和InnoDb,前者支持全文本搜索,后者不支持. 全文本搜索搜索速度更快,搜索条件更精确,搜索结果更智能化.使用like子句也可以完成,但全文 ...

  8. 快速回顾 MySQL:全文本搜索

    前提要述:参考书籍<MySQL必知必会> 文章目录 14.1 全文本搜索 14.1.1 启动全文本搜索 14.1.2 使用全文本搜索 14.1.3 使用查询扩展 14.1.4 使用布尔查询 ...

  9. mysql全文本搜索

    前言 1️⃣ :mysql环境准备 2️⃣ :简单的表查询 3️⃣ :通配符+正则表达式 4️⃣ :mysql函数与分组 5️⃣ :子查询_联结查询_组合查询 第一部分:我们准备环境:安装数据库+创建 ...

最新文章

  1. CRM User Status profile中Business Transaction字段的用途
  2. 修改zabbix后台登录账号和密码,提升为超级管理员
  3. 坑爹的去哪儿网订酒店经历
  4. python逐行读取字符串_python3.4.3下逐行读入txt文本并去重的方法
  5. [Java基础]Random
  6. 模板:2-SAT问题
  7. 权限组件之录入获取登入用户的所有权限
  8. 管理感悟:独当一面,很难
  9. 欢迎大家关注我的博客,让我们一起在知识的海洋中并肩自由翱翔!
  10. 如何判断函数极值点与拐点
  11. Android HttpClient Session保持
  12. T32使用-----抓取rpm dump
  13. 百度AI车牌识别测试
  14. 千万级中文公开免费聊天语料数据分享
  15. 一道关于SVM的机器学习作业题
  16. html5 2020视觉效果,体验未来:10个会让你惊叹不已的HTML5画布(CANVAS)技术应用演示-UI博客精选...
  17. 如何设置路由器并利用路由器+宽带猫实现单机或是多机共享自动拨号上网
  18. mac 全角/半角标点符号切换
  19. 特种机械车辆控制器SPC-CFMC-D24N20资料
  20. 电子计算机的思维导图,电脑上最好用的6款,思维导图软件测评

热门文章

  1. 高级算法工程师的主要职责说明(合集)
  2. WQ7033开发指南(基础篇)之1.0 开发环境搭建和编译
  3. 笑断肠:程序员的最高荣誉
  4. 一文搞懂四种 WebSocket 使用方式
  5. 快盘做网站服务器,快盘云服务器地址
  6. 合肥火车站为乌鲁木齐疼痛男孩开辟绿色通道
  7. js中的console.log()用法
  8. 作为程序员中的绅士,这10个技巧会让你的代码更加优雅
  9. windows快捷键+组合键+搜索命令
  10. 输入一个url到浏览器页面展示都经历了哪些过程