【MySQL】内外连接——内连接、外连接、左外连接、右外连接、内外连接的区别、左外连接和右外连接的区别

文章目录

  • MySQL
  • MySQL表的内连接和外连接
    • 1. 内连接
    • 2. 外连接
      • 2.1 左外连接
      • 2.2 右外连接
    • 3. 内外连接的区别
    • 4. 左外连接和右外连接的区别

MySQL

在这里插入图片描述
            

MySQL表的内连接和外连接

  MySQL 中的内连接(INNER JOIN)和外连接(包括左外连接 LEFT JOIN 和右外连接 RIGHT JOIN)是 SQL 查询中用于从两个或多个表中获取数据的重要工具。这些连接操作基于两个表之间的某些相关列之间的关系。下面,我将详细介绍这些连接的概念和用法。

            

1. 内连接

  内连接(INNER JOIN):内连接返回两个表中满足连接条件的所有行。如果某行在其中一个表中没有匹配的行,那么该行就不会出现在结果集中。内连接是最常见的连接类型,通常用于获取两个表中具有相关数据的行。

SELECT columns  
FROM table1  
INNER JOIN table2  
ON table1.column_name = table2.column_name;

            

简单示例:我们创建一张表用于员工信息的存储:

  其中包括员工的编号 id ,员工的姓名和工作,员工的薪资和入职日期,以及员工的部门编号和所对应的领导编号。其中编号 empno 作为我们的主键。

mysql> create table emp(-> empno int unsigned primary key,-> ename varchar(20),-> job varchar(20),-> salary int,-> hiredate date,-> deptno int,-> );

在这里插入图片描述

  忘了添加或者后续想要添加关于员工其他的列信息?我们可以使用 alter 进行对应表的修改以此来添加我们所需要的列信息。

mysql> alter table emp-> add column mgr int;

在这里插入图片描述

  

查看表的结构:

desc emp;

在这里插入图片描述
  

插入信息:

mysql> insert into emp values(1001,'张三','总经理',10000,'2000-1-1',10,NULL);
mysql> insert into emp values(1002,'张花','员工',5000,'2005-7-4',10,1001);
mysql> insert into emp values(1003,'李四','经理',8000,'2002-3-12',20,NULL);
mysql> insert into emp values(1004,'李华','销售',8000,'2006-3-12',10,1001);
mysql> insert into emp values(1005,'王五','销售',7800,'2007-11-28',20,1002);
mysql> insert into emp values(1006,'赵六','销售',6700,'2008-5-18',10,1001);
mysql> insert into emp values(1007,'小美','员工',5000,'2010-2-08',20,1003);
mysql> insert into emp values(1008,'小帅','经理',9000,'2002-3-12',30,NULL);
mysql> insert into emp values(1009,'小蓝','员工',7600,'2007-5-22',30,NULL);

在这里插入图片描述

  

查看表的所有信息:

mysql> select *from emp;

在这里插入图片描述
            

显示张花的名字和部门名称:

  在之前我们通常使用笛卡尔积进行两张表的连接,使用 select+where 查询 就是属于内连接的一种方法。

select ename,dname 
from emp,dept 
where emp.deptno=dept.deptno and ename='张花';

在这里插入图片描述
            

  使用这个内连接就是相当于换另一种写法,结果还是和 使用 select+where 查询后的结果 效果是一样的。

select ename,dname 
from emp
inner join dept 
on emp.deptno=dept.deptno and ename='张花';

在这里插入图片描述

            

2. 外连接

  外连接:外连接返回左表(对于左外连接)或右表(对于右外连接)中的所有行,以及右表(对于左外连接)或左表(对于右外连接)中满足连接条件的行。(如果某行在其中一个表中没有匹配的行,那么结果集中该行的对应列将包含 NULL 值)。

            

2.1 左外连接

  左外连接(LEFT JOIN 或 LEFT OUTER JOIN):左外连接返回左表中的所有行,以及右表中满足连接条件的行(如果左表中的某行在右表中没有匹配的行,那么结果集中该行的右表列将包含 NULL 值)。

SELECT columns  
FROM table1  
LEFT JOIN table2  
ON table1.column_name = table2.column_name;

  

使用左外连接查询所有的信息:

select * 
from emp 
left join dept 
on emp.deptno=dept.deptno;

在这里插入图片描述

            

2.2 右外连接

  右外连接(RIGHT JOIN 或 RIGHT OUTER JOIN):右外连接返回右表中的所有行,以及左表中满足连接条件的行(如果右表中的某行在左表中没有匹配的行,那么结果集中该行的左表列将包含 NULL 值)。

SELECT columns  
FROM table1  
RIGHT JOIN table2  
ON table1.column_name = table2.column_name;

  

使用右外连接查询所有的信息:

select * 
from emp 
right join dept 
on emp.deptno=dept.deptno;

在这里插入图片描述
  

  结合内连接查询来看:

在这里插入图片描述

  三种查询的结果是一致的,就是在顺序上有一些区别,内连接的查询结果和右连接查询结果是完全一样的因为它们都是以empno编号先为顺序进行连接,而左外连接是先以deptno的编号先为顺序进行连接。我们根据不同的需要选择我们合适的连接方式。

  注意一下:外连接的连接方式不可以省略,内连接可以。

  当使用LEFT JOIN(或任何JOIN类型)时,你必须指定连接条件。你的查询没有提供ON子句来指定emp表和dept表如何关联。因此,MySQL不知道如何在两个表之间建立连接。查询应该包含一个ON子句,指明连接条件。

在这里插入图片描述

在这里插入图片描述

            

3. 内外连接的区别

  内连接和外连接之间的主要区别:

  (1)返回的行数:

  内连接:只返回满足连接条件的行。如果某行在其中一个表中没有匹配的行,那么该行不会出现在结果集中。

  外连接:返回至少一个表中的所有行,以及另一个表中满足连接条件的行。对于没有匹配的行,结果集中对应的列将包含 NULL 值。

  (2)结果集内容

  内连接:结果集仅包含两个表中共有的数据,即两个表中都有匹配的行。

  外连接:结果集不仅包含共有的数据,还包含至少一个表中独有的数据(以 NULL 值表示)。

  (3)类型

  内连接:只有一种类型,即标准的 INNER JOIN。

  外连接:有三种类型:LEFT JOIN(或 LEFT OUTER JOIN)、RIGHT JOIN(或 RIGHT OUTER JOIN)和 FULL JOIN(或 FULL OUTER JOIN)。LEFT JOIN 返回左表中的所有行和右表中匹配的行;RIGHT JOIN 返回右表中的所有行和左表中匹配的行;FULL JOIN 返回两个表中的所有行。

  (4)用途

  内连接:通常用于查询两个或多个表中具有相关数据的行,例如查询订单和订单详情。

  外连接:用于查询一个表中的所有记录,以及与之相关的另一个表中的记录,即使某些记录在另一个表中没有匹配项。这在需要显示完整列表,包括没有相关数据的项时非常有用,例如在报告或数据分析中。

            

4. 左外连接和右外连接的区别

  左外连接和右外连接的主要区别:

  左外连接:返回左表中的所有记录和右表中匹配的记录。 如果右表中没有与左表匹配的记录,则结果集中对应的右表字段将为NULL。这种连接类型特别适用于你想要获取左表中的所有记录,并查看哪些右表的记录与之匹配的场景。

  而右外连接:返回右表中的所有记录和左表中匹配的记录。 如果左表中没有与右表匹配的记录,则结果集中对应的左表字段将为NULL。这种连接类型则适用于你想要获取右表中的所有记录,并查看哪些左表的记录与之匹配的情况。

在这里插入图片描述

            
            
            
            

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

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

相关文章

Java研学-SpringBoot(五)

七 统一异常处理 1 框架自带方式 Spring Boot 默认会把所有错误都交给 BasicErrorController 类完成处理,错误的视图导向到 classpath:/static/error/ 和 classpath:/templates/error/路径上,HTTP 状态码就是默认视图的名称。如: // 出现 4…

JS中常用的几种事件

在js中分为多种事件,比如点击事件,焦点事件,加载事件,鼠标事件等等... ... 点击事件 onclick点击事件,ondblclick双击事件 焦点事件 onblur元素失去焦点,onfocus元素获取焦点 加载事件 onload一个页面…

windows本地访问局域网tensorboard

https://blog.csdn.net/m0_51268651/article/details/126524028 这个文章中说使用xshell配置ssh后可在windows访问 有一说一不太能理解为什么谷歌会做的那么麻烦 果然有更好的方案,如下: tensorboard --logdir/path/to/event --host 0.0.0.0 --port 6…

600条最强Linux命令总结

1. 基本命令 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作系统信息 arch 显示机器的处理器架构 uname -m 显示…

Linux 如何一键kill杀死某个被占用的端口

文章目录 一、例子:关闭8082端口二、查找被占用端口的PID三、 kill 掉这个进程总结 一、例子:关闭8082端口 [rootVM_0_59_centos root]# netstat -tln | grep 8082 tcp6 3 0 :::8082 :::* LISTEN二、查找…

考研数学|听完一遍汤家凤基础,1800都没思路,怎么办?

看了我这篇回答,保证你可以顺利的做1800题! 如果你听了汤家凤老师的课,但是做题没思路,请不要担心,也不要急着换老师,你很有可能是方法错了。 请你反思一下: 1、你是不是听完课立刻就去做题。…

配音虾助力视频文案提取,提升内容创作效率

配音虾作为一款智能语音技术产品,正逐渐在视频内容创作领域崭露头角。它以其独特的语音转文字功能,助力视频文案提取,极大地提升了内容创作的效率。对于广大内容创作者来说,这无疑是一项革命性的工具。目前上线的渠道只有微信小程…

[小程序开发] 设置request封装请求参数

一、在类中定义实例属性,用来设置默认请求参数 defaults{baseURL:,//请求基准地址url:,//接口的请求路径data:null,//请求参数method:GET,//默认的请求方法//请求头header:{Content-type:application/json//设置数据的交互格式},timeout:60000//默认的超时时长&…

wpf ContentPresenter

在WPF(Windows Presentation Foundation)中,ContentPresenter是一个关键组件,它负责在控件或模板中渲染和展示内容。以下是关于ContentPresenter在WPF中作用、特性和使用场景的详细说明: 目的 内容占位符&#xff1a…

MTMT 质押活动启动 ,坐享巨大BTCFi 市场红利

BTC是第一大加密货币,目前加密货币总市值为 2.6 万亿美元,BTC市值占比约为 51%。事实上,相对于开发程度更高的以太坊生态,BTC生态目前仍处于发展的极早期,这意味着仍旧巨大的BTC价值亟需释放,这也意味着 BT…

设计方案-定时任务接口数据存储及更新策略

前言 在没有使用ETL工具且不考虑多数据源的情况下,我们需要从别的系统获取数据时,一般会选择分页接口查询并存储。本文算是我对类似场景代码的提炼,旨在总结相关套路,提升自我对数据库和模块的设计能力。 ETL(英文 Extract-Trans…

代码随想录 Day23 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结篇

669. 修剪二叉搜索树 class Solution { public:TreeNode* trimBST(TreeNode* root, int low, int high) {if (root nullptr ) return nullptr;if (root->val < low) {TreeNode* right trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点return ri…

li标签间的空白问题解决

li 与 li 之间有看不见的空白间隔是什么原因引起的&#xff1f; 浏览器会把inline内联元素间的空白字符&#xff08;空格、换行、Tab等&#xff09;渲染成一个空格。为了美观&#xff0c;通常是一个<li>放在一行&#xff0c;这导致<li>换行后产生换行字符&#xf…

详解CAS(Compare and swap)

一、什么是 CAS CAS: 全称Compare and swap&#xff0c;字⾯意思:”⽐较并交换“&#xff0c;⼀个 CAS 涉及到以下操作&#xff1a; 我们假设内存中的原数据V&#xff0c;旧的预期值A&#xff0c;需要修改的新值B。 比较 A 与 V 是否相等。&#xff08;⽐较&#xff09; 如果…

日志集中审计系列(3)--- LogAuditor接收UMA设备syslog日志

日志集中审计系列(3)--- LogAuditor接收UMA设备日志 前言拓扑图设备选型组网需求配置思路操作步骤结果验证前言 近期有读者留言:“因华为数通模拟器仅能支持USG6000V的防火墙,无法支持别的安全产品,导致很多网络安全的方案和产品功能无法模拟练习,是否有真机操作的实验或…

PyCharm中出现Microsoft Defender配置建议

原因 Windows安全中心的病毒和威胁防护会自动扫描电脑中的文件夹&#xff0c;我们的项目文件夹和IDE文件夹也会被扫描&#xff0c;而PyCharm认为这会降低IDE性能。 解决方法 直接点击提示框里的自动。 或是手动给扫描添加排除项&#xff0c;步骤如下&#xff1a; 1、先打开…

k8s1.28.8版本配置Alertmanager报警方式(邮件,企业微信)

文章目录 总结部署流程 Alertmanager 三大核心1. 分组告警2. 告警抑制3. 告警静默 报警过滤静默通知方案一&#xff1a;方案二&#xff1a; 抑制报警规则案例一 参考文档 自定义路由告警&#xff0c;分来自不同路由的告警&#xff0c;艾特不同的人员进行区分修改 alertmanager …

预训练大模型最佳Llama开源社区中文版Llama2

Llama中文社区率先完成了国内首个真正意义上的中文版Llama2-13B大模型&#xff0c;从模型底层实现了Llama2中文能力的大幅优化和提升。毋庸置疑&#xff0c;中文版Llama2一经发布将开启国内大模型新时代。 作为AI领域最强大的开源大模型&#xff0c;Llama2基于2万亿token数据预…

【C++入门】输入输出、命名空间、缺省参数、函数重载、引用、内联函数、auto、基于范围的for循环

目录 命名空间 命名空间的定义 命名空间的使用 输入输出 缺省参数 函数重载 引用 常引用 引用的使用场景 内联函数 auto 基于范围的for循环 命名空间 请看一段C语言的代码&#xff1a; #include <stdio.h> #include <stdlib.h>int rand 10;int main…

java打家劫舍 1 (力扣Leetcode 198)

打家劫舍 1 力扣原题链接 问题描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报…