MySQL 连表查询:原理、语法与优化
目录
引言
什么是连表查询?
连表查询的类型
1. 内连接(INNER JOIN)
2. 左连接(LEFT JOIN)
3. 右连接(RIGHT JOIN)
4. 全连接(FULL JOIN)
5. 交叉连接(CROSS JOIN)
连表查询的语法
基本语法
连表查询的示例
示例数据
1. 内连接(INNER JOIN)
2. 左连接(LEFT JOIN)
3. 右连接(RIGHT JOIN)
4. 全连接(FULL JOIN)
连表查询的优化技巧
1. 使用索引
2. 减少连接的表数量
3. 使用小表驱动大表
4. **避免 SELECT ***
5. 使用 EXPLAIN 分析查询
总结
引言
在实际的数据库应用中,数据通常分散在多个表中。为了获取完整的信息,我们经常需要通过连表查询(Join)将多个表的数据关联起来。MySQL 提供了多种连表查询的方式,包括内连接、左连接、右连接和全连接等。
本文将深入探讨 MySQL 连表查询的原理、语法以及优化技巧,帮助开发者更好地理解和使用连表查询。
什么是连表查询?
连表查询是指通过某种条件将两个或多个表中的数据关联起来,返回一个包含多个表数据的结果集。连表查询的核心是通过连接条件(Join Condition)将表中的行进行匹配。
连表查询的类型
MySQL 支持以下几种连表查询:
1. 内连接(INNER JOIN)
-
只返回两个表中满足连接条件的行。
-
语法:
SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
2. 左连接(LEFT JOIN)
-
返回左表中的所有行,以及右表中满足连接条件的行。
-
如果右表中没有匹配的行,则返回
NULL
。 -
语法:
SELECT columns
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;
3. 右连接(RIGHT JOIN)
-
返回右表中的所有行,以及左表中满足连接条件的行。
-
如果左表中没有匹配的行,则返回
NULL
。 -
语法:
SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column;
4. 全连接(FULL JOIN)
-
返回左表和右表中的所有行。
-
如果某一行在另一个表中没有匹配的行,则返回
NULL
。 -
MySQL 不支持
FULL JOIN
,但可以通过UNION
实现:
SELECT columns
FROM table1
LEFT JOIN table2
ON table1.column = table2.column
UNION
SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column;
5. 交叉连接(CROSS JOIN)
-
返回两个表的笛卡尔积,即左表中的每一行与右表中的每一行组合。
-
语法:
SELECT columns
FROM table1
CROSS JOIN table2;
连表查询的语法
基本语法
SELECT columns
FROM table1
JOIN_TYPE table2
ON table1.column = table2.column;
-
columns
:需要查询的列。 -
table1
和table2
:需要连接的表。 -
JOIN_TYPE
:连接类型(如INNER JOIN
、LEFT JOIN
等)。 -
ON
:连接条件。
连表查询的示例
示例数据
假设有两个表:
-
用户表(users):
user_id name 1 Alice 2 Bob 3 Carol -
订单表(orders):
order_id user_id amount 1 1 100.00 2 1 200.00 3 3 150.00
1. 内连接(INNER JOIN)
查询每个用户的订单信息:
SELECT users.name, orders.amount
FROM users
INNER JOIN orders
ON users.user_id = orders.user_id;
结果:
name | amount |
---|---|
Alice | 100.00 |
Alice | 200.00 |
Carol | 150.00 |
2. 左连接(LEFT JOIN)
查询所有用户及其订单信息(包括没有订单的用户):
SELECT users.name, orders.amount
FROM users
LEFT JOIN orders
ON users.user_id = orders.user_id;
结果:
name | amount |
---|---|
Alice | 100.00 |
Alice | 200.00 |
Bob | NULL |
Carol | 150.00 |
3. 右连接(RIGHT JOIN)
查询所有订单及其用户信息(包括没有用户的订单):
SELECT users.name, orders.amount
FROM users
RIGHT JOIN orders
ON users.user_id = orders.user_id;
结果:
name | amount |
---|---|
Alice | 100.00 |
Alice | 200.00 |
Carol | 150.00 |
4. 全连接(FULL JOIN)
查询所有用户和订单信息(包括没有订单的用户和没有用户的订单):
SELECT users.name, orders.amount
FROM users
LEFT JOIN orders
ON users.user_id = orders.user_id
UNION
SELECT users.name, orders.amount
FROM users
RIGHT JOIN orders
ON users.user_id = orders.user_id;
结果:
name | amount |
---|---|
Alice | 100.00 |
Alice | 200.00 |
Bob | NULL |
Carol | 150.00 |
连表查询的优化技巧
1. 使用索引
-
在连接条件列上创建索引,可以显著提升查询性能。
-
示例:
CREATE INDEX idx_user_id ON users (user_id);
CREATE INDEX idx_order_user_id ON orders (user_id);
2. 减少连接的表数量
-
尽量减少连接的表数量,避免复杂的多表连接。
3. 使用小表驱动大表
-
在连接查询中,尽量让小表驱动大表,减少扫描的行数。
4. **避免 SELECT ***
-
只查询需要的列,减少数据传输量。
5. 使用 EXPLAIN 分析查询
-
使用
EXPLAIN
命令分析查询执行计划,检查是否使用了索引。 -
示例:
EXPLAIN SELECT users.name, orders.amount
FROM users
INNER JOIN orders
ON users.user_id = orders.user_id;
总结
连表查询是 MySQL 中非常重要的功能,它可以帮助我们从多个表中获取关联数据。通过理解不同类型的连表查询及其应用场景,并结合索引和优化技巧,可以显著提升查询性能。
在实际应用中,建议根据业务需求合理设计表结构和索引,并定期优化查询语句,以确保数据库的高效运行。
相关文章:
MySQL 连表查询:原理、语法与优化
目录 引言 什么是连表查询? 连表查询的类型 1. 内连接(INNER JOIN) 2. 左连接(LEFT JOIN) 3. 右连接(RIGHT JOIN) 4. 全连接(FULL JOIN) 5. 交叉连接(…...
力扣2382. 删除操作后的最大子段和
力扣2382. 删除操作后的最大子段和 题目 题目解析及思路 题目要求找到每次删除一个元素的最大字段和 因为删除不好做,可以转删除为添加,用并查集维护当前子段和 两部分合并(两个并查集),三部分求和(两个并查集和一个元素) 代码 class S…...
PMP--题库--一模--纯问题
文章目录 单选题 (每题1分,共170道题)1、 [单选] 根据项目的特点,项目经理建议选择一种敏捷方法,该方法限制团队成员在任何给定时间执行的任务数。此方法还允许团队提高工作过程中问题和瓶颈的可见性。项目经理建议采用…...
C++核心指导原则: 错误处理
C Core Guidelines 整理目录 哲学部分接口(Interface)部分函数部分类和类层次结构部分枚举部分资源管理部分性能部分错误处理 E: Error handling E.1: Develop an error-handling strategy early in a design 翻译: 在设计早期制定一个错误处理策略。原因: 为确保代码的健壮…...
豆包、扣子等产品如何与CSDN合作?
要实现CSDN开发者社区与豆包、扣子等产品的深度合作,构建创作者Agent生态体系,可通过以下结构化方案实现技术、生态与商业价值的闭环(含具体实施路径与数据指标): 一、战略合作框架搭建 开放平台互通 建立三方API网关&…...
C#开发——ConcurrentDictionary集合
ConcurrentDictionary<TKey, TValue> 是 C# 中一个专为多线程场景设计的线程安全字典集合,位于 System.Collections.Concurrent 命名空间中。它允许多个线程同时对字典进行读写操作,而无需额外的同步措施。 一、集合特征 此集合有如下特征…...
CSS `transform` 属性详解:打造视觉效果与动画的利器
CSS transform 属性详解:打造视觉效果与动画的利器 引言一、transform 属性简介二、平移(Translation)三、旋转(Rotation)四、缩放(Scale)五、倾斜(Skew)六、组合变换&am…...
Python 进阶特性深度解析:从语法糖到内存管理的统一视角
生成式(推导式)的用法与内存效率分析 Python 的推导式不仅仅是语法糖,它们在内存管理和性能方面有着深刻的影响。理解推导式的工作原理,有助于我们写出更高效的代码。 推导式的内存模型分析 列表推导式在 CPython 解释器中的实现实际上比等价的 for 循环更为高效: # 列…...
eclipse配置Spring
1、从eclipse下载Spring工具 进入 help – install new software… ,如下图: 点击 add ,按以下方式输入: Name : Spring Location : http://dist.springsource.com/release/TOOLS/update/e4.10/ 之后点击 add ,等待…...
属性绑定
双大括号不能在html属性中使用,想要响应式地绑定一个属性,应用v-bind指令 <script > export default{data(){return{dynamicId:"appid",dynamicClass:"appclass"}} } </script><template><div v-bind:id"…...
深入讲解微信小程序 <canvas> 标签的 type=“2d“属性
在微信小程序开发中,<canvas> 组件是一个非常强大的工具,允许开发者创建动态图形和动画。然而,正确设置 <canvas> 的 type 属性是确保其正常工作的关键之一。本文将深入探讨 type"2d" 属性的重要性、使用场景及其在实际…...
基于PSO-LSTM长短期记忆神经网络的多分类预测【MATLAB】
一、研究背景与意义 在时间序列分类、信号识别、故障诊断等领域,多分类预测任务对模型的时序特征捕捉能力提出了极高要求。传统LSTM网络虽能有效建模长程依赖关系,但其性能高度依赖超参数的选择,例如隐含层神经元数量、学习率、迭代次数等。…...
Linux----线程
一、基础概念对比 特性进程 (Process)线程 (Thread)资源分配资源分配的基本单位(独立地址空间)共享进程资源调度单位操作系统调度单位CPU调度的最小单位创建开销高(需复制父进程资源)低(共享进程资源)通信…...
自注意力机制和CNN的区别
CNN:一种只能在固定感受野范围内进行关注的自注意力机制。CNN是自注意力的简化版本。自注意力:具有可学习感受野的CNN。自注意力是CNN的复杂形态,是更灵活的CNN,经过某些设计就可以变为CNN。 越灵活、越大的模型,需要…...
【qt链接mysql】
首先根据自己qtcreater 下载mysql安装包 将mysql安装目录下的如下目录中的xxx\MySQL\MySQL Server 5.7\lib\libmysql.dll 拷贝到QT目录C:\Qt\5.7\mingw53_32\bin 下(当前这个也是我电脑上的Qt路径,请找到你Qt对应的bin路径) 直接在文win11上…...
Parameter 与 Param 有什么区别
Parameter 与 Param Parameter 与 Param 意思相同,在大多数情况下可以互换使用,它们在用法和语境有一些细微的区别 1、Parameter Parameter 是一个完整的单词,是正式术语,广泛用于数学、统计学、计算机科学、工程等领域 在数学…...
【前端】【功能函数】treeMapEach,对每个节点进行自定义转换的实用函数
一、功能说明 这是一个递归遍历树形结构数据,并对每个节点进行自定义转换的实用函数。它会对原始树中的每个节点执行 conversion 函数,最终生成一个包含转换后结果的新树结构。 二、核心作用 树形结构遍历:深度优先递归遍历所有子节点数据…...
C#初级教程(5)——解锁 C# 变量的更多奥秘:从基础到进阶的深度指南
一、变量类型转换:隐式与显式的门道 (一)隐式转换:编译器的 “贴心小助手” 隐式转换是编译器自动进行的类型转换,无需开发者手动干预。这种转换通常发生在将取值范围小的数据类型赋值给取值范围大的数据类型时&#…...
初步学习java 动态代理
前言 在学习 动态代理知识之前,可以先了解 反射 反射的复习-CSDN博客 场景 我们知道,一些大明星开演出会,要收门票,准备场景啥的。但很显然 明星,他们主要还是 唱歌,跳舞,和粉丝互动。那么 其…...
QT 基础知识点
1.基础窗口类QMainWindow qDialog Qwidget 随项目一起创建的窗口基类有三个可选QMainWindow qDialog Qwidget 1.1 Qwidget 是所有窗口的基类,只要是他的子类,或子类的子类,都具有他的属性。 右键项目 Add New -> Qt qt设计师界面类&am…...
unity学习53:UI的子容器:面板panel
目录 1 UI的最底层容器:canvas 1.1 UI的最底层容器:canvas 1.2 UI的合理结构 2 UI的子容器:面板panel 2.1 创建panel 2.2 面板的本质: image ,就是一个透明的图片,1个空容器 3 面板的属性 4 面板的…...
Qt如何将数据传入labview,Qt又如何从labview中读取数据?
Qt如何将数据传入labview,Qt又如何从labview中读取数据? Qt如何将数据传入labviewQt如何从labview中读取数据 Qt如何将数据传入labview Qt如何从labview中读取数据...
JWT使用教程
目录 JWT (JSON Web Token)1. JWT简介(1) 什么是JWT(2) JWT有什么用(3) JWT认证方式 2. JWT的组成部分3. 签名的目的4. JWT与Token的区别5 JWT的优势6 JJWT签发与验证token(1) 引入依赖(2) 创建 Token(3) 解析Token(4) 设置过期时间(5) 自定义claims 7. JWT自定义工具类 JWT (J…...
数据结构——静态顺序表,动态顺序表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使 ⽤的 数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在…...
前端Sass面试题及参考答案
目录 什么是 Sass? Sass 和 CSS 的主要区别是什么? Sass 中如何处理列表? Sass 中如何处理映射(map)? Sass 中如何使用函数? Sass 中如何使用内置函数? Sass 中如何设置默认值? Sass 中的 @function 和 @mixin 有什么区别? Sass 中如何实现模块化? Sass 中…...
ubuntu20.04音频aplay调试
1、使用指定声卡,aplay 播放命令 aplay -D plughw:1,0 test2.wav2、 录音 arecord -Dhw:1,0 -d 10 -f cd -r 44100 -c 2 -t wav test.wav3、各个参数含义 -D 指定声卡编号 plughw:0,0 //0,0代表card0,device0,可以通过arecord -l获取 -f 录音格式 S16_LE…...
比特信噪比与信噪比SNR的换算公式
在无线通信系统中,比特信噪比与信噪比(SNR,通常指符号信噪比Es/N0)的换算: 核心公式 E b N 0 SNR R ⋅ log 2 M \boxed{ \frac{E_b}{N_0} \frac{\text{SNR}}{R \cdot \log_2 M} } N0EbR⋅log2MSNR 或…...
RTSP场景下RTP协议详解及音视频打包全流程
RTSP场景下RTP协议详解及音视频打包全流程 一、RTSP与RTP的关系 RTSP:负责媒体会话控制(DESCRIBE、SETUP、PLAY、PAUSE),通过SDP协商传输参数(端口、编码格式、封装模式)。RTP:实际传输音视频数…...
java练习(39)
ps:题目来自力扣 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以…...
2.24DFS和BFS刷题
洛谷P2895:用BFS走出危险区域,危险区域存在时间,我们用ma记录最快变成危险区域的时间, 然后每次枚举时间1然后跟ma数组比较看能不能走,然后时间复杂度为O(305^2)。 #include<iostream> #include<cstring>…...
基于YOLO11深度学习的运动鞋品牌检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
赛前启航 | 三场重磅直播集结,予力微软 AI 开发者挑战赛!
随着微软 AI 开发者挑战赛的火热进行,赛前指导直播已成为众多参赛者获取技术干货、灵感碰撞和实战技巧的绝佳平台。继前两期的精彩呈现,第三、四、五期直播即将接连登场,为开发者们带来更加深入的 AI 技术剖析和项目实战指引。无论你是想进一…...
MySQL数据库连接池泄露导致MySQL Server超时关闭连接
前言 最近做项目,发现老项目出现xxx,这个错误其实很简单,出现在MySQL数据库Server端对长时间没有使用的client连接执行清楚处理,因为是druid数据库,且在github也出现这样的issue:The last packet successf…...
Deepseek和Grok 3对比:写一段冒泡排序
1、这是访问Grok 3得到的结果 2、grok3输出的完整代码: def bubble_sort(arr):n len(arr) # 获取数组长度# 外层循环控制排序轮数for i in range(n):# 内层循环比较相邻元素,j的范围逐渐减少for j in range(0, n - i - 1):# 如果当前元素大于下一个元…...
EX_25/2/22
找到第一天mystring练习,实现以下功能 mystring str "hello" mystring ptr "world" str str ptr; str ptr str[0] H #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #in…...
el-select滚动获取下拉数据;el-select滚动加载
el-select下拉获取数据 1.解决问题2.封装MyScrollSelect组件3.使用MyScrollSelect组件 1.解决问题 场景:下拉数据量过大,后端提供一个分页查询接口;需要每次滚动加载下一页的下拉数据 且单选的状态,需要支持回显,通过n…...
Spring Boot面试题
Spring Boot面试题 基础概念 Q1: Spring Boot的核心特性有哪些? public class SpringBootBasicDemo {// 1. 自动配置SpringBootApplicationpublic class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class…...
STM32-智能小车项目
项目框图 ST-link接线 实物图: 正面: 反面: 相关内容 使用L9110S电机模块 电机驱动模块L9110S详解 | 良许嵌入式 一、让小车动起来 新建文件夹智能小车项目 在里面复制19-串口打印功能 重命名为01-让小车动起来 新建文件夹motor&…...
SAP-ABAP:ABAP第一代增强详解
在SAP ABAP开发中,第一代增强(First-Generation Enhancement) 是早期用于扩展标准程序功能的传统技术,主要通过预定义的增强点(Enhancement Points)实现。以下是详细解析: 一、第一代增强的核心…...
20分钟 Bash 上手指南
文章目录 bash 概念与学习目的第一个 bash 脚本bash 语法变量的使用位置参数管道符号(过滤条件)重定向符号条件测试命令条件语句case 条件分支Arrayfor 循环函数exit 关键字 bash 脚本记录历史命令查询文件分发内容 bash 概念与学习目的 bash࿰…...
地铁站内导航系统:基于蓝牙Beacon与AR技术的动态路径规划技术深度剖析
本文旨在分享一套地铁站内导航系统技术方案,通过蓝牙Beacon技术与AI算法的结合,解决传统导航定位不准确、路径规划不合理等问题,提升乘客出行体验,同时为地铁运营商提供数据支持与增值服务。 如需获取校地铁站内智能导航系统方案文…...
WordPress R+L Carrier Edition sql注入漏洞复现(CVE-2024-13481)(附脚本)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...
滴水逆向_引用_友元函数_运算符重载
作业: 运算符号重载实现。 struct Person { public:int x;int y; public:Person(){this->x 10;this->y 20;}Person(int x, int y){this->x x;this->y y;}//申明友元函数void Printf(const Person& p){printf("%d %d",p.x,p.y);}/…...
git中,如何查看具体单个文件的log
在 Git 中,可以使用多种方式查看单个文件的提交日志(Log),以下详细介绍不同场景下的查看方法: 目录 一、基本命令查看文件的完整提交日志 二、查看文件提交日志并显示差异内容 三、限制显示的提交日志数量 四、按…...
如何生成traceid以及可视化展示
根据你的需求,以下是一些可以生成唯一 traceId 并用于分布式链路追踪的工具和项目,这些项目支持生成唯一的 traceId,并将其用于日志记录和分布式追踪: 1. OpenTelemetry OpenTelemetry 是一个开源的观测框架,支持生成…...
2024 ICPC香港站 L.Flipping Paths的一种解法
太变态了,场上被硬控了两个小时,最后20分钟思路熬出来了但是没写对~,糖完了。怎么说呢,香港站这样的轻量级赛站,这次强队也很少,导致很多题目的难度升级了,这道L题是一道银牌题,不少…...
Uniapp 开发中遇到的坑与注意事项:全面指南
文章目录 1. 引言Uniapp 简介开发中的常见问题本文的目标与结构 2. 环境配置与项目初始化环境配置问题解决方案 项目初始化注意事项解决方案 常见错误与解决方案 3. 页面与组件开发页面生命周期注意事项示例代码 组件通信与复用注意事项示例代码 样式与布局问题注意事项示例代码…...
Python - 代码片段分享 - Excel 数据实时写入方法
文章目录 前言注意事项工具 pandas1. 简介2. 安装方式3. 简单介绍几个api 实战片段 - 实时写入Excel文件结束语 要么出众,要么出局 前言 我们在爬虫采集过程中,总是将数据解析抓取后统一写入Excel表格文件,如果在解析数据出现问题容易出现数据…...
一文详解U盘启动UEFI/Legacy方式以及GPT/MBR关系
对于装系统的老手而说一直想研究一下装系统的原理,以及面对一些问题时的解决思路,故对以前的方法进行原理上的解释,主要想理解其底层原理。 引导模式 MBR分区可以同时支持UEFI和Legacy引导,我们可以看一下微pe制作的启动盘&#…...
Java函数式接口的巧妙应用
引言 函数式接口(Functional Interface)是Java 8引入的一个重要概念,它是Lambda表达式和方法引用的基础。通过函数式接口,Java实现了对函数式编程的支持,让代码更加简洁、灵活。本文将带你深入理解函数式接口…...