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 的相关文章

随机推荐

  • 虹软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