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循环等 //--------------------------------------------------------------------…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
