七、JOIN 语法详解与实战示例
一、JOIN 的作用与分类
JOIN 操作用于合并两个或多个表的行,基于表之间的关联字段。以下是常见的 JOIN 类型:
| JOIN 类型 | 描述 |
|---|---|
INNER JOIN | 返回两个表匹配的记录 |
LEFT JOIN | 返回左表所有记录 + 右表匹配记录(右表无匹配则为NULL) |
RIGHT JOIN | 返回右表所有记录 + 左表匹配记录(左表无匹配则为NULL) |
FULL JOIN | 返回所有记录(MySQL不支持,可用UNION模拟) |
CROSS JOIN | 返回笛卡尔积(所有可能的组合) |
二、INNER JOIN(内连接)
语法与作用
SELECT 字段
FROM 表A
INNER JOIN 表B ON 表A.字段 = 表B.字段;
- 作用:仅返回两表中匹配的行
- 使用场景:需要精确关联数据的场景(如订单与用户信息关联)
示例
表结构:
-- 用户表
CREATE TABLE users (user_id INT PRIMARY KEY,name VARCHAR(50)
);
INSERT INTO users VALUES (1, '张三'), (2, '李四');-- 订单表
CREATE TABLE orders (order_id INT PRIMARY KEY,user_id INT,amount DECIMAL(10,2)
);
INSERT INTO orders VALUES (1001, 1, 299.00), (1002, 3, 599.00);
查询:获取有订单的用户信息
SELECT u.name, o.order_id, o.amount
FROM users u
INNER JOIN orders o ON u.user_id = o.user_id;
结果:
| name | order_id | amount |
|---|---|---|
| 张三 | 1001 | 299.00 |
三、LEFT JOIN(左连接)
语法与作用
SELECT 字段
FROM 表A
LEFT JOIN 表B ON 表A.字段 = 表B.字段;
- 作用:返回左表所有记录,右表无匹配则显示NULL
- 使用场景:统计所有用户的订单情况(包括未下单用户)
示例
查询:统计所有用户的订单(含未下单用户)
SELECT u.name, o.order_id, o.amount
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id;
结果:
| name | order_id | amount |
|---|---|---|
| 张三 | 1001 | 299.00 |
| 李四 | NULL | NULL |
四、RIGHT JOIN(右连接)
语法与作用
SELECT 字段
FROM 表A
RIGHT JOIN 表B ON 表A.字段 = 表B.字段;
- 作用:返回右表所有记录,左表无匹配则显示NULL
- 使用场景:查找所有订单对应的用户(包括无效用户订单)
示例
查询:显示所有订单及用户信息
SELECT u.name, o.order_id, o.amount
FROM users u
RIGHT JOIN orders o ON u.user_id = o.user_id;
结果:
| name | order_id | amount |
|---|---|---|
| 张三 | 1001 | 299.00 |
| NULL | 1002 | 599.00 |
五、FULL JOIN(全连接)
语法与作用(MySQL实现方式)
SELECT 字段
FROM 表A
LEFT JOIN 表B ON 表A.字段 = 表B.字段
UNION
SELECT 字段
FROM 表A
RIGHT JOIN 表B ON 表A.字段 = 表B.字段;
- 作用:返回所有记录(类似LEFT JOIN + RIGHT JOIN去重)
- 使用场景:需要同时保留两个表所有记录的统计
示例
查询:合并用户和订单的所有记录
SELECT u.name, o.order_id, o.amount
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id
UNION
SELECT u.name, o.order_id, o.amount
FROM users u
RIGHT JOIN orders o ON u.user_id = o.user_id;
结果:
| name | order_id | amount |
|---|---|---|
| 张三 | 1001 | 299.00 |
| 李四 | NULL | NULL |
| NULL | 1002 | 599.00 |
六、复合条件 JOIN
多表关联
-- 三表关联示例
SELECT u.name,o.order_id,p.product_name
FROM users u
INNER JOIN orders o ON u.user_id = o.user_id
INNER JOIN products p ON o.product_id = p.product_id;
多条件关联
-- 日期范围关联
SELECT e.emp_name,d.dept_name,s.salary
FROM employees e
LEFT JOIN salaries s ON e.emp_id = s.emp_id AND s.effective_date BETWEEN '2023-01-01' AND '2023-12-31';
七、自连接(Self Join)
语法与作用
SELECT A.字段, B.字段
FROM 表 AS A
JOIN 表 AS B ON A.关联字段 = B.关联字段;
- 使用场景:层级数据查询(如员工与上级经理)
示例
表结构:
-- 创建员工表(包含员工ID、姓名和直属上级ID)
CREATE TABLE employees (emp_id INT PRIMARY KEY, -- 员工ID(主键)name VARCHAR(50), -- 员工姓名manager_id INT -- 直属上级的员工ID(引用emp_id)
);-- 插入示例数据(构建管理层级关系)
INSERT INTO employees VALUES
(1, 'CEO', NULL), -- CEO没有上级(manager_id为NULL)
(2, 'CTO', 1), -- CTO的上级是CEO(emp_id=1)
(3, '工程师', 2); -- 工程师的上级是CTO(emp_id=2)
查询:显示员工及其上级
-- 查询员工及其对应上级姓名(包含无上级的员工)
SELECT e.name AS employee, -- 员工姓名m.name AS manager -- 上级姓名
FROM employees e
LEFT JOIN employees m -- 自连接:将员工表同时作为员工和上级表使用ON e.manager_id = m.emp_id; -- 通过manager_id关联上级信息
结果:
| employee | manager |
|---|---|
| CEO | NULL |
| CTO | CEO |
| 工程师 | CTO |
八、常见错误与解决方法
1. 笛卡尔积问题
错误示例:
SELECT * FROM users, orders; -- 未指定关联条件
结果:用户数 × 订单数 条记录(如2用户×2订单=4条)
正确写法:
SELECT * FROM users
JOIN orders ON users.user_id = orders.user_id;
2. 别名使用不当
错误示例:
SELECT user_id FROM users u
JOIN orders o ON users.user_id = o.user_id; -- 错误:未使用别名
正确写法:
SELECT u.user_id FROM users u
JOIN orders o ON u.user_id = o.user_id;
九、最佳实践建议
- 优先使用 INNER JOIN:明确需要关联数据时使用
- 慎用 RIGHT JOIN:可通过调换表顺序改用 LEFT JOIN
- 使用表别名:提高可读性(如
users u) - 关联字段加索引:显著提升 JOIN 性能
- 避免 SELECT:明确列出需要字段
相关文章:
七、JOIN 语法详解与实战示例
一、JOIN 的作用与分类 JOIN 操作用于合并两个或多个表的行,基于表之间的关联字段。以下是常见的 JOIN 类型: JOIN 类型描述INNER JOIN返回两个表匹配的记录LEFT JOIN返回左表所有记录 右表匹配记录(右表无匹配则为NULL)RIGHT …...
Skynet入门(一)
概念 skynet 是一个为网络游戏服务器设计的轻量框架。但它本身并没有任何为网络游戏业务而特别设计的部分,所以尽可以把它用于其它领域。 设计初衷 如何充分利用它们并行运作数千个相互独立的业务。 模块设计建议 在 skynet 中,用服务 (service) 这…...
单片机栈和堆、FALSH、区别
1. Flash(闪存)(程序存储器) 用途 存储程序代码:编译后的机器指令(如 .text 段)、常量数据(如 .rodata 段)等。 掉电不丢失:程序固化在 Flash 中࿰…...
【FL0090】基于SSM和微信小程序的球馆预约系统
🧑💻博主介绍🧑💻 全网粉丝10W,CSDN全栈领域优质创作者,博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战,以及程序定制化开发…...
如何把word文档整个文档插入到excel表格里?
现象: 当我们双击此文档时可以快速打开对应的word文档 实现步骤: 1、点击一下要插入的excel表格里的单元格 2、选择上方的的【插入】【附件】的下拉框下的【对象】 3、选择【由文件创建】-【浏览】 再在弹出的框中选择【桌面】,选择要插…...
PDF文档中表格以及形状解析
我们在做PDF文档解析时有时需要解析PDF文档中的表格、形状等数据。跟解析文本类似的常见的解决方案也是两种。文档解析跟ocr技术处理。下面我们来看看使用文档解析的方案来做PDF文档中的表格、图形解析(使用pdfium库)。 表格解析: 在pdfium库…...
C++20 Lambda表达式新特性:包扩展与初始化捕获的强强联合
文章目录 一、Lambda表达式的历史回顾二、C20 Lambda表达式的两大新特性(一)初始化捕获(Init-Capture)(二)包扩展(Pack Expansion) 三、结合使用初始化捕获与包扩展(一&a…...
51c自动驾驶~合集52
我自己的原文哦~ https://blog.51cto.com/whaosoft/13383340 #世界模型如何推演未来的千万种可能 驾驶世界模型(DWM),专注于预测驾驶过程中的场景演变,已经成为追求自动驾驶的一种有前景的范式。这些方法使自动驾驶系统能够更…...
go设计模式
刘:https://www.bilibili.com/video/BV1kG411g7h4 https://www.bilibili.com/video/BV1jyreYKE8z 1. 单例模式 2. 简单工厂模式 代码逻辑: 原始:业务逻辑层 —> 基础类模块工厂:业务逻辑层 —> 工厂模块 —> 基础类模块…...
FREERTOS的三种调度方式
一、调度器的调度方式 调度器的调度方式解释针对的对象抢占式调度1.高优先级的抢占低优先级的任务 2.高优先级的任务不停止,低优先级的任务不能执行 3.被强占的任务会进入就绪态优先级不同的任务时间片调度1.同等优先级任务轮流享用CPU时间 2.没有用完的时间片&…...
前端依赖nrm镜像管理工具
npm 默认镜像 :https://registry.npmjs.org/ 1、安装 nrm npm install nrm --global2、查看镜像源列表 nrm ls3、测试当前环境下,哪个镜像源速度最快。 nrm test4、 切换镜像源 npm config get registry # 查看当前镜像源 nrm use taobao # 等价于 npm…...
redis repl_backlog_first_byte_offset 这个字段的作用
repl_backlog_first_byte_offset 是 Redis 复制积压缓冲区(Replication Backlog)中的一个关键字段,其作用是 标识积压缓冲区中第一个字节对应的全局复制偏移量。 通俗解释 当主从节点断开重连时,Redis 需要通过复制积压缓冲区&am…...
JavaScript基础(BOM对象、DOM节点、表单)
BOM对象 浏览器介绍 BOM:浏览器对象模型 IEChromeSafariFireFox 三方 QQ浏览器360浏览器 window对象 window代表浏览器窗口 window.innerHeight 734 window.innerWidth 71 window.outerHeight 823 window.outerWidth 782 Navigator对象(不常用&am…...
Java Junit框架
JUnit 是一个广泛使用的 Java 单元测试框架,用于编写和运行可重复的测试。它是 xUnit 家族的一部分,专门为 Java 语言设计。JUnit 的主要目标是帮助开发者编写可维护的测试代码,确保代码的正确性和稳定性。 JUnit 的主要特点 注解驱动&…...
23种设计模式之《备忘录模式(Memento)》在c#中的应用及理解
程序设计中的主要设计模式通常分为三大类,共23种: 1. 创建型模式(Creational Patterns) 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。 工厂方法模式࿰…...
Seaborn知识总结
1、简介 (1)高级接口:Seaborn 提供了一组高级函数和方法,可以使得创建常见的统计图表变得简单,例如散点图、线性回归图、箱线图、直方图、核密度估计图、热图等等。无需像 Matplotlib 一样写大量的代码; …...
flowable中用户相关api
springboot引入flowable:高版本mysql报错 <!-- https://mvnrepository.com/artifact/org.flowable/flowable-spring-boot-starter --><dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</art…...
java后端开发day23--面向对象进阶(四)--抽象类、接口、内部类
(以下内容全部来自上述课程) 1.抽象类 父类定义抽象方法后,子类的方法就必须重写,抽象方法在的类就是抽象类。 1.定义 抽象方法 将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样…...
安装 Open WebUI
2025.03.01 早上 我已经安装了ollama 和deeseek模型 (本地部署流水账之ollama安装Deepseek安装-CSDN博客),然后需要个与模型沟通的工具(这么说不知道对不对)。 刚开始用的chatbox,安装很方便,…...
Llama 2中的Margin Loss:为何更高的Margin导致更大的Loss和梯度?
Llama 2中的Margin Loss:为何更高的Margin导致更大的Loss和梯度? 在《Llama 2: Open Foundation and Fine-Tuned Chat Models》论文中,作者在强化学习与人类反馈(RLHF)的Reward Model训练中引入了Margin Loss的概念&a…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...
高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...
