SQL内外连接详解

SQL中的内连接(INNER JOIN)和外连接(包括左外连接LEFT JOIN/LEFT OUTER JOIN、右外连接RIGHT JOIN/RIGHT OUTER JOIN)是用于从两个或多个表中组合数据的技术。这里用一些简单的例子来帮助理解。

内连接(INNER JOIN)

内连接返回的是两个表中满足连接条件的行。如果某个表的一行与另一个表中的某一行匹配,则这一行将会出现在结果集中。

例子: 假设我们有两个表 CustomersOrders,它们分别包含客户的资料和订单信息。每个客户可能有多个订单,也可能没有订单。如果我们想找出所有有订单的客户的名字,我们可以使用 INNER JOIN。

SELECT Customers.Name, Orders.OrderID
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;

这条语句会返回那些在 Customers 表里有对应 CustomerIDOrders 记录的客户名字。

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

左外连接会返回所有左边表(本例中的 Customers 表)的记录,并且只返回右边表(本例中的 Orders 表)中匹配的记录。如果右边表没有匹配,则结果集中的右边部分将包含 NULL 值。

例子: 如果我们想列出所有的客户,无论他们是否有订单,可以使用 LEFT JOIN。

SELECT Customers.Name, Orders.OrderID
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;

这条语句会返回 Customers 表中的所有记录,并且对于那些没有订单的客户,OrderID 将是 NULL。

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

右外连接与左外连接相似,但它返回的是右边表的所有记录,并且只返回左边表中匹配的记录。如果左边表没有匹配,则结果集中的左边部分将包含 NULL 值。

例子: 如果我们对所有订单感兴趣,并且想列出每个订单对应的客户,即使有些订单可能是错误条目并且找不到对应的客户,我们可以使用 RIGHT JOIN。

SELECT Customers.Name, Orders.OrderID
FROM Customers
RIGHT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;

这条语句会返回 Orders 表中的所有记录,并且对于那些没有对应客户的订单,Name 将是 NULL。
 

假设我们有两个表:一个是 Employees 表,记录员工的信息;另一个是 Departments 表,记录部门的信息。

Employees 表
EmployeeIDNameDepartmentID
1Alice2
2Bob1
3Charlie3
4David1
Departments 表
DepartmentIDName
1Sales
2Engineering
3HR

内连接(INNER JOIN)

内连接只返回两个表中匹配的记录。如果 Employees 表中的 DepartmentIDDepartments 表中有对应的 DepartmentID,那么这条记录就会出现在结果集中。

SELECT Employees.Name, Departments.Name AS DepartmentName
FROM Employees
INNER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;

结果将是:

NameDepartmentName
AliceEngineering
BobSales
DavidSales
CharlieHR

左外连接(LEFT JOIN)

左外连接会返回左边表中的所有记录,并且只有当右边表中有匹配的记录时才会返回右边表中的数据。如果没有匹配的数据,则右边的数据列显示为 NULL。

SELECT Employees.Name, Departments.Name AS DepartmentName
FROM Employees
LEFT JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;

在这个例子中,因为每一个员工都有对应的部门,所以结果和内连接相同。但如果 Employees 表中有一个员工的 DepartmentID 是不存在于 Departments 表中的,那么这个员工的信息将会在 DepartmentName 列显示为 NULL。

右外连接(RIGHT JOIN)

右外连接则相反,它返回右边表中的所有记录,并且只有当左边表中有匹配的记录时才会返回左边表中的数据。如果没有匹配的数据,则左边的数据列显示为 NULL。

SELECT Employees.Name, Departments.Name AS DepartmentName
FROM Employees
RIGHT JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;

如果 Departments 表中有一个部门是没有员工的,那么这个部门的信息将会在 Name 列显示为 NULL。

全外连接(FULL OUTER JOIN)

虽然不是所有数据库系统都支持全外连接,但为了完整性,这里也提一下。全外连接会返回两个表中的所有记录。如果有任何一边没有匹配的数据,则相应的列将显示为 NULL。

SELECT Employees.Name, Departments.Name AS DepartmentName
FROM Employees
FULL OUTER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;

总结来说:

  • INNER JOIN:仅返回两个表中匹配的记录。
  • LEFT JOIN:返回左边表中的所有记录,以及右边表中匹配的记录。
  • RIGHT JOIN:返回右边表中的所有记录,以及左边表中匹配的记录。
  • FULL OUTER JOIN:返回两边表中的所有记录,如果有任何一边没有匹配的数据,则相应的列将显示为 NULL。

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

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

相关文章

buildroot制作自己的软件包(可以理解为应用程序)

以helloworld为例记录使用步骤 一&#xff1a;书写自己的源程序以及Makefile helloworld.c #include <stdio.h>int main(int argc, char **argv) {printf("hello world\r\n");return 0; }Makefile all: helloworldhelloworld: helloworld.o$(CC) -o hellow…

模型训练识别手写数字(二)

模型训练识别手写数字&#xff08;一&#xff09;使用手写数字图像进行模型测试 一、生成手写数字图像 1. 导入所需库 import cv2 import numpy as np import oscv2用于计算机视觉操作。 numpy用于处理数组和图像数据。 os用于文件和目录操作。 2. 初始化画布 canvas np.z…

Kaggle竞赛——灾难推文分类(Disaster Tweets)

目录 1. 准备工作2. 资源导入3. 数据处理4. 绘制词云图5. 数据可视化5.1 词数和字符数可视化5.2 元特征可视化5.3 类别可视化 6. 词元分析6.1 一元语法统计6.2 多元语法统计 7. 命名实体识别8. 推文主题提取9. 构建模型9.1 数据划分与封装9.2 模型训练与验证 10. 模型评估11. 测…

SQL:Windows下MySQL的安装教程(超详细)

一.系统环境&#xff1a; 操作系统&#xff1a; Windows11&#xff1b; MySQL版本&#xff1a; mysql-community-8.0.40.0&#xff1b; 二.MySQL下载&#xff1a; 访问MySQL 官网下载地址&#xff1a;https://www.mysql.com/&#xff0c;点击DOWNLOADS&#xff1b; 跳转后页…

Maven---依赖管理,项目构建工具

1.Maven安装和配置 1.1设置本地仓库 提前准备好仓库的位置,打开配置文件maven/conf/setting.xml 1.2配置阿里镜像源 在mirrors节点(标签)下添加阿里中央仓库镜像,把原本的镜像源注释掉,不要写在mirrors标签外 <mirror><id>alimaven</id><name>aliy…

6 款超实用的 Coze 插件,让你的智能体开发效率提升 200%

最近我一直在频繁使用 Coze 智能体&#xff0c;帮朋友和客户实现各种定制化需求。 Coze 不仅提供了强大的工作流编排能力和全面的功能节点&#xff0c;还有大量由开发者和平台上传的插件库支持。 对于智能体开发者来说&#xff0c;找到一款合适、好用的插件&#xff0c;真的能…

【实用知识】Spring Boot 优雅捕捉异常的几种姿势

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

JVM(HotSpot):GC之G1垃圾回收器

文章目录 一、简介二、工作原理三、Young Collection 跨代引用四、大对象问题 一、简介 1、适用场景 同时注重吞吐量&#xff08;Throughput&#xff09;和低延迟&#xff08;Low latency&#xff09;&#xff0c;默认的暂停目标是 200 ms超大堆内存&#xff0c;会将堆划分为…

华为云弹性云服务器无法登录远程操作

遇到的问题&#xff1a; 就是你在创建弹性云服务器的时候选择了没有子网的虚拟私有云&#xff0c; 你属于误删了虚拟私有云的子网&#xff0c;自己没有注意看 如果在华为云创建弹性云服务器时选择的虚拟私有云&#xff08;VPC&#xff09;没有配置子网&#xff0c;那么在尝试远…

【mysql 进阶】2-1. MySQL 服务器介绍

MySQL 服务器简介 通常所说的 MySQL 服务器指的是mysqld程序&#xff0c;当运⾏mysqld后对外提供MySQL 服务&#xff0c;这个专题的内容涵盖了以下关于MySQL 服务器以及相关配置的内容&#xff0c;包括&#xff1a; 服务器⽀持的启动选项。可以在命令⾏和配置⽂件中指定这些选…

嵌入式C语言字符串具体实现

大家好,今天主要给大家分享一下,如何使用C语言进行字符串操作与实现。 第一:字符串相关操作实现 复制函数五个基本要素: 头文件:#include <string.h> 函数原型:strcpy(char dest[],char src[]) -----string copy 功能:把src数组中\0之前的所有字符,连同‘\…

在xml 中 不等式 做转义处理的问题

对于这种要做转义处理&#xff0c;<![CDATA[ < ]]>

讲一讲 kafka 的 ack 的三种机制?

大家好&#xff0c;我是锋哥。今天分享关于【K讲一讲 kafka 的 ack 的三种机制&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 讲一讲 kafka 的 ack 的三种机制&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Kafka的消息确认机制&…

【计网】UDP Echo Server与Client实战:从零开始构建简单通信回显程序

目录 前言&#xff1a; 1.实现udpserver类 1.1.创建udp socket 套接字 --- 必须要做的 socket&#xff08;&#xff09;讲解 代码实现&#xff1a;​编辑 代码讲解&#xff1a; 1.2.填充sockaddr_in结构 代码实现&#xff1a; 代码解析&#xff1a; 1.3.bind sockfd和…

Vue2自定义指令及插槽

这里写目录标题 自定义指令基础语法指令的值封装v-loading指令 插槽默认插槽后备内容&#xff08;插槽的默认值&#xff09;具名插槽作用域插槽 自定义指令 自定义指令&#xff1a;自己定义的指令&#xff0c;封装一些dom操作&#xff0c;扩展额外功能 基础语法 全局注册&am…

2024年TI杯E题-三子棋游戏装置方案分享-jdk123团队-第四弹 第二题

往期回顾 前期准备 摄像头bug解决 手搓机械臂 视觉模块的封装 下面是题目部分&#xff1a; 第二问我们继续延续第一问的思路&#xff1a; 将棋子坐标与棋盘上标定的坐标进行绑定。 代码展示&#xff1a; import RPi.GPIO as GPIO import time import cv2 import numpy as…

【Qt】常用控件:按钮类控件

思维导图&#xff1a; 一、Push Button 我们可以使用 QPushButton 表示一个按钮&#xff0c;这也是当前我们最熟悉的一个控件。QPushButton继承于QAbstractButton。这个类是一个抽象类&#xff0c;是按钮的父类。 1.1 常用的属性 属性说明text按钮中的文本icon按钮中的图标ic…

Flutter登录界面使用主题

Now, let’s use the theme we initially created in our main function for a simple login screen: 现在&#xff0c;让我们使用最初在主函数中创建的主题来制作一个简单的登录屏幕&#xff1a; Create a Login Screen Widget: Inside the main.dartfile, create a new wid…

基于Springboot+Vue的候鸟监测数据管理系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…

MySQL 字段类型介绍

在 MySQL 中&#xff0c;设计数据库表时&#xff0c;需要根据数据的实际需求选择合适的数据类型&#xff0c;以确保数据存储的准确性和节省存储空间。MySQL 提供了丰富的字段类型&#xff0c;主要分为以下几类&#xff1a;数值类型、字符串类型、日期时间类型、和JSON类型等。 …