MySQL 表连接 JOIN

2023-11-09

参考

前言

建表语句

表a

CREATE TABLE `a_table` (
  `a_id` int(11) DEFAULT NULL,
  `a_name` varchar(10) DEFAULT NULL,
  `a_part` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

表b

CREATE TABLE `b_table` (
  `b_id` int(11) DEFAULT NULL,
  `b_name` varchar(10) DEFAULT NULL,
  `b_part` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

测试数据

表a

mysql> SELECT * FROM table_a;
+------+--------+-----------+
| a_id | a_name | a_part    |
+------+--------+-----------+
|    1 | 老潘   | 总裁部    |
|    2 | 老王   | 秘书部    |
|    3 | 老张   | 设计部    |
|    4 | 老李   | 运营部    |
+------+--------+-----------+

表b

mysql> SELECT * FROM table_b;
+------+--------+-----------+
| b_id | b_name | b_part    |
+------+--------+-----------+
|    2 | 老王   | 秘书部    |
|    3 | 老张   | 设计部    |
|    5 | 老刘   | 人事部    |
|    6 | 老黄   | 生产部    |
+------+--------+-----------+

表a 和 表b内连接
也就是笛卡尔积
第一个表的每一行都与第二个表中的没每一行连接

mysql> select * from table_a inner join table_b;
+------+--------+-----------+------+--------+-----------+
| a_id | a_name | a_part    | b_id | b_name | b_part    |
+------+--------+-----------+------+--------+-----------+
|    1 | 老潘   | 总裁部    |    2 | 老王   | 秘书部    |
|    2 | 老王   | 秘书部    |    2 | 老王   | 秘书部    |
|    3 | 老张   | 设计部    |    2 | 老王   | 秘书部    |
|    4 | 老李   | 运营部    |    2 | 老王   | 秘书部    |
|    1 | 老潘   | 总裁部    |    3 | 老张   | 设计部    |
|    2 | 老王   | 秘书部    |    3 | 老张   | 设计部    |
|    3 | 老张   | 设计部    |    3 | 老张   | 设计部    |
|    4 | 老李   | 运营部    |    3 | 老张   | 设计部    |
|    1 | 老潘   | 总裁部    |    5 | 老刘   | 人事部    |
|    2 | 老王   | 秘书部    |    5 | 老刘   | 人事部    |
|    3 | 老张   | 设计部    |    5 | 老刘   | 人事部    |
|    4 | 老李   | 运营部    |    5 | 老刘   | 人事部    |
|    1 | 老潘   | 总裁部    |    6 | 老黄   | 生产部    |
|    2 | 老王   | 秘书部    |    6 | 老黄   | 生产部    |
|    3 | 老张   | 设计部    |    6 | 老黄   | 生产部    |
|    4 | 老李   | 运营部    |    6 | 老黄   | 生产部    |
+------+--------+-----------+------+--------+-----------+
16 rows in set (0.00 sec)

一、表连接JOIN基础

1、什么是表连接、什么是JOIN

  • 当需要同时显示多个表中的字段时, 就可以用表连接来实现这样的功能.
  • SQL 中使用 JOIN 字段来进行表连接.
  • SQL JOIN 用于根据两个或多个表中的列之间的关系, 从这些表中查询数据

2、表连接的分类

2.1、内连接

什么是内连接
内连接是指连接结果仅包含符合条件的行, 参与连接的两(或多)个表都应该符合条件.
内连接的语法

SELECT * FROM table_a INNER JOIN table_b ON condition
SELECT * FROM table_a, tabke_b where condition

在这里插入图片描述

  • INNER JOIN 前后为要连接的表, 如果没有ON条件, 就是笛卡尔积的结果
  • INNER JOIN 和JOIN 相同
  • ON 后面为筛选条件
  • 第二句没有连接条件的情况下和第一句在语意上等效
  • 然而, 逗号运算符优先级低于 INNER JOIN, CROSS JOIN, LEFT JOIN等等. 如果在存在连接条件时逗号连接与其它连接类型混合使用, 则可能会出现形式错误. 之后讲解
Unknown column 'col_name' in 'on clause'

2.2、外连接

什么是外连接
连接结果不仅包含符合连接条件的行同时也会包含自身不符合条件的行. 包括左连外连接、有外连接和全外连接.

外连接分类

  • 左连接(左外连接) 关键字 LEFT JOIN ON/ LEFT OUTER JOIN ON
  • 右连接(右外连接) 关键字 RIGHT JOIN ON/RIGHT OUTER JOIN ON
  • 全外连接 MYSQL 不支持, 可以使用其它方式替换解决

左连接语句
左连接将左表的记录全部表示出来, 而右表只会显示符合搜索条件的记录. 右表记录不足的的地方均为NULL
在这里插入图片描述

SELECT * FROM table_a LEFT JOIN table_b ON table_a.a_id = table_b.b_id;

结果

+------+--------+-----------+------+--------+-----------+
| a_id | a_name | a_part    | b_id | b_name | b_part    |
+------+--------+-----------+------+--------+-----------+
|    2 | 老王    | 秘书部     |    2 | 老王   | 秘书部    |
|    3 | 老张    | 设计部     |    3 | 老张   | 设计部    |
|    1 | 老潘    | 总裁部     | NULL | NULL  | NULL      |
|    4 | 老李    | 运营部     | NULL | NULL  | NULL      |
+------+--------+-----------+------+--------+-----------+

右连接语句
右连接将右表的纪录全部显示出来, 而左表只会显示符合搜素条件的记录. 左表记录不足的地方均为NULL
在这里插入图片描述

SELECT * FROM table_a RIGHT JOIN table_b ON table_a.a_id = table_b.b_id;

结果

+------+--------+-----------+------+--------+-----------+
| a_id | a_name | a_part    | b_id | b_name | b_part    |
+------+--------+-----------+------+--------+-----------+
|    2 | 老王    | 秘书部     |    2 | 老王   | 秘书部    |
|    3 | 老张    | 设计部     |    3 | 老张   | 设计部    |
| NULL | NULL   | NULL      |    5 | 老刘   | 人事部    |
| NULL | NULL   | NULL      |    6 | 老黄   | 生产部    |
+------+--------+-----------+------+--------+-----------+

MYSQL全连接的实现
返回左右表匹配的行, 并且返回左表不足的地方为NULL, 右表不足的地方为NULL, 其实就是左连接和右连接的集合
在这里插入图片描述

SELECT * FROM table_a LEFT JOIN table_b ON table_a.a_id = table_b.b_id UNION
SELECT * FROM table_a RIGHT JOIN table_b ON table_a.a_id = table_b.b_id;

结果

+------+--------+-----------+------+--------+-----------+
| a_id | a_name | a_part    | b_id | b_name | b_part    |
+------+--------+-----------+------+--------+-----------+
|    2 | 老王   | 秘书部      |    2 | 老王   | 秘书部    |
|    3 | 老张   | 设计部      |    3 | 老张   | 设计部    |
|    1 | 老潘   | 总裁部      | NULL | NULL   | NULL    |
|    4 | 老李   | 运营部      | NULL | NULL   | NULL    |
| NULL | NULL   | NULL      |    5 | 老刘   | 人事部    |
| NULL | NULL   | NULL      |    6 | 老黄   | 生产部    |
+------+--------+-----------+------+--------+-----------+

2.3、等值连接

什么是等值连接
在连接条件中使用等于号(=)运算符比较被连接的列, 其查询结果中列出被连接表中的所有列, 包括其中重复列.
等值连接是内连接的子集, 等级连接是特殊的内连接, 条件使用等号的内连接
等值连接语句

SELECT * FROM table_a INNER JOIN table_b ON table_a.a_id = table_b.b.id where table_a.a_id = table_b.b_id;
SELECT * FROM table_a , table_b where table_a.a_id = table_b.b_id;

结果

+------+--------+-----------+------+--------+-----------+
| a_id | a_name   | a_part    | b_id | b_name   | b_part    |
+------+--------+-----------+------+--------+-----------+
|    2 | 老王    | 秘书部     |    2 | 老王   | 秘书部     |
|    3 | 老张    | 设计部     |    3 | 老张   | 设计部     |
+------+--------+-----------+------+--------+-----------+

2.4、自然连接

什么是自然连接
自然连接是一种特殊的等值连接, 他要求两个关系表中进行连接的必须是相同的属性列(名字相同), 无须添加连接条件, 并且在结果中消除重复的属性列.
所有相同名称的列的内容相同才会有结果
自然连接关键字

... NATURAL JOIN ...

自然连接语句
最上面两个表进行自然连接的结果为空, 因为没有相同名称的列, 将两个表的a_name、b_name变为name 可以进行自然连接

SELECT * FROM table_a NATURAL JOIN table_b

结果

+--------+------+-----------+------+-----------+
| name   | a_id | a_part    | b_id | b_part    |
+--------+------+-----------+------+-----------+
| 老王    |    2 | 秘书部     |    2 | 秘书部    |
| 老张    |    3 | 设计部     |    3 | 设计部    |
+--------+------+-----------+------+-----------+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 表连接 JOIN 的相关文章

  • 如果 Row1 = 值 1,则更新其他行

    我有一个小的 php 脚本 用于访问 mySql 数据库 我想在数据库中插入新记录之前查看该数字 值 1 是否等于数据库中的记录 这也在第 1 行 所以我想 查看传入的电话号码是否等于数据库中的电话号码 如果是这样 则必须保持电话号码相同的
  • 错误代码:1305。函数或过程不存在

    因此 我在 MySQL 中创建一个函数 然后尝试向用户授予使用该函数的权限 但我无法这样做 这就是我正在做的 DELIMITER USE rxhelp36 scbn DROP FUNCTION IF EXISTS businessDayDi
  • 在 jQuery AJAX 成功中从 MySql 获取特定响应

    好吧 我有这个 ajax 代码 它将在 Success 块中返回 MySql 的结果 ajax type POST url index php success function data alert data My Query sql SE
  • 在存储过程中验证用户的最简单方法?

    我需要一个存储过程 可以通过发送以下内容来检查登录尝试时他们是否是有效用户login and password查看它们在数据库中是否匹配 有没有一种简单的方法可以做到这一点 如果没有更多信息 我目前能提供的最好信息是 CREATE STOR
  • 数据库字段中的逗号分隔值

    我有一个产品表 该表中的每一行对应一个产品 并由唯一的 ID 标识 现在 每个产品都可以有多个与该产品关联的 代码 例如 Id Code 0001 IN ON ME OH 0002 ON VI AC ZO 0003 QA PS OO ME
  • ORDER BY 字段内的 MySQL 子查询。 (没有内连接)

    有很多与此相关的问题 但都具有使用内部联接的相同答案 这 我认为 在这里是不可能的 如果我错了请告诉我 我现在正在做的是调用两个不同的 mysql 查询来获取结果 它工作完美 db gt query SELECT FROM meta WHE
  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 将庞大数据库从亚马逊RDS导出到本地mysql

    我在 Amazon RDS 上有一个 mysql 数据库 大约 600GB 数据 我需要将其移回本地专用服务器 但我不知道从哪里开始 每次我尝试初始化 sqldump 时它都会冻结 有没有办法将其移至 S3 甚至可能在开始下载之前将其分成更
  • 如何从 SQL Server 2008 查询结果中删除“NULL”

    我有一个包含 59 列和超过 17K 行的表 很多行都有NULL在某些列中 我想删除NULL以便查询返回空白 而不是NULL 我可以运行一些更新功能来替换所有NULL with 使用 SQL Server 2008R2 Management
  • 如何识别拼写不同的相似单词

    我想从数据库中过滤掉重复的客户名称 一位客户可能有多个同名但拼写差异不大的系统条目 这是一个示例 名为 Brook 的客户可能有 3 个系统条目 有了这个变化 布鲁克 贝尔塔 布鲁克 贝尔塔 比鲁克 贝尔塔 假设我们将此名称放入一个数据库列
  • 删除数据库中的行后如何重新排序ID

    我正在使用 C 来制作具有 sql 数据库的程序 在数据库中我有一个名为Workers 它有一个自动增量和主键ID column 当我删除一条记录时 ID 之间会出现间隙 删除记录后如何重新排序 ID UPDATE 我要做的就是找到记录后将
  • 解析带下划线的 SQL Server 数字文字

    我想知道它为什么有效以及为什么它不返回错误 SELECT 2015 11 Result 11 2015 第二种情况 SELECT 2 1 a a 2 1 检查元数据 SELECT name system type name FROM sys
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • 我不断收到错误“关系 [TABLE] 不存在”

    我一直在尝试查询数据库中的两个表 在服务器资源管理器中 我可以看到两个表 甚至可以看到其中的列 我们将它们称为 Schema table1 和 Schema table2 其中 Schema 的第一个字母大写 我尝试运行以下查询 selec
  • 学说迁移后备

    我们正在使用原则迁移 当迁移包含多个操作并且其中一个操作失败时 通常会出现问题 例如 如果迁移添加了 5 个外键 其中第 5 个失败 而字段长度不同 则修复字段错误并重新生成迁移不会not修复整个问题 而现在出现一个与 4 个密钥已存在有关
  • SQL 约束以防止根据列的先前值更新列

    是否可以使用检查约束 或其他一些技术 来防止在更新记录时设置与其先前值相矛盾的值 一个例子是 NULL 时间戳 表明发生了某些事情 例如 file exported 一旦文件被导出并且具有非 NULL 值 就不应再将其设置为 NULL 另一
  • 如何使用 BigQuery 有效地选择另一个表中匹配子字符串的记录?

    我有一个包含数百万个字符串的表 我想将其与包含大约两万个字符串的表进行匹配 如下所示 standardSQL SELECT record FROM record JOIN fragment ON record name LIKE CONCA
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同
  • SQL 更新 - 更新选定的行

    我正在使用 SQL Server 2008 我有一个名为MYTABLE有两列 ID STATUS 我想编写一个存储过程来返回其记录STATUS是 0 但是这个存储过程必须更新STATUS返回行数为 1 如何在单个查询中执行此选择和更新操作

随机推荐

  • 虹软24届校招--AIGC&;图像处理&;产品经理&;算法优化

    比亚迪求职意向分类 8 19美团笔试 外卖骑手一面面经 外卖骑手一面面经 比亚迪求职意向分类 比亚迪开了但没完全开 比亚迪已开 外卖骑手一面面经 比亚迪 地平线校招正式批 美团测开校招一面 2023 华为笔试题 0830 美团 测开 到店事
  • Python中的map()函数

    前言 今天做题时遇到了map 函数 来学习一下 如果感觉博主的文章还不错的话 还请关注 点赞 收藏三连支持一下博主哦 目录 map函数 描述 语法 返回值 实例 map函数 描述 map在这里不是地图的意思 在编程领域 map一般作 映射
  • 富文本组件VueQuill添加源代码编辑功能

    文章目录 前言 一 VueQuill地址 二 Module quill html edit button 的位置 二 使用步骤 1 安装依赖 2 修改富文本组件 src components Editor index vue 3 验证 总结
  • Linux生成dumpcore并进行调试,以及addr2line的用法

    1 在终端中输入ulimit c 如果结果为0 说明当程序崩溃时 系统并不能生成core dump 2 使用ulimit c unlimited命令 开启core dump功能 并且不限制生成core dump文件的大小 如果需要限制 加数
  • Android 重写系统Crash处理类,保存Crash信息到SD卡 和 完美退出程序的方法

    转载时注明地址 http blog csdn net xiaanming article details 9344703 我们开发Android应用的时候 当出现Crash的时候 系统弹出一个警告框 如下图一 有些手机会黑屏几秒钟然后还伴随
  • C语言:分支语句和循环语句(超详解)

    目录 编辑 什么是语句 分支语句 选择结构 if语句 应该注意的是 switch语句 运用练习 循环语句 while循环 for循环 break和continue在for循环中 for循环的变换使用 do while 循环 do while
  • Eclipse的switch workspace删除多余workspace

    很多朋友很懊恼 如何删除eclipse里的switch workspace不要的workspace 这里来介绍一个简单的操作方法 方法 步骤 第一步 删除项目文件夹 找到目录下的项目文件夹 右键删除或者 Delete 按钮 第二步 修改or
  • 查看数据库某个schema下哪张表占的空间大

    为了查询schema下某个表占用的空间问题 以便处理分析问题 直接复制粘贴 改schema 即可 select TABLE NAME concat truncate data length 1024 1024 2 MB as data si
  • Cpu运作原理与机制,那么CPU如何跑的更快?

    前言 代码都是由 CPU 跑起来的 我们代码写的好与坏就决定了 CPU 的执行效率 特别是在编写计算密集型的程序 更要注重 CPU 的执行效率 否则将会大大影响系统性能 CPU 内部嵌入了 CPU Cache 高速缓存 它的存储容量很小 但
  • 数学建模中的常见模型

    数学建模中比较常见的几种模型 一 预测与预报 1 灰色预测模型 必须掌握 满足两个条件可用 数据样本点个数少 6 15个 数据呈现指数或曲线的形式 例如 可以通过极值点和稳定点来预测下一次稳定点和极值点出现的时间点 2 微分方程预测 高大上
  • 怎样改变input被选中时边框颜色

    1 当input获得焦点时 input focus outline 1px solid 000 2 输入合法时 input valid border 1px solid green 3 输入不合法时 input invalid border
  • ElasticSearch 入门教程笔记

    视频教程 狂神说Java ElasticSearch7 6 x最新完整教程通俗易懂 视频地址 https www bilibili com video BV17a4y1x7zq 拒绝白嫖 感谢狂神分享的视频教程 ElasticSearch
  • Echarts 给pie圆饼图series.data 赋值

    1 如何去掉字符串最外层的双引号 使其变成数组 var data id 32 wd 20 3 jd 113 3 id 321 wd 20 3 jd 113 3 var yy var mm yy data split for var i 0
  • 数据挖掘算法与现实生活中的应用案例

    如何分辨出垃圾邮件 如何判断一笔交易是否属于欺诈 如何判断红酒的品质和档次 扫描王是如何做到文字识别的 如何判断佚名的著作是否出自某位名家之手 如何判断一个细胞是否属于肿瘤细胞 等等 这些问题似乎都很专业 都不太好回答 但是 如果了解一点点
  • 归因分析计算因子贡献度常见的方法

    在归因分析中 我们一般都需要计算出每个因子的贡献度是多少 比如产品DAU上升 对年龄段维度进行拆解 看是不同年龄段的用户对DAU上升的贡献度是多少 一般根据指标的类型 计算贡献度的方法也不一样 下面就列出一些常见的归因分析贡献度的计算方法
  • mt4服务器显示无连接,MT4登录显示“无效账户”,“无法连接”怎么解决

    MT4账户分为实盘账户和模拟账户 小编每天都会收到很多客户实盘账号登入不上去的申请 有的客户反应账户显示登录无效 或者无连接 没有数据流 客户就会问 是不是我的账号过期不能使用 其实不是的 账户登入不上有如下几个原因 首先我先要告诉大家 一
  • ISP(图像信号处理)算法概述、工作原理、架构、处理流程

    转自 https zhuanlan zhihu com p 115321553 ISP的主要内部构成 ISP内部包含 CPU SUP IP 各种功能模块的通称 IF 等设备 ISP的控制结构 1 ISP逻辑 2 运行在其上的firmware
  • ARM 浮点运算详解

    一 早期ARM上的浮点模拟器 早期的ARM没有协处理器 所以浮点运算是由CPU来模拟的 即所需浮点运算均在浮点运算模拟器 float math emulation 上进行 需要的浮点运算 常要耗费数千个循环才能执行完毕 因此特别缓慢 直到今
  • Vue路由中,history和hash两种模式有什么区别?

    前端路由有两种模式 hash 模式和 history 模式 接下来分析这两种模式的实现方式和优缺点 hash 模式 hash 模式是一种把前端路由的路径用井号 拼接在真实 URL 后面的模式 当井号 后面的路径发生变化时 浏览器并不会重新发
  • MySQL 表连接 JOIN

    参考 表连接 前言 建表语句 测试数据 一 表连接JOIN基础 1 什么是表连接 什么是JOIN 2 表连接的分类 2 1 内连接 2 2 外连接 2 3 等值连接 2 4 自然连接 前言 建表语句 表a CREATE TABLE a ta