表的连接【MySQL】

文章目录

  • 什么是连接
  • 测试表
  • 内连接
  • 外连接
    • 左外连接
    • 右外连接
    • 全外连接
  • 自然连接
  • 交叉连接
  • 参考资料

什么是连接

数据库的连接是指在数据库系统中,两个或多个数据表之间建立的关联关系,使它们可以进行数据的交互和操作。连接通常基于某种共同的字段或条件,用于将相关数据组合在一起。

连接操作的对象是表,可以认为是对若干表的笛卡尔积的筛选操作。

连接操作通常分为以下几种:

  1. 内连接(Inner Join):内连接返回两个数据表中满足连接条件的交集部分。只有当连接条件在两个表中都存在匹配时,才会返回结果。
  2. 外连接(Outer Join):外连接返回连接条件满足的结果,以及其中一个表中未匹配到的行。外连接分为左外连接(Left Outer Join)、右外连接(Right Outer Join)和全外连接(Full Outer Join),具体取决于哪个表的所有行都包括在结果中。
  3. 自然连接(Natural Join):自然连接是根据两个表中相同的列名自动进行连接的一种方式。它省略了连接条件,直接使用相同列名进行连接。
  4. 交叉连接(Cross Join):交叉连接返回两个表的笛卡尔积,即其中一个表的每一行都与另一个表的每一行组合,不需要连接条件。

这么分的原因是不同类型的连接操作适用于不同的场景和需求。内连接用于获取两个表中匹配的数据,外连接用于获取匹配以及未匹配的数据,自然连接适用于列名相同的表,而交叉连接则用于获取两个表的所有组合。通过不同类型的连接操作,可以灵活地处理数据表之间的关联关系,满足不同的查询需求。

这四种连接不要死记硬背,试着通过图示理解(下文引用自:数据库表连接的简单解释):

**所谓"连接",就是两张表根据关联字段,组合成一个数据集。**问题是,两张表的关联字段的值往往是不一致的,如果关联字段不匹配,怎么处理?比如,表 A 包含张三和李四,表 B 包含李四和王五,匹配的只有李四这一条记录。

很容易看出,一共有四种处理方法。

  • 只返回两张表匹配的记录,这叫内连接(inner join)。
  • 返回匹配的记录,以及表 A 多余的记录,这叫左连接(left join)。
  • 返回匹配的记录,以及表 B 多余的记录,这叫右连接(right join)。
  • 返回匹配的记录,以及表 A 和表 B 各自的多余记录,这叫全连接(full join)。
img

上图中,表 A 的记录是 123,表 B 的记录是 ABC,颜色表示匹配关系。返回结果中,如果另一张表没有匹配的记录,则用 null 填充。

这四种连接,又可以分成两大类:内连接(inner join)表示只包含匹配的记录,外连接(outer join)表示还包含不匹配的记录。所以,左连接、右连接、全连接都属于外连接。

此外,还存在一种特殊的连接,叫做"交叉连接"(cross join),指的是表 A 和表 B 不存在关联字段,这时表 A(共有 n 条记录)与表 B (共有 m 条记录)连接后,会产生一张包含 n x m 条记录的新表(见下图)。

img

测试表

image-20240223173257335

内连接

内连接(Inner Join):内连接返回两个数据表中满足连接条件的交集部分。只有当连接条件在两个表中存在匹配时,才会返回结果。

SELECT ... FROM t1 INNER JOIN t2 ON 连接条件 [INNER JOIN t3 ON 连接条件] ... AND 其他条件;

注意:内连接的条件通过连接条件指明,用户的其他筛选条件通过其他条件指明。

  • 对上表做内连接。
image-20240223173643272

SQL 的构造顺序是:

  1. 确定要连接的表:A INNER JOIN B
  2. 确定连接表的条件:ON…
  3. 确定其他筛选条件:AND…

注意 SQL 关键字执行的顺序,SELECT 操作的对象是两表的笛卡尔积,所以查询 ID 时要指定任意一个表的 ID,因为笛卡尔积中有两列。

由于 id=2,name=香蕉这条记录在 table2 中没有相同的属性,因此它不会被作为内连接的返回值。

外连接

外连接(Outer Join):外连接返回连接条件满足的结果,以及其中一个表中未匹配到的行。外连接分为左外连接(Left Outer Join)、右外连接(Right Outer Join)和全外连接(Full Outer Join),具体取决于哪个表的所有行都包括在结果中。

左外连接

SELECT ... FROM t1 LEFT JOIN t2 ON 连接条件 [LEFT JOIN t3 ON 连接条件] ... AND 其他条件;
  • 对上表做左外连接。
image-20240223174317091

这意味着即使香蕉没有价格,也会将它的所有信息显示,因为香蕉存在于左表中的记录。其中左表不存在的属性,将会以 NULL 值填充。

右外连接

SELECT ... FROM t1 RIGHT JOIN t2 ON 连接条件 [RIGHT JOIN t3 ON 连接条件] ... AND 其他条件;

在右表中插入一条 ID 不存在于左表的记录:

image-20240223174950933
  • 对上表进行右外连接。
image-20240223175255978

和左外连接类似地,右外连接会将右表存在而左表不存在的记录添加到返回值中,不存在的字段依然用 NULL 值填充。

注意一个细节,在左外连接和右外连接查询 ID 时,指定的表是和连接方向对应的,这也说明了 SELECT 关键字在查找时是按照连接方向进行的。

使用 SELECT * 来获取返回值,结果也是一样的。

全外连接

SELECT ... FROM t1 FULL JOIN t2

全外连接相当于对两个集合做加法,得到的是所有情况。

image-20240223180041495

自然连接

自然连接是一种特殊的连接,它省略了连接条件,直接使用两个表中相同列名进行连接。

SELECT ... FROM t1 NATURAL JOIN t2;
image-20240223180340075

这条 SQL 语句将会自动根据两个表中相同列名进行连接,返回结果中将包含这些相同列名的数据,并且自动过滤掉重复的列。

注意:笛卡尔积是两个表所有可能的行对组合,不考虑任何连接条件。例如,如果表 A 有 M 行,表 B 有 N 行,它们的笛卡尔积将会有 M * N 行。

自然连接避免了笛卡尔积中的大量无关组合,只返回在连接列上值匹配的行,因此结果集通常比笛卡尔积小得多。如果两个表没有列名相同的列,自然连接的结果将是一个空集,而不是笛卡尔积。

交叉连接

交叉连接返回两个表的笛卡尔积,即其中一个表的每一行都与另一个表的每一行组合。

SELECT ... FROM t1 CROSS JOIN t2;
image-20240223180535693

返回 table1 和 table2 的所有可能组合,即 table1 中每一行与 table2 中每一行的组合。

参考资料

  • 数据库表连接的简单解释

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.1_2 数据通信基础知识

文章目录 2.1_2 数据通信基础知识(一)典型的数据通信模型(二)数据通信相关术语(三)设计数据通信系统要考虑的3个问题(1)三种通信方式(2)串行传输 & 并行传…

开源的python 游戏开发库介绍

本文将为您详细讲解开源的 Python 游戏开发库,以及它们的特点、区别和应用场景。Python 社区提供了多种游戏开发库,这些库可以帮助您在 Python 应用程序中实现游戏逻辑、图形渲染、声音处理等功能。 1. Pygame 特点 - 基于 Python 的游戏开发库。…

C语言分析基础排序算法——交换排序

目录 交换排序 冒泡排序 快速排序 Hoare版本快速排序 挖坑法快速排序 前后指针法快速排序 快速排序优化 快速排序非递归版 交换排序 冒泡排序 见C语言基础知识指针部分博客C语言指针-CSDN博客 快速排序 Hoare版本快速排序 Hoare版本快速排序的过程类似于二叉树前序…

程序员常用小工具推荐

前言 工作或者学习时,常常有一些工具能帮到我们很多,本次简单列举和说明,如果有更多更好用的,欢迎讨论补充。 工具大全 网络分析工具 Wireshark,可以很清晰的解析和过滤网络包,也有助于分析网络的的传输原理。linux环…

基于FPGA的HyperRam接口设计与实现

一 HyperRAM 针对一些低功耗、低带宽应用(物联网、消费产品、汽车和工业应用等),涉及到外部存储,HyperRAM提供了更简洁的内存解决方案。 HyperRAM具有以下特性: 1、超低功耗:200MHz工作频率下读写不到50mW…

新书速览|Vue.js 3.x+Element Plus从入门到精通(视频教学版)

详解Vue.jsElement Plus框架各组件的用法,实战网上商城系统和图书借阅系统开发 本书内容 《Vue.js 3.xElement Plus从入门到精通:视频教学版》通过对Vue.js(简称Vue)的示例和综合案例的介绍与演练,使读者快速掌握Vue.j…

计算机网络—eNSP搭建基础 IP网络

目录 1.下载eNSP 2.启动eNSP 3.建立拓扑 4.建立一条物理连接 5.进入终端系统配置界面 6.配置终端系统 7.启动终端系统设备 8.捕获接口报文 9.生成接口流量 10.观察捕获的报文 1.下载eNSP 网上有许多下载eNSP的方式,记得还要下其它三个Virtual Box、Winpa…

HSCCTF 3th 2024 Web方向 题解wp

WEB-CHECKIN【*没出】 直接给了源码 <?php highlight_file(__FILE__); error_reporting(0); $a$_POST[1]; $b"php://filter/$a/resource/dev/null"; if(file_get_contents($b)"2024"){echo file_get_contents(/flag); }else{echo $b; }咋这么像 WEB…

python文件组织:包(package)、模块(module)、文件(file)

包&#xff1a; 模块所在的包&#xff0c;创建一个包用于组织多个模块&#xff0c;包文件夹中必须创建一个名为’__init__.py’的文件&#xff0c;以将其识别为包&#xff0c;否则只能算作是一个普通的目录。在使用该包时&#xff0c;init自动执行。 包可以多层嵌套&#xff…

使用 ReclaiMe Pro 进行 RAIDZ 数据恢复

天津鸿萌科贸发展有限公司是 ReclaiMe Pro 数据恢复软件授权代理商。 ZFS 是一个开源文件系统&#xff0c;主要用于 FreeNAS 和 NAS4Free 存储系统。在开发 ZFS 时&#xff0c;主要目标是可靠性&#xff0c;这是通过写时复制、冗余元数据、日志等不同功能来实现的。ZFS 使用自…

Redis核心数据结构之跳跃表

跳跃表 概述 跳跃表(skiplist)是一种有序数据结构&#xff0c;它通过在每个节点中维持多个指向其他节点的指针&#xff0c;从而达到快速访问节点的目的。跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找&#xff0c;还可以通过顺序性操作来批量处理节点。在大部分情况下&am…

VB 数据质量诊断软件(分析数据的完整性,合理性,准确性)-139-(代码+程序说明)

转载地址http://www.3q2008.com/soft/search.asp?keyword139 前言: 为何口出狂言,作任何VB和ASP的系统, 这个就是很好的一个证明 :) 又有些狂了... 数据库操作谁都会,接触的多了也没什么难的,VB编程难在哪?算法上,这个是一个算法题的毕业设计 哈哈忙活了足足有一○小时, …

C++进阶之路---多态(一)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、多态的概念 1.概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为…

IPSec NAT穿越原理

一、IPSec VPN在NAT场景中存在的问题 当某些组网中&#xff0c;有的分支连动态的公网IP地址也没有&#xff0c;只能由网络中的NAT设备进行地址转换&#xff0c;才能访问互联网&#xff0c;然而IPsec是用来保护报文不被修改的&#xff0c;而NAT需要修改报文的IP地址&#xff0c…

9、组合模式(结构性模式)

组合模式又叫部分整体模式&#xff0c;它创建了对象组的树形结构&#xff0c;将对象组合成树状结构&#xff0c;以一致的方式处理叶子对象以及组合对象&#xff0c;不以层次高低定义类&#xff0c;都是结点类 一、传统组合模式 举例&#xff0c;大学、学院、系&#xff0c;它们…

崇法致行法律知识竞赛活动方案

赛程安排分两天&#xff0c;两场进行。 第一天&#xff08;第一场&#xff09;&#xff08;初赛&#xff09; 共 16 个二级分行&#xff0c;每行三人&#xff0c;共16 个战队参赛。 第一轮——必答轮 在大屏幕上显示10个选择题&#xff08;5个单选、5个多选&#xff09;&…

docker安装ollama

拉取镜像 docker pull ollama/ollama 运行容器 &#xff08;挂载路径 D:\ollama 改成你自己喜欢的路径&#xff09; CPU only docker run -d -v D:\ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama Nvidia GPU&#xff08;没试过这个&#xff09; doc…

Vue脚手架

Vue脚手架 学习目标&#xff1a; 理解Node.js基本使用方法理解包资源管理器NPM的使用理解webpack的作用理解 vue-cli 脚手架 (重点)Element-UI 组件库 1.vue的格式&#xff1a;new Vue({//作用的视图el:"id选择器",//vue中的数据/*data:{key:value,key:value,...}…

判断链表回文

题目&#xff1a; //方法一&#xff0c;空间复杂度O(n) class Solution { public:bool isPalindrome(ListNode* head) {vector<int> nums; //放进数组后用双指针判断ListNode* cur head;while(cur){nums.emplace_back(cur->val);cur cur->next;}for(int i0…

Microsoft SQL Server 编写汉字转拼音函数

目录 应用场景 举例 函数实现 小结 应用场景 在搜索应用中&#xff0c;我们一般会提供一个搜索框&#xff0c;输入关健字&#xff0c;点击查询按钮以获取结果数据。大部分情况我们会提供模糊查询的形式以在一个或多个字段进行搜索以获取结果。这样可以简化用户的操作&…