mysql学习教程,从入门到精通,SQL LEFT JOIN 语句(23)
1、SQL LEFT JOIN 语句
在SQL中,LEFT JOIN(也称为左连接)是一种将左表(LEFT JOIN左侧的表)的所有记录与右表(LEFT JOIN右侧的表)中匹配的记录结合起来的查询方式。如果左表中的记录在右表中没有匹配,则结果中这些记录的右表部分将包含NULL。这非常有用,尤其是当你想要从一个表中获取所有记录,并且想要获取与之相关联的另一个表中的信息(如果存在的话)时。
下面是一个简单的LEFT JOIN语句的示例。假设我们有两个表:employees(员工表)和departments(部门表)。employees表有一个department_id字段,它引用了departments表中的id字段。
employees 表结构
| id | name | department_id |
|---|---|---|
| 1 | Alice | 1 |
| 2 | Bob | 2 |
| 3 | Charlie | 3 |
departments 表结构
| id | name |
|---|---|
| 1 | HR |
| 2 | Engineering |
我们想要查询所有员工及其对应的部门名称,即使某些员工没有分配部门(即department_id在departments表中没有对应的记录)。
SQL LEFT JOIN 语句
SELECT employees.name AS employee_name, departments.name AS department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;
这条SQL语句会返回以下结果:
| employee_name | department_name |
|---|---|
| Alice | HR |
| Bob | Engineering |
| Charlie | NULL |
在这个结果中,Alice和Bob都成功匹配到了他们所属的部门名称,而Charlie在departments表中没有对应的department_id,因此他的department_name显示为NULL。这正是LEFT JOIN的作用所在:它确保了左表(employees)中的所有记录都会出现在结果中,即使它们在右表(departments)中没有匹配项。
当然可以。以下是一个更实际的LEFT JOIN案例,假设我们在运营一个在线书店,并且有两个主要的数据库表:orders(订单表)和customers(客户表)。我们想要查询所有订单的信息,包括下单的客户名称,即使某些订单可能还没有关联到具体的客户(虽然这在现实中不太常见,但可以作为示例来说明LEFT JOIN的用法)。
orders 表结构
| order_id | customer_id | order_date | total_amount |
|---|---|---|---|
| 1 | 1 | 2023-01-01 | 100.00 |
| 2 | 2 | 2023-01-02 | 150.00 |
| 3 | NULL | 2023-01-03 | 50.00 |
customers 表结构
| customer_id | name | |
|---|---|---|
| 1 | John Doe | john.doe@example.com |
| 2 | Jane Smith | jane.smith@example.com |
现在,我们想要查询所有订单的信息,包括每个订单的客户名称(如果有的话)。由于订单3没有customer_id,我们将使用LEFT JOIN来确保这个订单也出现在结果中,并且客户名称将为NULL。
SQL LEFT JOIN 语句
SELECT orders.order_id, orders.order_date, orders.total_amount, customers.name AS customer_name
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id;
这条SQL语句会返回以下结果:
| order_id | order_date | total_amount | customer_name |
|---|---|---|---|
| 1 | 2023-01-01 | 100.00 | John Doe |
| 2 | 2023-01-02 | 150.00 | Jane Smith |
| 3 | 2023-01-03 | 50.00 | NULL |
即使订单3没有关联的客户(customer_id为NULL),它也出现在了结果中,并且customer_name列显示为NULL。这正是LEFT JOIN在处理此类场景时的优势所在。
当然可以,为了提供一个更复杂的LEFT JOIN案例,我们可以考虑一个涉及三张表的场景:一个在线书店的订单系统。这个系统包括orders(订单表)、customers(客户表)和books(书籍表)。我们的目标是查询每个订单的信息,包括订单ID、订单日期、总金额、客户名称以及所购买的书籍名称,即使某些订单可能只包含部分书籍信息(假设有些订单信息尚未完全录入书籍信息)。
表结构概述:
-
orders 表
- order_id: 订单ID
- customer_id: 客户ID
- order_date: 订单日期
- total_amount: 总金额
-
customers 表
- customer_id: 客户ID
- name: 客户名称
- email: 电子邮件
-
order_details 表
(新增表,用于存储订单中的书籍详情)
- detail_id: 详情ID
- order_id: 订单ID
- book_id: 书籍ID
- quantity: 数量
books 表
- book_id: 书籍ID
- title: 书籍名称
- author: 作者
在这个案例中,我们需要将orders表与customers表进行LEFT JOIN以获取订单的客户信息,然后再将结果与order_details表和books表进行连接以获取书籍信息。但是,由于我们想要直接显示书籍名称而不是通过order_details表间接获取(因为那样会得到重复的订单信息),我们需要使用子查询或临时表来优化查询。不过,为了保持示例的简洁性,这里我将展示一个使用多次LEFT JOIN的查询,尽管它可能不是最优的解决方案。
SQL LEFT JOIN 语句(简化版,可能不是最优)
SELECT o.order_id, o.order_date, o.total_amount, c.name AS customer_name, bd.book_id, b.title AS book_title
FROM orders o
LEFT JOIN customers c ON o.customer_id = c.customer_id
LEFT JOIN order_details bd ON o.order_id = bd.order_id
LEFT JOIN books b ON bd.book_id = b.book_id;
注意:
- 这个查询可能会为每个订单中的每本书生成一行结果,如果你想要的是每个订单的汇总信息(例如,所有书籍的名称以某种方式聚合),你可能需要使用
GROUP_CONCAT(在MySQL中)或其他字符串聚合函数,或者将查询结果作为子查询进一步处理。 - 在实际应用中,如果订单与书籍之间是多对多的关系(即一个订单可以包含多本书,一本书也可以出现在多个订单中),并且你想要避免结果中的重复订单信息,你可能需要使用
GROUP BY子句结合聚合函数来整理结果。
更复杂的处理(假设需要聚合书籍名称)
如果你想要的是每个订单及其对应的所有书籍名称(以逗号分隔或其他方式聚合),你可以使用MySQL的GROUP_CONCAT函数,如下所示:
SELECT o.order_id, o.order_date, o.total_amount, c.name AS customer_name, GROUP_CONCAT(b.title SEPARATOR ', ') AS book_titles
FROM orders o
LEFT JOIN customers c ON o.customer_id = c.customer_id
LEFT JOIN order_details bd ON o.order_id = bd.order_id
LEFT JOIN books b ON bd.book_id = b.book_id
GROUP BY o.order_id;
这个查询将每个订单的书籍名称聚合为一个由逗号分隔的字符串,并返回每个订单的汇总信息。
相关文章:
mysql学习教程,从入门到精通,SQL LEFT JOIN 语句(23)
1、SQL LEFT JOIN 语句 在SQL中,LEFT JOIN(也称为左连接)是一种将左表(LEFT JOIN左侧的表)的所有记录与右表(LEFT JOIN右侧的表)中匹配的记录结合起来的查询方式。如果左表中的记录在右表中没有…...
VSCode远程切换Python虚拟环境
VSCode远程切换Python虚拟环境 引言 在现代开发环境中,使用虚拟环境来管理项目依赖是一种普遍的做法。它不仅可以避免不同项目间的依赖冲突,还能让开发者更好地控制和隔离各个项目的环境。Visual Studio Code(VSCode)是一款广受…...
【CSS in Depth 2 精译_038】6.2 CSS 定位技术之:绝对定位
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结)第二章 相对单位(已完结)第三章 文档流与盒模型(已完结)第四章 Flexbox 布局(已…...
828 华为云征文|华为 Flexus 云服务器搭建 SamWaf 开源轻量级网站防火墙
在当今数字化高速发展的时代,网络安全问题日益凸显。为了保障网站的稳定运行和数据安全,我们可以借助华为 Flexus 云服务器搭建 SamWaf 开源轻量级网站防火墙。这不仅是一次技术的挑战,更是为网站筑牢安全防线的重要举措。 一、华为 Flexus …...
基于二自由度汽车模型的汽车质心侧偏角估计
一、质心侧偏角介绍 在车辆坐标系中,质心侧偏角通常定义为质心速度方向与车辆前进方向的夹角。如下图所示,u为车辆前进方向,v为质心速度方向,u和v之间的夹角便是质心侧偏角。 质心侧偏角的作用有如下三点: 1、稳定性…...
前端html+css+js 基础总结
HTML 行级元素 标签分为行级元素与块级元素 行级元素占据区域由其显示内容决定,如span,img(图片),<a></a>基本格式: <a href"链接" target"_blank"></a>用于跳转到其他网站,…...
若依VUE项目安全kind-of postcss vite漏洞扫描和修复
npm install unplugin-auto-import0.16.7 npm install vite3.2.11 升级vite、unplugin-auto-import npm install 报错New major version of npm available! 8.5.5 -> 10.8.3,使用命令npm install --force npm install --force...
C语言实现简单凯撒密码算法
**实验2:传统密码技术 【实验目的】 通过本次实训内容,学习常见的传统密码技术,通过编程实现简单代替密码中的移位密码算法,加深对传统密码技术的了解,为深入学习密码学奠定基础。【技能要求】 分析简单代替密码中的移…...
多态的使用和原理(c++详解)
一、多态的概念 多态顾名思义就是多种形态,它分为编译时的多态(静态多态)和运行时的多态(动态多态),编译时多态(静态多态)就是函数重载,模板等,通过不同的参数…...
OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【Trace调测】
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 Trace调测旨在帮助开发者获取内核的运行流程,…...
Lombok 在 IntelliJ IDEA 中的使用步骤
Lombok 是一个非常流行的 Java 库,它通过注解简化 Java 类的开发,特别是在处理 POJO(Plain Old Java Objects)类时,如生成 getter、setter、toString 等常用方法。Lombok 在减少样板代码(boilerplate code&…...
计算机网络 --- Socket 编程
序言 在上一篇文章中,我们介绍了 协议,协议就是一种约定,规范了双方通信需要遵循的规则、格式和流程,以确保信息能够被准确地传递、接收和理解。 在这篇文章中我们将介绍怎么进行跨网络数据传输,在这一过程中相信大家…...
git笔记之在多个分支中复用某个分支提交的更改
git笔记之在多个分支中复用某个分支提交的更改 code review! 文章目录 git笔记之在多个分支中复用某个分支提交的更改1.实现该功能的 Bash 脚本示例2.这个脚本是否可以处理新添加的文件?3.该脚本使用前,应先使用下述脚本重置本地仓库所有分支与远程保持一…...
HTML、CSS
初识web前端 web标准 Web标准也称为网页标准,由一系列的标准组成,大部分由W3C (World Wide Web Consortium,万维网联盟) 负责制定。三个组成部分: HTML: 负责网页的结构(页面元素和内容)。CSS: 负责网页的表现(页面元素的外观、位置等页面样…...
数据文件(0)
一、使用场景 1、字典数据 对于一些数据量不大的配置类数据,放到数据库中占用数据库资源,可以放到代码中维护。比如 (1)字段少业务单一:做成枚举; (2)字段多业务复杂:…...
Go语言并发模式详解:深入理解管道与上下文的高级用法
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在Go语言中,并发编程是其最强大的特性之一。合理地使用并发模式,可以让我们的程序高效而优雅地处理复杂的任务。在本文中,我们将深入探讨Go语言中的一些高级并发模式,包括管道的技巧和上下文包的应用。通过丰…...
标准文档流解析及 CSS 中的相关特性
目录 非 VIP 用户可前往公众号回复“css”进行免费阅读 标准文档流特点 空白折叠现象 高矮不齐、底边对齐 自动换行,一行写不满,换行写 标准文档流中的元素等级 HTML 与 CSS 中的标签分类总结 块级元素和行内元素的相互转换 块级转行内 行内转块级 display 非 VIP…...
水下攻防面试题
水下攻防面试题通常涉及对水下环境的理解、水下安全操作、水下技术应用以及攻防策略等多个方面。由于具体的面试题可能因组织、职位和目的的不同而有所差异,以下是一些可能出现在水下攻防面试中的典型问题及其参考答案框架: 一、基础概念与理解 什么是水下攻防? 水下攻防是…...
vmware 虚拟机多屏幕或添加屏幕
vmware 虚拟机多屏幕或添加屏幕 前置条件 vmware 安装 vmware tools 虚拟机系统支持多屏幕 物理上有至少两个屏幕,就是物理机上接至少一个屏幕 方法 虚拟机上点设置,需要在虚拟机关机时进行 ctrl alt enter 让当前虚拟机全屏 鼠标移动到屏幕虚拟机…...
鹏哥C语言49-51---第6次作业:循环语句 for 和 while
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> //-----------------------------------------------------------------------------------------------第六次作业:for循环等 //--------------------------------------------------------------------…...
DeepSeek-Coder-V2-Lite-Instruct评估指标详解:代码准确率、效率与创新性
DeepSeek-Coder-V2-Lite-Instruct评估指标详解:代码准确率、效率与创新性 【免费下载链接】DeepSeek-Coder-V2-Lite-Instruct 开源代码智能利器——DeepSeek-Coder-V2,性能比肩GPT4-Turbo,全面支持338种编程语言,128K超长上下文&a…...
3个高效功能让视频创作者轻松生成专业字幕
3个高效功能让视频创作者轻松生成专业字幕 【免费下载链接】video-srt-windows 这是一个可以识别视频语音自动生成字幕SRT文件的开源 Windows-GUI 软件工具。 项目地址: https://gitcode.com/gh_mirrors/vi/video-srt-windows 工具概述 VideoSrt是一款基于Golang开发的…...
3步实现HTML到Word的智能转换:html-to-docx技术深度解析
3步实现HTML到Word的智能转换:html-to-docx技术深度解析 【免费下载链接】html-to-docx HTML to DOCX converter 项目地址: https://gitcode.com/gh_mirrors/ht/html-to-docx 你是否曾遇到过这样的场景?精心设计的网页报告需要转换为Word文档进行…...
从‘过拟合’到‘稳如狗’:聊聊EEG情感识别中数据增强与噪声注入的那些坑
从‘过拟合’到‘稳如狗’:EEG情感识别中的数据增强与噪声注入实战指南 当你第一次看到训练集准确率突破95%的EEG情感识别模型,在实际测试中面对新用户时表现却像从未训练过一样糟糕,这种落差感想必每个从业者都深有体会。个体差异就像一把双…...
从零搭建CarSim与Matlab/Simulink联合仿真环境:一个分布式驱动控制的实践案例
1. 为什么需要CarSim与Matlab/Simulink联合仿真 在车辆控制系统开发过程中,工程师们经常面临一个难题:如何在保证安全的前提下,快速验证控制算法的有效性?这就是CarSim与Matlab/Simulink联合仿真大显身手的地方。想象一下…...
投资分析太复杂?用TradingAgents-CN实现零代码智能分析的3个方案
投资分析太复杂?用TradingAgents-CN实现零代码智能分析的3个方案 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN TradingAgents-CN作…...
VMware 16 安装win,Win11推荐下载链接(不要选arm)
目录Win11下载链接待续、更新中......Win11下载链接 ed2k://|file|zh-cn_windows_11_consumer_editions_version_22h2_updated_sep_2022_x64_dvd_23d39103.iso|5579771904|33C7EC6485AD8C55ADFB550FA1A0F270|/ 待续、更新中… 1 顿号、: 先使用ctrl. ,再使用一遍切…...
Qwen3.5-2B多场景教程:农业技术人员上传病虫害图→识别种类→推荐药剂
Qwen3.5-2B多场景教程:农业技术人员上传病虫害图→识别种类→推荐药剂 1. 引言:农业病虫害识别的技术痛点 在农业生产中,病虫害防治一直是困扰农户的核心问题。传统识别方式存在三大痛点: 识别门槛高:需要专业农技人…...
别再用Delay了!用GD32的TIMER5实现精准1ms定时,让你的嵌入式程序更高效
告别阻塞式延时:用GD32 TIMER5构建高效嵌入式系统心跳 在嵌入式开发中,时间管理如同系统的心跳,决定了整个应用的响应速度和执行效率。许多开发者习惯使用delay_ms()这类阻塞式延时函数,却不知这会让CPU陷入无意义的等待状态&…...
koanf自定义Provider开发:扩展你的配置源终极指南
koanf自定义Provider开发:扩展你的配置源终极指南 【免费下载链接】koanf Simple, extremely lightweight, extensible, configuration management library for Go. Supports JSON, TOML, YAML, env, command line, file, S3 etc. Alternative to viper. 项目地址…...
