【MySQL】提高篇—复杂查询:多表连接(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN)

在关系数据库中,数据通常分散在多个表中。为了获取相关联的数据,需要使用表连接(JOIN)操作。

表连接允许我们在一个查询中结合多个表的数据,这在实际应用中非常重要。

例如,在一个电商系统中,用户信息可能存储在 users 表中,而订单信息可能存储在 orders 表中。通过连接这两个表,可以轻松地查询到每个用户的订单记录。

本节中,将详细介绍 MySQL 中的多表连接,包括 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN,并通过具体示例来通俗易懂地解释每种连接的概念和用法。

1. INNER JOIN

概念: INNER JOIN 返回两个表中匹配的记录。只有当在两个表中都存在相应的记录时,才会将它们结合在一起。

示例:INNER JOIN

假设我们有两个表:usersorders

-- 创建 users 表
CREATE TABLE users (user_id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL
);-- 创建 orders 表
CREATE TABLE orders (order_id INT PRIMARY KEY AUTO_INCREMENT,user_id INT,product_name VARCHAR(100),FOREIGN KEY (user_id) REFERENCES users(user_id)
);

插入数据

-- 插入用户数据
INSERT INTO users (username) VALUES
('Alice'),
('Bob'),
('Charlie');-- 插入订单数据
INSERT INTO orders (user_id, product_name) VALUES
(1, 'Laptop'),
(1, 'Mouse'),
(2, 'Keyboard');

查询示例

-- 使用 INNER JOIN 查询用户及其订单
SELECT users.username, orders.product_name
FROM users
INNER JOIN orders ON users.user_id = orders.user_id;

解释

  • INNER JOIN:连接 users 表和 orders 表。

  • ON users.user_id = orders.user_id:指定连接条件,即用户ID必须匹配。

  • 结果将返回所有有订单的用户及其对应的产品名称。

查询结果

+----------+--------------+
| username | product_name |
+----------+--------------+
| Alice    | Laptop       |
| Alice    | Mouse        |
| Bob      | Keyboard     |
+----------+--------------+

2. LEFT JOIN

概念: LEFT JOIN 返回左表(第一个表)中的所有记录,即使在右表(第二个表)中没有匹配的记录。如果右表中没有匹配的记录,结果中右表的字段将返回 NULL。

示例:LEFT JOIN

查询示例

-- 使用 LEFT JOIN 查询用户及其订单(包括没有订单的用户)
SELECT users.username, orders.product_name
FROM users
LEFT JOIN orders ON users.user_id = orders.user_id;

解释

  • LEFT JOIN:返回 users 表中的所有用户,即使他们没有订单。

  • 如果某个用户没有订单,product_name 将为 NULL。

查询结果

+----------+--------------+
| username | product_name |
+----------+--------------+
| Alice    | Laptop       |
| Alice    | Mouse        |
| Bob      | Keyboard     |
| Charlie  | NULL         |
+----------+--------------+

3. RIGHT JOIN

概念: RIGHT JOIN 返回右表中的所有记录,即使在左表中没有匹配的记录。如果左表中没有匹配的记录,结果中左表的字段将返回 NULL。

示例:RIGHT JOIN

查询示例

-- 使用 RIGHT JOIN 查询订单及其对应的用户(包括没有用户的订单)
SELECT users.username, orders.product_name
FROM users
RIGHT JOIN orders ON users.user_id = orders.user_id;

解释

  • RIGHT JOIN:返回 orders 表中的所有订单,即使没有对应的用户。

  • 如果某个订单没有对应的用户,username 将为 NULL。

查询结果

+----------+--------------+
| username | product_name |
+----------+--------------+
| Alice    | Laptop       |
| Alice    | Mouse        |
| Bob      | Keyboard     |
| NULL     | NULL         |
+----------+--------------+

4. FULL JOIN

概念: FULL JOIN 返回两个表中的所有记录。对于没有匹配的记录,结果中将返回 NULL。请注意,MySQL 不直接支持 FULL JOIN,但可以通过 UNION 实现相同的效果。

示例:FULL JOIN(通过 UNION 实现)

查询示例

-- 使用 UNION 实现 FULL JOIN
SELECT users.username, orders.product_name
FROM users
LEFT JOIN orders ON users.user_id = orders.user_idUNIONSELECT users.username, orders.product_name
FROM users
RIGHT JOIN orders ON users.user_id = orders.user_id;

解释

  • 第一个查询使用 LEFT JOIN 返回所有用户及其订单。

  • 第二个查询使用 RIGHT JOIN 返回所有订单及其用户。

  • UNION 将两个结果集合并,去除重复记录。

查询结果

+----------+--------------+
| username | product_name |
+----------+--------------+
| Alice    | Laptop       |
| Alice    | Mouse        |
| Bob      | Keyboard     |
| Charlie  | NULL         |
| NULL     | NULL         |
+----------+--------------+

5. 总结

通过本节的示例,您应该能够理解 MySQL 中多表连接的不同类型及其应用场景:

  • INNER JOIN:只返回两个表中匹配的记录。

  • LEFT JOIN:返回左表的所有记录及右表中匹配的记录。

  • RIGHT JOIN:返回右表的所有记录及左表中匹配的记录。

  • FULL JOIN:返回两个表中的所有记录(通过 UNION 实现)。

这些连接操作在实际应用中非常重要,能够帮助我们从多个表中提取和组合数据,以满足复杂的查询需求。

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

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

相关文章

ChatGPT国内中文版镜像网站整理合集(2024/10/06)

一、GPT中文镜像站 ① yixiaai.com 支持GPT4、4o以及o1,支持MJ绘画 ② chat.lify.vip 支持通用全模型,支持文件读取、插件、绘画、AIPPT ③ AI Chat 支持GPT3.5/4,4o以及MJ绘画 1. 什么是镜像站 镜像站(Mirror Site&#xff…

Spring Boot在线考试系统:JavaWeb技术的应用案例

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

英飞达医学影像存档与通信系统 WebUserLogin.asmx 信息泄露漏洞复现

0x01 产品简介 英飞达医学影像存档与通信系统 Picture Archiving and Communication System,它是应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,超声,各种X光机,各种红外仪、显微仪等设备产生的图像)通过各种接口(模拟,DICOM,网络…

概率 随机变量以及分布

一、基础定义及分类 1、随机变量 随机变量是一个从样本空间(所有可能结果的集合)到实数集的函数。(随机变量的值可以是离散的,也可以是连续的。 ) 事件可以定义为随机变量取特定值的集合。 2、离散型随机变量 随机变…

OpenCV高级图形用户界面(17)设置一个已经创建的滚动条的最小值函数setTrackbarMin()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::setTrackbarMin 这个函数的作用就是设置指定窗口中轨迹条的最小位置。这使得开发者能够在程序运行时动态地调整轨迹条的范围,而不…

Leetcode—1242. 多线程网页爬虫【中等】Plus(多线程)

2024每日刷题&#xff08;187&#xff09; Leetcode—1242. 多线程网页爬虫 实现代码 /*** // This is the HtmlParsers API interface.* // You should not implement it, or speculate about its implementation* class HtmlParser {* public:* vector<string>…

Go程序的一生——Go如何跑起来的?

引入编译链接概述 编译过程 词法分析语法分析语义分析中间代码生成目标代码生成与优化链接过程Go 程序启动GoRoot 和 GoPathGo 命令详解 go buildgo installgo run总结参考资料 引入 我们从一个 Hello World 的例子开始&#xff1a; package mainimport "fmt"func…

PROFINET开发EtherNet/IP开发Vline板卡在称重设备行业的应用

本次分享的&#xff0c;是我们VlinePROFINET开发EtherNet/IP开发嵌入式板卡在称重行业的典型应用。 应用背景 在现代科技高度发达的时代&#xff0c;无论是科学研究、医疗诊断、制药生产还是工业制造&#xff0c;准确的测量和称重都是保证质量和效率的关键。 随着新项目实施…

【BGA布局布线-熬夜加班整理】

BGA CHIP PLACEMENT AND ROUTING RULE BGA 是 PCB 上常用的组件&#xff0c;通常 CPU、NORTH BRIDGE、SOUTH BRIDGE、 AGP CHIP、CARD BUS CHIP…等&#xff0c;大多是以 bga 的型式包装&#xff0c;简言之&#xff0c;80&#xfe6a;的 高频信号及特殊信号将会由这类型的 pac…

自动化测试与敏捷开发的重要性

敏捷开发与自动化测试是现代软件开发中两个至关重要的实践&#xff0c;它们相互补充&#xff0c;共同促进了软件质量和开发效率的提升。 敏捷开发的重要性 敏捷开发是一种以人为核心、迭代、循序渐进的软件开发方法。它强调以下几个核心价值观和原则&#xff1a; 个体和交互…

服务器技术研究分析:存储从HBM到CXL

服务器变革&#xff1a;存储从HBM到CXL 在《从云到端&#xff0c;AI产业的新范式&#xff08;2024&#xff09;》中揭示&#xff0c;传统服务器价格低至1万美金&#xff0c;而配备8张H100算力卡的DGX H100AI服务器价值高达40万美金&#xff08;约300万人民币&#xff09;。 从供…

jmeter使用文档

文章目录 一、安装使用1、下载2、bin/jmeter.properties介绍 二、windows使用1、微调&#xff08;1&#xff09;界面样式&#xff08;2&#xff09;修改语言 2、简单使用3、各组件详解&#xff08;1&#xff09;CSV 数据文件配置&#xff08;2&#xff09;BeanShell取样器 三、…

Golang | Leetcode Golang题解之第478题在圆内随机生成点

题目&#xff1a; 题解&#xff1a; type Solution struct {radius, xCenter, yCenter float64 }func Constructor(radius, xCenter, yCenter float64) Solution {return Solution{radius, xCenter, yCenter} }func (s *Solution) RandPoint() []float64 {r : math.Sqrt(rand.…

C++之设计原则

在C中&#xff0c;设计原则是一套指导软件开发过程中决策和设计模式的准则&#xff0c;旨在提高软件的可维护性、可扩展性、灵活性和可靠性。 以下是几种核心设计原则&#xff1a; 1.单一职责 功能单一&#xff0c;方便组合和复用。 图示&#xff1a; 应用场景&#xff1a;…

【godot游戏引擎学习笔记】初识界面

个人笔记&#xff0c;学习自B站视频BV1ut42177r8 目录 渲染器的选择 Forward 移动 兼容 编辑器页面 浏览场景&#xff08;左上角&#xff09; 文件浏览器&#xff08;左下角&#xff09; 属性检查器&#xff08;右侧&#xff09; 场景编辑器&#xff08;中间&#x…

electron本地OCR实现

使用tesseract.js - npm (npmjs.com) 官方demo&#xff1a;GitHub - Balearica/tesseract.js-electron: An example to use tesseract.js in electron 目录结构&#xff1a; // 引入 <script type"module" src"./ocr/tesseract.js"></script>…

如何设置 GitLab 密码过期时间?

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 60天专业…

Go-知识反射

Go-知识反射 1. 接口1.1 类型1.2 interface 类型1.2.1 interface 变量1.2.2 实现接口1.2.3 复合类型1.2.4 空 interface 2. 反射定律2.1 reflect 包2.2 反射可以将 interface 类型变量转换为反射对象2.3 反射可以将反射对象还原成 interface 对象2.4 反射对象可修改&#xff0c…

Oracle权限安全管理

实验内容 本次实验先使用system用户连接 温馨提示&#xff1a;题目要求切换账户登录的时候自己记得切换&#xff0c;本文章只提供相应的SQL语句 在表空间BOOKTBS1&#xff08;实验4第1题已创建&#xff09;创建一张表BOOKS,其字段如下&#xff1a;&#xff1a; SQL> create…

一次性语音芯片:重塑语音识别技术,引领智能化生活新时代

随着一次性语音芯片的突破性进展&#xff0c;语音识别技术正融入我们生活的方方面面&#xff0c;引领着智能化生活迈向一个全新的时代。这些芯片不仅体积小巧、成本低廉&#xff0c;更在性能上实现了质的飞跃&#xff0c;能够更精确地捕捉并理解人类语音。本文将解读关于一次性…