后端-内连接(INNER JOIN),左外连接(LEFT JOIN)和右外连接(RIGHT JOIN)的区别

news2024/11/14 11:55:26

SQL 语句中的 内连接外连接左连接右连接 是常见的用于联合多张表的数据查询方式。它们的区别主要体现在如何处理在连接的表中没有匹配数据的记录。

1. 内连接(INNER JOIN)

内连接是最常见的一种连接方式,它返回两个表中满足连接条件的记录。如果某个表中的记录在另一个表中没有匹配项,那么这条记录不会出现在结果中。

语法:

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

示例:

假设有两个表:employees(员工表)和 departments(部门表),我们希望查询员工和他们所在部门的信息。

employees 表:

emp_idemp_namedept_id
1John10
2Jane20
3Alice10
4BobNULL

departments 表:

dept_iddept_name
10HR
20IT

查询所有有部门的员工及其部门信息:

SELECT e.emp_name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id = d.dept_id;

结果:

emp_namedept_name
JohnHR
JaneIT
AliceHR
  • 解释:内连接只返回两个表中 dept_id 匹配的记录,Bob 由于没有部门(dept_id 为 NULL)没有出现在结果中。

2. 外连接(OUTER JOIN)

外连接是一种包括左表和右表所有记录的连接方式。外连接分为 左外连接(LEFT OUTER JOIN)右外连接(RIGHT OUTER JOIN),两者主要区别在于返回的记录集不同。

语法:

SELECT columns FROM table1 LEFT OUTER JOIN table2 ON table1.column = table2.column;

SELECT columns FROM table1 RIGHT OUTER JOIN table2 ON table1.column = table2.column;


3. 左外连接(LEFT JOIN 或 LEFT OUTER JOIN)

左外连接会返回左表(table1)中的所有记录,以及右表(table2)中与左表匹配的记录。如果右表中没有匹配项,左表的记录仍然会被返回,但右表的字段会显示为 NULL

示例:

继续使用 employeesdepartments 表,查询所有员工及其所在的部门(包括没有部门的员工)。

SELECT e.emp_name, d.dept_name FROM employees e LEFT JOIN departments d ON e.dept_id = d.dept_id;

结果:

emp_namedept_name
JohnHR
JaneIT
AliceHR
BobNULL
  • 解释:左外连接返回了所有员工的信息,包括 Bob。由于 Bob 没有部门信息,dept_name 返回了 NULL

4. 右外连接(RIGHT JOIN 或 RIGHT OUTER JOIN)

右外连接与左外连接相似,但返回的是右表(table2)中的所有记录,以及左表(table1)中与右表匹配的记录。如果左表中没有匹配项,右表的记录仍然会被返回,左表的字段会显示为 NULL

示例:

同样查询所有部门及其员工的信息(包括没有员工的部门)。

SELECT e.emp_name, d.dept_name FROM employees e RIGHT JOIN departments d ON e.dept_id = d.dept_id;

结果:

emp_namedept_name
JohnHR
AliceHR
JaneIT
NULLIT
  • 解释:右外连接返回了所有部门的信息。IT 部门没有员工(虽然有 Jane),但由于 LEFT JOIN 结果中没有未匹配的记录,所以返回了 NULL

5. 总结和区别

  • 内连接(INNER JOIN):只返回两个表中匹配的记录,没有匹配的记录会被丢弃。

  • 外连接(OUTER JOIN)

    • 左外连接(LEFT JOIN):返回左表所有记录和右表中匹配的记录,如果右表没有匹配,右表字段为 NULL
    • 右外连接(RIGHT JOIN):返回右表所有记录和左表中匹配的记录,如果左表没有匹配,左表字段为 NULL
  • 内连接 只返回两个表中有交集的部分,而 外连接 返回一个表的所有记录,另一个表的匹配记录,未匹配的地方会用 NULL 填充。

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

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

相关文章

云计算:定义、类型及对企业的影响

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 云计算:定义、类型及对企业的影响 云计算:定义、类型及对企业的影响 云计算:定义、类型及对企…

RSTP的配置

RSTP相对于STP在端口角色、端口状态、配置BPDU格式、配置BPDU的处理方式、快速收敛机制、拓扑变更机制和4种保护特性方面的详细改进说明: 端口角色: STP中定义了三种端口角色:根端口(Root Port)、指定端口&#xff0…

Fortran安装(vscode+gcc+Python)

编写时间: 2024年11月7日 环境配置: gcc VScode Python 条件: Windows 10 x64 VMware虚拟机 前言 这是我出的第2个关于Fortran安装的教程,由于上一个方法(你可以在本专栏里找到)对储存空间的要求比较…

Ubuntu18.04+ROS环境+moveit UR5机械臂仿真

目录 仿真环境: 1.下载Universal Robots机器人功能包 2.运行 Gazebo中的仿真模型 3.运行moveit运动规划 4.运行rviz并进行轨迹规划 仿真环境: 本文使用版本:Ubuntu18.04 ros版本:ros-melodic-desktop-full,安装…

华为路由策略配置

一、AS_Path过滤 要求: AR1与AR2、AR2与AR3之间建立EBGP连接 AS10的设备和AS30的设备无法相互通信 1.启动设备 2.配置IP地址 3.配置路由器的EBGP对等体连接,引入直连路由 [AR1]bgp 10 [AR1-bgp]router-id 1.1.1.1 [AR1-bgp]peer 200.1.2.2 as-nu…

echarts引入自定义字体不起作用问题记录

echarts引入自定义字体不起作用问题记录 1、问题描述 初始化界面字体不作用,当界面更新后字体样式正常显示 2、原因描述 这通常是由于字体文件加载延迟导致的。ECharts 在初始化时可能还没有加载完字体文件,因此无法正确应用字体样式 3、解决方案 …

Sql server 备份还原方法

备份 方法1,选择对应的数据库名-------》右键 任务---------》备份 默认备份类型 完整 文件后缀 .bak 方法2,选择对应的数据库名-------》右键 任务----------》生成脚本 选择要编写的数据库对象(表,视图,存储过程等) 选择对应的 服…

QT鼠标事件

QT鼠标事件 1.概述 这篇文章介绍如何使用事件和获取事件的信号 2.创建项目 创建一个widget类型项目,在widget.ui文件中添加一个label控件 然后在项目名称上右键选择Add new... 添加文件,选择 C Class 自定义类名Mylabel,选择基类Base …

【Android】webview常用方法和使用

文章目录 前言一、常见用法二、基础属性webView的常用方法WebViewClient的常用方法WebChromeClient的常用方法WebSettings的相关方法 三、加载流程和事件回调四、webview和JS之间的互相调用总结 五、参考链接 前言 最近项目又用到了webview,在回顾复习一次webview相…

malloc calloc和realloc区别和联系

malloc malloc是一个⼀个动态内存开辟的函数: 它的函数原型是void* malloc (size_t size);这个函数向内存申请⼀块连续可⽤的空间,并返回指向这块空间的指针。 1.如果开辟成功,则返回⼀个指向开辟好空间的指针。 2.如果如果开辟失败&#xf…

Android studio中关于printf和print和println的区别

print:为一般输出,同样不能保留精度格式转化,也不能换行输出,输出需要加上换行符printf:常用于格式转换,但需要注意不是换行输出,只用于精度转换,跟C语言的printf一样的,输出需要加上换行符prin…

计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议

文章目录 一、TCP/IP五层模型(重要)二、应用层常见的协议三、TCP与UDP3.1 TCP、UDP的区别(重要)3.2 运行于TCP、UDP上的协议3.3 TCP的三次握手、四次挥手3.3.1 TCP的三次握手3.3.2 TCP的四次挥手3.3.3 随机生成序列号的原因 四、T…

分布式——BASE理论

简单来说: BASE(Basically Available、Soft state、Eventual consistency)是基于CAP理论逐步演化而来的,核心思想是即便不能达到强一致性(Strong consistency),也可以根据应用特点采用适当的方…

【RabbitMQ】07-业务幂等处理

1. 方式一 序列化设置唯一Id。 Beanpublic MessageConverter messageConverter() {Jackson2JsonMessageConverter jjmc new Jackson2JsonMessageConverter();jjmc.setCreateMessageIds(true);return jjmc;}RabbitListener(bindings QueueBinding(value Queue(name "d…

【多线程奇妙屋】你听说过设计模式吗?软件开发中可全局访问一个对象的设计模式——单例模式,工作常用, 建议收藏 ! ! !

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

android studio 配置过程

Android studio版本:Android Studio Ladybug | 2024.2.1 windows 10 x64 关键问题解决方法: 1.设置代理: 退出首次配置,进入ide(必要时新建工程)然后: 然后重启ide 等待下载完成。 代理地…

java ssm 个人学习管理系统 学习安排 学生在线学习管理 源码 jsp

一、项目简介 本项目是一套基于SSM的个人学习管理系统,主要针对计算机相关专业的和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本、软件工具等。 项目都经过严格调试,确保可以运行! 二、技术实现 ​后端技术&#x…

【harbor】离线安装2.9.0-arm64架构服务制作和升级部署

harbor官网地址:Harbor 参考文档可以看这里:部署 harbor 2.10.1 arm64 - 简书。 前提环境准备: 安装docker 和 docker-compose 先拉arm64架构的harbor相关镜像 docker pull --platformlinux/arm64 ghcr.io/octohelm/harbor/harbor-regist…

ssm+vue708基于BS的库存管理软件设计与实现

博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

速通LoRA:《LoRA: Low-Rank Adaptation of Large Language Models》全文解读

文章目录 总览AbstractIntroductionProblem StatementAren’t Existing Solutions Good Enough?Our MethodLow-Rank-Parametrized Update MatricesApplying LoRA to Transformer 何为高斯随机初始化Empirical ExperimentsBaselinesRoBERTa base/largeDeBERTa XXLGPT-2 medium/…