SQL中的左连接,体会一对多


问题如下,解释这一行SQL语句

SQL 复制代码
"LEFT JOIN %s ON %s.%s=%s.%s "
一、 LEFT JOIN 语法解释
  1. LEFT JOIN 是 SQL 中的一种连接操作,用于将两个或多个表中的行组合在一起。它会返回左表(即 LEFT JOIN 关键字左边的表,上述代码未指明左边的表 )中的所有行,即使在右表(LEFT JOIN 关键字右边的表)中没有匹配的行。对于右表中没有匹配的行,结果集中对应的列会被填充为 NULL
  2. LEFT JOIN %s ON %s.%s=%s.%s 是一个 SQL 语句模板,其中 %s 是占位符,通常在 Java 中使用 String.format 方法来填充这些占位符。
  3. LEFT JOIN %s:指定要连接的右表,%s 会被替换为实际的表名。
  4. ON %s.%s=%s.%s:指定连接条件,ON 关键字后面跟着一个条件表达式,用于确定如何将左表和右表的行进行匹配。四个 %s 分别会被替换为左表名左表中的列名右表名右表中的列名。连接条件通常是两个表中具有相同含义的列,通过比较这些列的值来确定哪些行应该被组合在一起。
二、 例子

假设我们有两个表:department(部门表)和 employee(员工表),它们之间是一对多的关系,即一个部门可以有多个员工。

部门表(department

department_id department_name
1 销售部
2 技术部
3 财务部

员工表(employee

employee_id employee_name department_id
101 张三 1
102 李四 1
103 王五 2
104 赵六 2

使用Java,构造对应的 SQL 语句:

java 复制代码
String leftTable = "department"; // 左表
String rightTable = "employee";// 右表

// 在下面这个语句中,用到本文开头的字符串
String join = String.format("LEFT JOIN %s ON %s.%s=%s.%s ", rightTable, leftTable, rightTable + "_id", rightTable, rightTable + "_id"); 

// 这里假设将占位符填充后的完整 SQL 查询语句 
String sql = "SELECT * FROM " + leftTable + " " + join;

生成的 SQL 语句如下:

SQL 复制代码
SELECT * FROM department LEFT JOIN employee ON department.employee_id=employee.employee_id;
三、查询结果

可以看到,即使财务部没有对应的员工,它仍然出现在结果集中,员工信息部分显示为 NULL。这就是 LEFT JOIN 的作用,确保左表中的所有行都被包含在结果集中。

department_id department_name employee_id employee_name department_id (from employee)
1 销售部 101 张三 1
1 销售部 102 李四 1
2 技术部 103 王五 2
2 技术部 104 赵六 2
3 财务部 NULL NULL NULL
四、总结

左连接,主要照顾左表的数据。从查询的结果表来看,左表冗余的数据,结果表保持存在,剩余右表字段为空;右表冗余的数据,在结果表直接删除。

相关推荐
银发控、8 小时前
MySQL联合索引
数据库·mysql
予枫的编程笔记8 小时前
【MySQL修炼篇】从踩坑到精通:事务隔离级别的3大异常(脏读/幻读/不可重复读)解决方案
数据库·mysql·后端开发·数据库事务·事务隔离级别·rr级别·脏读幻读不可重复读
一起养小猫9 小时前
Flutter for OpenHarmony 实战:记账应用数据统计与可视化
开发语言·jvm·数据库·flutter·信息可视化·harmonyos
世界尽头与你9 小时前
(修复方案)CVE-2023-22047: Oracle PeopleSoft Enterprise PeopleTools 未授权访问漏洞
数据库·安全·oracle·渗透测试
韩立学长9 小时前
【开题答辩实录分享】以《智能大学宿舍管理系统的设计与实现》为例进行选题答辩实录分享
数据库·spring boot·后端
Henry Zhu12310 小时前
数据库(五):反规范化
数据库
Mr_Xuhhh10 小时前
MySQL函数详解:日期、字符串、数学及其他常用函数
java·数据库·sql
he___H11 小时前
Redis高级数据类型
数据库·redis·缓存
霖霖总总11 小时前
[小技巧60]深入解析 MySQL Online DDL:MySQL Online DDL、pt-osc 与 gh-ost 机制与最佳实践
数据库·mysql
爱学习的阿磊11 小时前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python