MySQL学习(联结,组合查询,全文本搜索)

news2024/11/25 4:46:45

联结

SQL最强大的功能之一就是能在数据检索查询的执行中联结表;

关系表

为什么要使用关系表?

  • 使用关系表可以储存数据不重复,从而不浪费时间和空间;
  • 如果有数据信息变动,只需更新一个表中的单个记录,相关表中的数据不用改动;
  • 由于数据无重复,显然数据是一致的,这使得处理数据更简单。

总之,关系表可以有效低存储和方便的处理,因此,关系数据库的可伸缩性远比非关系数据库要好。

可伸缩性:能够适应不断增加的工作量而不失败。涉及良好的数据库或应用程序称之为可伸缩性好; 

这是一个例子,他找出了群号为49289306112的群里面的所有群聊成员;

在使用联结查询的时候,一定要有where语句,如果没有的话就会输出巨多的没用的数据,有了where语句还不行,还要保证where语句的准确性,如果你的where语句不准确的话,不正确的过滤条件将导致MySQL返回不正确的数据;

除了上面的语法,还有一种写法,能够实现一样的功能;

 这里与前面的区别就是FROM子句不同,这里,两个表之间的关系是from子句的组成部分,以INNER JOIN指定。在使用这种语法时,联结条件用特定的ON子句而不是WHERE子句给出。传递ON的实际条件与传递给WHERE的相同。

至于这两种语法选择哪一种,ANSI SQL规范首选INNER JOIN语法,此外,尽管使用WHERE子句定义联结的确比较简单,但是使用明确的联结语法能够确保不会忘记联结条件,有时候这样做也能影响性能;

联结多个表

SQL对一条SELECT语句中可以联结的表的数目没有限制。创建联结的基本规则也相同,都是先列出所有表,然后定义表之间的关系;

性能考虑:MySQL在运行时对联结表的处理时非常的耗费资源的,因此不要联结不必要的表,联结的表越多,性能下降越厉害。

 在之前的学习中我们学习了子查询,子查询和联结都能达到目的,但是他们两个不是说哪个一定好,这个要看情况而定;

创建高级联结

 之前学习的AS可以为列创建别名,但是其实AS也能够给表建立别名;

注意:表别名只在查询执行中使用。与列别名不一样,表别名不返回到客户机。

联结使用的某些要点

  • 注意所使用的联结类型,一般我们使用内部联结,但使用外部联结也是有效的。
  • 保证使用正确的联结条件,否则会返回不正确的数据。
  • 应该总是提取联结条件,否者会得出迪卡尔积。(两个表的所有组合情况,大量数据)
  • 在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型。虽然这样做是合法的,一般也很有用,但是应该在一起测试它们之前,分别测试每个联结。这样可以使得故障排除更为简单。

组合查询

组合查询就是利用UNION操作符将多条select语句组合成一个结果集

在下面两个基本情况里面要用到组合查询:

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

 在写qq聊天室项目时,我用到了组合查询,因为在好友关系表里面A是B的好友,那么B也是A的好友,所以在查询时,我们即要查看自己在A时有多少个B好友,又要查找自己为B时有多少给A好友;

这个UNION就是查询了存款大于2000和年龄小于19的结果;

UNION使用规则:

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

 小细节:

使用UNION时,它会默认将多条select语句查询到的重复的行去重,所以在使用UNION时,重复的行会被去除,但是我们需要的话,也可以使用UNION ALL来获得所有的匹配行;

当我们想要对组合查询结果进行排序的时候,只能使用一条ORDER BY子句,它必须出现在最后一条select语句之后,对于结果集,不存在用一种方式排序一部分,而又用另一种方式排序宁一部分的情况,因此不允许使用多条ORDER BY语句;

上面的例子中的组合查询使用的均是demo1表,但是UNION可以用于组合查询不同的表;

全文本搜索

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

在之前我们学习了使用LIKE通配符来搜索文本,还有REGEXP操作符后面加正则表达式来搜索行;虽然这些搜索机制很有用,但是存在几个重要的限制:

  • 性能——通配符和正则表达式匹配通常要求MySQl尝试匹配表中所有行(而且这些搜索极少使用表索引)。因此,由于被搜索行数不断增加,这些搜索可能会非常耗时;
  • 明确控制——使用通配符和正则表达式匹配,很难(而且并不总是能)明确地控制匹配什么和不匹配什么。例如,指定一个词必须匹配,一个词必须不匹配,而一个词仅在第一个词确实匹配的情况下才可以匹配或者才可以不匹配。
  • 智能化的结果——虽然基于通配符和正则表达式的搜索提供了非常灵活的搜索,但是它们都不能提供一种智能化的选择结果的方法。例如,一个特殊值的搜索会返回包含该词的所有行,而不区分包含单个匹配的行和包含多个匹配的行(按照可能是更好的匹配来排列它们)。类似,一个特殊词的搜索将不会找出不包含该词但是包含其他相关词的行。

 首先,我们先建一个表:

 这里FULLTEXT(note_text) 表示将note_text设置为全文本查找的字段;

然后就是插入数据:

 然后首先测试like模糊查询

 查询结果分析:应为like模糊查询是在整个数据中查看有没有包含'fiction'这个单词的,如果有就过滤出来,而在我插入的数据中,1和5是有的;

 然后再是全文本搜索

结果:

再测试全文本搜索-布尔文本搜索

 在全文本搜索中常用的布尔运算符

结果:

 使用扩展查询

 这个会根据包含fiction的两条行中的数据中的其他单词来对其他行进行匹配,相当与找到了正确答案还要找与正确答案类似的答案;

结果:

 全文本搜索-显示排名字段按照匹配度由高到低排序

 结果:

 细节:Match( )和Against( )出现的位置对结果的影响较大,当Match( )和Against( )出现在where子句中时,只会返回匹配到的行,但是如果Match( )和Against( )出现在SELECT中的话,就会使得所有的行全部被返回,Match( )和Against( )用来建立一个计算列(别名为rank),此列包含全文本搜索计算出的等级值。等级由MySQL根据行中词的数目,唯一词的数目,整个索引中词的总数以及包含该词的行的数目计算出来,并且这个值还与唯一词所处的位置有关,唯一词靠前的值较高,靠后的值较低。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/599276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

研发工程师玩转Kubernetes——Node失效后的Pod的调度实验

在《研发工程师玩转Kubernetes——多Worker Node部署》中,我们创建了Master Node: UbunutA,以及四个Worker Node:UbunutB、UbunutC、UbunutD和UbunutE。本节我们将使用Deployment创建只含有一个nginx的Pod,然后关掉它所在的主机以模拟Node失效…

使用Adobe Acrobat DC对.jpg和.png格式图片转换为.eps图片格式举例

使用Adobe Acrobat DC对.jpg和.png等格式图片转换为.eps图片格式举例 在进行有的文档排版编辑时候(比如使用winEdt进行排版CTEX文件时候),需要添加.eps格式的图片,然而电脑中的画图,word和ppt等中无法实现.eps格式图片…

centos7 glib2.0 arm版本的编译

最近在看bluez代码,想编译个例子来玩一下,然后bluez里的例子会用到 libglib-2.0 库里的接口,于是开始了漫长的编译 arm 版本的 libglib-2.0,Linux 系统有时就是很麻烦,要编译一个库,结果发现依赖一大堆库&a…

Linux命令学习之帮助命令man

cat /proc/version和uname -a可以查看CentOS内核使用版本。 我使用的Linux操作系统发行版本号是7.6.1810,可以通过cat /etc/redhat-release进行查看。 man man是manual的缩写,是操作说明的意思。 使用man touch想要看一下touch的使用帮助,…

OpenMMLab开营笔记

摘要 很高兴能加入OpenMMLab AI实战营,成为第二期4班的一名学员。OpenMMLab经过几年的发展和沉淀,其开源项目已经覆盖到计算机视觉的各个领域。OpenMMLab 为香港中文大学-商汤科技联合实验室 MMLab 开源的算法平台,不到两年时间,…

文件操作之文件包含全解(41)

<!#include file”1.asp”--> 作者&#xff1a;沙漠里的鲸 https://www.bilibili.com/read/cv14178731/ 出处&#xff1a;bilibili 文件包含的作用就是将这个文件包含进去之后&#xff0c;会调用指定文件的代码。先将文件包含才能执行里面的一些相关代码&#xff0c;比如…

SAP-MM-标准报表路径

一、SAP MM模块系统自带的标准报表很多&#xff0c;常见报表都放在每个主题的“清单显示”和“报表”文件夹下&#xff0c;如下图所示&#xff1a; 二、另外&#xff0c;还有一些报表&#xff0c;放在另外一个地方&#xff0c;需要时&#xff0c;可以随时进行查看&#xff0c;前…

陷入困境?Taos创建超表带来的错误!

taos创建超表时报错 运行如下命令 let res await cursor.query("CREATE STABLE meters1 (ts TIMESTAMP, value FLOAT, slot INT,rack INT,nameId VARCHAR(32),adName VARCHAR(32),dbNumber INT,dataType VARCHAR(28), unit VARCHAR(28)) TAGS (location binary(64), gr…

2GT齿轮的齿形参数

文章目录 2GT齿轮的齿形参数概述笔记齿的种类方形齿半圆弧齿全圆弧齿精确圆弧齿修正圆弧齿梯形齿齿形参数用SW画一个2GT齿END 2GT齿轮的齿形参数 概述 零件上用到了2GT的同步轮和惰轮, 想在装配图上将2个齿轮皮带都画上, 看看有没有干涉. 整体修改是否合理. 在淘宝店家的主页…

Linux系统下imx6ull QT编程——开发环境及 U盘拷贝文件(十)

Linux QT编程 文章目录 Linux QT编程前言一、开发环境二、文件拷贝 前言 前面学习了一些基础&#xff0c;然后qt我也有学过&#xff0c;直接动手在开发板上进行编程吧&#xff0c;但是开发板需要安装环境&#xff0c;需要拷贝一些文件&#xff0c;我使用得是U盘。 一、开发环…

【C++进阶5-红黑树】噩梦般的存在?手提AVLTree暴揍红黑树!

今天&#xff0c;带来无数人的噩梦——红黑树的讲解。文中不足错漏之处望请斧正&#xff01; 如果还没看过AVLTree讲解的一定要去看看&#xff0c;看完才能更好理解红黑树&#xff01; 是什么 红黑树是自平衡的二叉搜索树。 红黑树的规则: 每个结点非黑即红 根结点为黑叶子…

程序设计综合实习(C语言):考勤管理系统

一、目的 1&#xff0e;调动创新能力的培养 二、实习环境 Visual Studio 2022 三、实习内容与步骤 问题描述&#xff1a; 每个员工信息包括工号、姓名、年龄、性别、部门等&#xff1b; 功能要求&#xff1a; &#xff08;1&#xff09;能够增加、删除、修改员工信息。 &…

[CTFTraining] ASIS CTF 2019 Quals Unicorn shop

​ 我们随便买一件商品&#xff0c;1~3都显示&#xff1a; ​ 只有第4个显示&#xff1a; ​ 只允许输入一个字符&#xff0c;题目叫Unicorn&#xff0c;猜测为Unicode。在Unicode - Compart搜索比千大的Unicode码&#xff1a; ​ 最后填进去买下商品得到flag。 另外&#…

CDGA 认证:第四章 数据架构(重点章节)习题集解析

1. 企业架构不包括哪项&#xff1f;&#xff08; &#xff09; A 业务架构 B 数据架构 C 系统架构 D 技术架构 【答案解析】DAMA-DMBOK2 P72 2. 关于架构设计生命周期描述错误的是&#xff1f;( ) A 可以是针对当前的 B 可以是面向未来的 C 可以是已实施完成的 D 可以是已经…

Flutter 对话框【代码实践】

Flutter 对话框【代码实践】 文章目录 Flutter 对话框【代码实践】一、普通对话框1、示例一&#xff1a;圆角、背景截图代码 一、普通对话框 1、示例一&#xff1a;圆角、背景 截图 代码 Center(child: ElevatedButton(onPressed: () {showDialog(context: context,builder:…

Spring Boot如何实现分布式系统中的服务发现和注册?

Spring Boot如何实现分布式系统中的服务发现和注册&#xff1f; 随着互联网的快速发展&#xff0c;越来越多的企业开始将自己的业务迁移到分布式系统中。在这种情况下&#xff0c;服务发现和注册变得尤为重要。对于分布式系统中的每个服务来说&#xff0c;它需要知道其他服务的…

数据可视化——使用echars图表展示

目录 1、前言 2、解决方案 2.1、echars&#xff08;前端等组件库&#xff09; 2.2、PPT等其他软件工具 2.3、使用flourish等在线数据可视化制作平台 2.4、自己用代码实现 1、前言 有一个小作业&#xff0c;需要自己收集一组数据&#xff0c;然后进行数据可视化&#xff0…

QListWidget和QListView的使用和item点击事件

QListWidget和QListView很常用&#xff0c;但是使用上功能类似&#xff0c;往往容易分不清区别&#xff0c;但是不知道如何选择。这里总结下二者之间的区别和使用&#xff0c;分享给有需要的人&#xff0c;有需要的可点击收藏。 QListView介绍 QListView是Qt中用于显示列表的一…

程序在内存中的分布

1. 具体分布细节由编译器决定 2. 分布图 3. 静态局部变量通常被存放在程序的.data段中。 一般地&#xff0c;静态局部变量定义在函数体内&#xff0c;在函数执行时&#xff0c;它会在静态存储区分配内存&#xff0c;并且只被初始化一次。因为静态局部变量是在编译阶段产生的&…

SpringCloud GateWay 学习

SpringCloud GateWay 文章目录 SpringCloud GateWay1 Gateway 介绍2 代码实现 1 Gateway 介绍 有一个前后端分离项目&#xff0c;分析如图 使用网关服务Gateway&#xff0c;重构项目架构 Gateway 是在 Spring 生态系统之上构建的 API 网关服务&#xff0c;基于 Spring &#x…