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循环等 //--------------------------------------------------------------------…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...
