MySQL学习(六)

十六、创建高级联结

使用表别名

别名除了用于列名和计算字段外,SQL还允许给表名起别名。有以下两个原因:

  • 缩短SQL语句
  • 允许在单条select语句中多次使用相同的表
    在这里插入图片描述

使用不同类型的联结

之前我们学习的都是内部联结或者是等值联结这样的简单联结。接下来我们将学习另外三种连接:自联结、自然联结和外部联结。

自联结

使用表别名的主要原因之一是能在单条select语句中不止一次引用相同的表。比如你发现某件商品存在问题,所以你想直到生产这个商品的供应商的其他商品有没有问题,我们应该怎么做?首先找商品ID为N的供应商,然后找出这个供应商生产的其他物品。
**用自联结而不用子查询:**自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句。虽然最终的i结果是相同的,但有时候处理联远比处理子查询快得多。

自然联结

无论何时对表进行联结,应至少有一个列出现在不止一个表中(被联结的列)。标准的联结(内部联结)返回所有数据,甚至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次。

外部联结

联结包含那些在相关表中没有关联行的行,这种类型的联结称为外部联结。
外部联结的类型:左外部联结和右外部联结。他们之间唯一的差别是所关联的表的顺序不同。也就是说,左外部联结可以通过颠倒from或where子句中表的顺序转换为右外部联结,所以,两种类型的外部链接客户想转换使用。

使用带聚集函数的联结

聚集函数用来汇总数据

使用联结和联结条件

  1. 注意所使用的联结类型。一般我们使用内部联结,但使用外部联结也是有效的
  2. 保证使用正确的联结条件,否则将返回不正确的数据
  3. 应该总是提供联结条件,否则会得出笛卡儿积
  4. 在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结

组合查询

组合查询

多数SQL查询都只包含从一个或多个表中返回数据的单条select语句。MySQL也允许执行多个查询(多条select语句),并将结果作为单个查询结果集返回。组合查询通常称为并或符合查询。
有两个基本的情况需要使用组合查询:

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

创建组合查询

使用union操作符来组合查询数条SQL查询。

使用union

union的使用很简单,只是给出每条select语句,在每条语句之间放上关键字union。
在这里插入图片描述

union规则

并是非常容易使用的,进行并时有几条规则需要注意:

  • union必须由两条或两条以上的select语句组成,语句之间用关键字union分隔(因此如果组合4条select语句,将要使用3个union关键字)
  • union中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)
  • 列数据类型必须兼容:类型不必完全相同,但必须时DBMS可以隐含地转换的类型(不同的数值类型或不同的日期类型)

包含或取消重复的行

union从查询结果集中自动去除了重复的行。
union与where: union几乎总是完成与多个where条件相同的工作。union all为union的一种形式,完成where子句完成不了的工作。如果确实需要每个条件的匹配行全部出现(包括重复行),则必须使用union all而不是where。

对组合查询结果排序

在用union组合排序时,只能使用一条order by子句,必须出现在最后一条select语句之后。
**组合不同的表:**为使表述比较简单,使用union的组合查询可以应用不同的表。

十八、全文本搜索

在本章我们要学习一下如何使用MySQL的全文本搜索功能进行高级的数据查询和选择

理解全文本搜索

并非所有引擎都支持全文本搜索: MySQL支持几种基本的搜索引擎,并非所有的都支持全文本搜索。两个最常用的是MyISAM和InnoDB,前者支持全文本搜索,后者不支持。
利用通配操作符匹配文本,使用like查找包含特殊值或部分值的行,基于文本的搜索作为正则表达式匹配列值的更近一步的介绍。这些搜索机制虽然非常有用,但是存在几个重要的限制:

  • 性能:通配符和正则表达式匹配通常要求MySQL尝试匹配表中的所有行。因此,由于被搜索行数不断增加,这些搜索可能非常耗时。
  • 明确控制:使用通配符和正则表达式匹配,很难明确的控制匹配什么和不匹配什么。
  • 智能化的结构:虽然基于通配符和正则表达式的搜索提供了非常灵活的搜索。但他们都不能提供一种智能化的选择结果的方法。

因为存在这些限制,全文本搜索可以解决。

使用全文本搜索

为进行全文本搜索,必须索引被搜索的列,而且随着数据的改变不断地重新索引。在索引之后select()可与match()和against()一起使用以实际执行搜索。

启用全文本搜索支持

在这里插入图片描述
不要在导入数据时使用fulltext: 更新索引要花时间,虽然不是很多,但毕竟要花时间。如正在导入数据到一个新表,此时不应该启用fulltext索引。应该先导入所有数据,然后再修改表,定义fulltext。

进行全文本搜索

在索引之后,使用match()和against()执行全文本搜索,其中match()指定被搜索地列,against()指定要使用地搜索表达式。
使用完整地match()说明 :传递给match()的值必须与fulltext()定义中的相同。如果指定多个列,则必须列出它们。
搜索不区分大小写: 除非使用Binary方式,否则全文本搜索不区分大小写
排序多个搜索项: 如果指定多个搜索项,则包含多数匹配词的那些行将具有比包含较少词(或仅有一个匹配)的那些行高的等级值。

使用查询扩展

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

  • 首先,进行一个基本的全文本搜索,找出与搜索条件匹配的所有行
  • 其次,MySQL检查这些匹配行并选择所有有用的词
  • 再其次,MySQL再次进行全文本搜索,这次不仅使用原来的条件,而且还使用所有有用的词

布尔文本搜索

  1. 要匹配的词
  2. 要排斥的词(如果某行包含这个词,则不返回该行,即使它包含其他指定的词也是如此);
  3. 排列提示(指定某些词比其他词更重要,更重要的词等级更高);
  4. 表达式分组
  5. 另外一些内容

即使没有fulltext索引也可以使用: 布尔方式不同于即使没有定义fulltext索引,也可以使用它,但这是一种非常缓慢的操作(其性能将随着数据量的增加而降低)。
in boolean mode的行为差异: 虽然这个例子的结果与没有in boolean mode的相同,但其行为有一个重要的差别。

在这里插入图片描述

全文本搜索的使用说明

  • 在索引全文本数据时,短词被忽略且从索引中排除。短词定义为那些具有3个或3个以下字符的词
  • MySQL带有一个内建的非用词列表,这些词在索引全文本数据时总是被忽略。如需要,可覆盖这个列表
  • 许多词出现的频率很高,搜索没有用处。因此,MySQL规定了一条50%规则,如一个词出现在50%以上的行中,则将作为一个非用词忽略。50%规则不用于in boolean mode.
  • 如表中的行数少于3行,则文本搜索不返回结果
  • 忽略词中的单引号
  • 不具有词分隔符的语言不能恰当的返回全文本搜索结构。
  • 仅M有ISAM数据库引擎支持全文本搜索

没有邻近操作符: 邻近搜索是许多文本搜索支持的一个特性,能搜索相邻的词,MySQL全文本搜索现在还不支持邻近操作符。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值