当前位置: 首页 > news >正文

SQL 连接详解:内连接、左连接与右连接

在 SQL 查询中,表之间的数据关联是最常见的操作之一。不同的连接类型决定了数据如何组合展示。本文将详细讲解 内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN) 的概念、用法和实际效果。


1️⃣ 内连接(INNER JOIN)

概念

内连接用于 只显示两张表中匹配的记录。如果某条数据在另一张表中没有对应,则不会出现在结果集中。

示例

假设有两张表:

Customers(客户表)

customer_idcustomer_name
1Alice
2Bob
3Charlie

Orders(订单表)

order_idcustomer_idamount
1011500
1021200
1033300

SQL 查询:

SELECT c.customer_name, o.order_id, o.amount FROM Customers c INNER JOIN Orders o ON c.customer_id = o.customer_id;

结果:

customer_nameorder_idamount
Alice101500
Alice102200
Charlie103300

说明

  • 只有在 Customers 和 Orders 中都存在匹配的记录才显示。

  • Bob 没有订单,所以不出现在结果中。


2️⃣ 左连接(LEFT JOIN)

概念

左连接保证 左表的所有记录都显示,右表匹配上的显示数据,不匹配显示 NULL

SQL 示例:

SELECT c.customer_name, o.order_id, o.amount FROM Customers c LEFT JOIN Orders o ON c.customer_id = o.customer_id;

结果:

customer_nameorder_idamount
Alice101500
Alice102200
BobNULLNULL
Charlie103300

说明

  • 左表(Customers)所有客户都会显示。

  • 如果客户没有订单,订单列显示 NULL

  • 对于高并发数据统计和报表,这种方式非常常用。


3️⃣ 右连接(RIGHT JOIN)

概念

右连接保证 右表的所有记录都显示,左表匹配上的显示数据,不匹配显示 NULL

SQL 示例:

SELECT c.customer_name, o.order_id, o.amount FROM Customers c RIGHT JOIN Orders o ON c.customer_id = o.customer_id;

假设 Orders 表有一条额外订单(customer_id = 4,不在 Customers 表中):

order_idcustomer_idamount
1044100

结果:

customer_nameorder_idamount
Alice101500
Alice102200
Charlie103300
NULL104100

说明

  • 右表(Orders)所有订单都会显示。

  • 如果对应客户在 Customers 表中不存在,显示 NULL

  • JOIN 类型结果保证不匹配部分显示
    INNER JOIN仅显示匹配记录不显示
    LEFT JOIN左表全部显示右表不匹配显示 NULL
    RIGHT JOIN右表全部显示左表不匹配显示 NULL
  • 图示理解(用圆圈表示表)
  • Customers       Orders
    ________        ________
    /        \      /        \
    |  LEFT   |---- | RIGHT    |
    \________/      \________/
  • INNER JOIN → 只取重叠部分

  • LEFT JOIN → 左表全 + 重叠部分

  • RIGHT JOIN → 右表全 + 重叠部分

  • 5️⃣ 使用场景

  • INNER JOIN:当只关心匹配数据,例如统计每个有订单的客户总金额。

  • LEFT JOIN:当要保留主表信息,即使没有匹配也要显示,如客户报表、订单缺失提醒。

  • RIGHT JOIN:较少使用,一般可以用 LEFT JOIN 交换表顺序替代。

http://www.dtcms.com/a/389859.html

相关文章:

  • C2000基础-TIM介绍及使用
  • Day 06 动作类的初始化类------以B1为例
  • 面试题:对数据库如何进行优化?
  • samurai 点选分割 box分割
  • 计算机架构的总线协议中的等待状态是什么?
  • C++:入门基础(1)
  • ACD智能分配:服务延续和专属客服设置
  • 自监督学习分割
  • 抛弃自定义模态框:原生Dialog的实力
  • LangGraph 简单入门介绍
  • Docker 部署 DzzOffice:服务器 IP 转发功能是否需要开启
  • 无人机避障——卡内基梅隆大学(CMU)CERLAB 无人机自主框架复现
  • 正点原子zynq_FPGA-初识ZYNQ
  • Vue3中对比ref,reactive,shallowRef,shallowReactive
  • 通过Freemark渲染数据到Word里并生成压缩包
  • Vue 项目中使用 AbortController:解决请求取消、超时与内存泄漏问题
  • 设置管家婆服务器开机自动启动
  • ubuntu20 安装 ros2 foxy
  • 二分查找(二分查找算法)
  • 贪心算法应用:超图匹配问题详解
  • Hadoop3.3.5搭建指南(双NN版本)
  • 如何正确写Controller?参数校验、异常处理
  • 线性代数:LU与Cholesky分解
  • 饮用水在线监测设备:实时、精准地捕捉水体中的关键参数,为供水安全提供全方位保障
  • 【环境搭建】Conda安装教程
  • Java与机器学习的结合:库与应用!
  • DHCP基本原理及实验(ENSP配置)
  • 高系分十一:软件需求工程
  • MCP Server Chart AntV 项目解析
  • 2025药物市场调研分析案例(模板资源分享)