mysql学习教程,从入门到精通,SQL LEFT JOIN 语句(23)

devtools/2024/9/24 5:46:06/

1、SQL LEFT JOIN 语句

在SQL中,LEFT JOIN(也称为左连接)是一种将左表(LEFT JOIN左侧的表)的所有记录与右表(LEFT JOIN右侧的表)中匹配的记录结合起来的查询方式。如果左表中的记录在右表中没有匹配,则结果中这些记录的右表部分将包含NULL。这非常有用,尤其是当你想要从一个表中获取所有记录,并且想要获取与之相关联的另一个表中的信息(如果存在的话)时。
下面是一个简单的LEFT JOIN语句的示例。假设我们有两个表:employees(员工表)和departments(部门表)。employees表有一个department_id字段,它引用了departments表中的id字段。
employees 表结构

idnamedepartment_id
1Alice1
2Bob2
3Charlie3

departments 表结构

idname
1HR
2Engineering

我们想要查询所有员工及其对应的部门名称,即使某些员工没有分配部门(即department_iddepartments表中没有对应的记录)。

SQL LEFT JOIN 语句

sql">SELECT employees.name AS employee_name, departments.name AS department_name  
FROM employees  
LEFT JOIN departments ON employees.department_id = departments.id;

这条SQL语句会返回以下结果:

employee_namedepartment_name
AliceHR
BobEngineering
CharlieNULL

在这个结果中,Alice和Bob都成功匹配到了他们所属的部门名称,而Charlie在departments表中没有对应的department_id,因此他的department_name显示为NULL。这正是LEFT JOIN的作用所在:它确保了左表(employees)中的所有记录都会出现在结果中,即使它们在右表(departments)中没有匹配项。
当然可以。以下是一个更实际的LEFT JOIN案例,假设我们在运营一个在线书店,并且有两个主要的数据库表:orders(订单表)和customers(客户表)。我们想要查询所有订单的信息,包括下单的客户名称,即使某些订单可能还没有关联到具体的客户(虽然这在现实中不太常见,但可以作为示例来说明LEFT JOIN的用法)。
orders 表结构

order_idcustomer_idorder_datetotal_amount
112023-01-01100.00
222023-01-02150.00
3NULL2023-01-0350.00

customers 表结构

customer_idnameemail
1John Doejohn.doe@example.com
2Jane Smithjane.smith@example.com

现在,我们想要查询所有订单的信息,包括每个订单的客户名称(如果有的话)。由于订单3没有customer_id,我们将使用LEFT JOIN来确保这个订单也出现在结果中,并且客户名称将为NULL。

SQL LEFT JOIN 语句

sql">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_idorder_datetotal_amountcustomer_name
12023-01-01100.00John Doe
22023-01-02150.00Jane Smith
32023-01-0350.00NULL

即使订单3没有关联的客户(customer_id为NULL),它也出现在了结果中,并且customer_name列显示为NULL。这正是LEFT JOIN在处理此类场景时的优势所在。
当然可以,为了提供一个更复杂的LEFT JOIN案例,我们可以考虑一个涉及三张表的场景:一个在线书店的订单系统。这个系统包括orders(订单表)、customers(客户表)和books(书籍表)。我们的目标是查询每个订单的信息,包括订单ID、订单日期、总金额、客户名称以及所购买的书籍名称,即使某些订单可能只包含部分书籍信息(假设有些订单信息尚未完全录入书籍信息)。
表结构概述

  1. orders 表

    • order_id: 订单ID
    • customer_id: 客户ID
    • order_date: 订单日期
    • total_amount: 总金额
  2. customers 表

    • customer_id: 客户ID
    • name: 客户名称
    • email: 电子邮件
  3. 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 语句(简化版,可能不是最优)
sql">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函数,如下所示:
sql">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;

这个查询将每个订单的书籍名称聚合为一个由逗号分隔的字符串,并返回每个订单的汇总信息。


http://www.ppmy.cn/devtools/116356.html

相关文章

移动技术开发:注册案例

1 实验名称 注册案例 2 实验目的 掌握多个Activity的实现方法&#xff0c;Activity之间数据的交互实现&#xff0c;Intent对象的使用 3 实验源代码 布局文件代码&#xff1a; &#xff08;1&#xff09;activity_choose_city.xml <?xml version"1.0" encodi…

重修设计模式-结构型-享元模式

重修设计模式-结构型-享元模式 复用不可变对象&#xff0c;节省内存 享元模式&#xff08;Flyweight Pattern&#xff09;核心思想是通过共享对象方式&#xff0c;达到节省内存和提高性能的目的。享元对象需是不可变对象&#xff0c;因为它会被多处代码共享使用&#xff0c;要避…

从入门到精通:PHP 100个关键技术关键词

PHP 是一种广泛用于Web开发的服务器端脚本语言&#xff0c;以其简单易学和强大的功能而闻名。通过掌握本指南中的100个关键技术关键词&#xff0c;你将逐步了解PHP的核心概念、基本语法、数据库操作、会话管理、安全性和框架等方面的知识。每个关键词都配有详细的注释&#xff…

《Nginx核心技术》第18章:基于主从模式搭建Nginx+Keepalived双机热备环境

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章汇总&#xff1a;https://binghe.gitcode.host/md/all/all.html 星球项目地址&#xff1a;https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

Pytorch详解-Pytorch核心模块

Pytorch核心模块 一、Pytorch模块结构_pycache__Cincludelibautogradnnoptimutils 二、Lib\site-packages\torchvisiondatasetsmodelsopstransforms 三、核心数据结构——Tensor&#xff08;张量&#xff09;在深度学习中&#xff0c;时间序列数据为什么是三维张量&#xff1f;…

Leetcode算法基础篇-位运算

简介 学习链接&#xff1a;位运算&#xff08;第 13 ~ 14 天&#xff09; 位运算规则 运算符描述规则|按位或运算符只要对应的两个二进位有一个为 1 1 1 时&#xff0c;结果位就为 1 1 1。&按位与运算符只有对应的两个二进位都为 1 1 1 时&#xff0c;结果位才为 1 …

ELK企业级日志分析系统

目录 一、ELK日志分析系统简介 二、Elasticsearch介绍 三、Logstash介绍 四、Kibana介绍 五、部署ELK日志分析系统 一、ELK日志分析系统简介 ELK 是一套由 Elasticsearch、Logstash 和 Kibana 组成的开源日志分析系统&#xff0c;通常用于大规模的数据收集、处理和可视化分…

php curl发送get、post请求

直接上代码&#xff0c;如下。 注意请求参数为json格式的话,需要 json_encode($params) function doRequest($url, $method GET, $params []) {$ch curl_init();//设置抓取的urlcurl_setopt($ch, CURLOPT_URL, $url);//不设置头文件的信息作为数据流输出curl_setopt($ch, CU…