left join on左连接的使用

本文详细解释了SQL中的Left Join操作,包括其基本概念、执行原理及如何正确使用。通过具体的SQL语句示例展示了不同条件设置下Left Join的结果变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概念:

–把left join左边的表的记录全部找出来。系统会先用表A和表B做个笛卡儿积,然后以表A为基表,去掉笛卡儿积中表A部分为NULL的记录。最后形成你的结果。

–进行左连接时,就有涉及到主表、辅表,这时主表条件写在WHERE之后,辅表条件写在ON后面。

二、实例

1、表a结构和数据

table a(id, type):

id     type 

----------------------------------

1      1         

2      1          

3      2     

2、表b结构和数据

table b(id, class):

id    class 

---------------------------------

1      1

2      2

3、SQL语句调用

--sql语句1:

select a.*, b.* from a left join b on a.id = b.id and a.type = 1;

执行结果为:

a.id    a.type    b.id    b.class

----------------------------------------

1        1            1        1

2        1            2        2

3        2         
--sql语句2:

select a.*, b.* from a left join b on a.id = b.id where a.type = 1;

执行结果为:

a.id    a.type    b.id    b.class

----------------------------------------

1        1            1        1

2        1            2        2
--sql语句3:

select a.*, b.* from a left join b on a.id = b.id and b.class = 1;

执行结果为:

a.id    a.type    b.id    b.class

----------------------------------------

1        1            1        1

2        1            

3        2          

4、总结:

–sql语句1可见,left join 中左表的全部记录将全部被查询显示,on 后面的条件对它不起作用,除非再后面再加上where来进行筛选,这就是sql语句2了。

–由sql语句3可见,on后面的条件中,右表的限制条件将会起作用。

<think>我们正在处理一个关于SQL多表连接查询的问题,特别是LEFTJOINON语法的使用教程。用户要求:提供关于多表连接查询中LEFTJOINON语法的使用介绍,包括教程和多表连接查询。参考引用内容:-引用[1]:解释了JOINONLEFTJOINON的区别,以及它们与逗号连接(隐式内连接)的区别。特别强调了LEFTJOIN会保留左表的所有记录,即使右表没有匹配的记录(此时右表字段为NULL)。还提到了性能优化、可读性和维护性方面的建议,以及WHERE和ON的区别。-引用[2]:提供了LEFTJOIN的基本语法:selectfiled1,field2fromtable1left/rightouterjointable2oncondition1[left/rightouterjointable3oncondition2]*根据这些信息,我们需要组织一个清晰的教学内容,包括:1.LEFTJOIN的基本概念和用途2.LEFTJOIN的语法结构(包括多表连接)3.使用示例(单表LEFTJOIN和多表LEFTJOIN)4.注意事项(如ON和WHERE条件的区别)5.与INNERJOIN的对比注意:回答中需要遵循系统级指令,包括数学表达式使用$...$,独立公式使用$$...$$(但SQL示例不属于数学公式,所以用代码块),使用中文,生成相关问题。结构:1.介绍LEFTJOIN2.语法详解3.示例(单表连接、多表连接)4.注意事项(重点:ON条件与WHERE条件的区别)5.总结6.相关问题注意引用标识:在引用站内内容的地方添加[^1]等标识。</think>### LEFT JOIN ON 多表连接查询教程 #### 一、LEFT JOIN 核心概念 1. **基本定义** LEFT JOIN左连接)会**保留左表的所有记录**,即使右表中没有匹配项。右表无匹配时,相关字段显示为`NULL`。语法结构: ```sql SELECT 列名 FROM 左表 LEFT JOIN 右表 ON 连接条件 ``` 2. **与 INNER JOIN 对比** - `INNER JOIN`:仅返回两表**匹配成功**的记录(交集) - `LEFT JOIN`:返回左表**全部记录** + 右表匹配记录(左表全集) 示例对比: ```sql -- INNER JOIN (仅匹配记录) SELECT A.id, B.name FROM TableA A JOIN TableB B ON A.id = B.a_id -- LEFT JOIN (保留所有左表记录) SELECT A.id, B.name FROM TableA A LEFT JOIN TableB B ON A.id = B.a_id ``` #### 二、多表 LEFT JOIN 操作 1. **链式连接语法** 可连续连接多张表,保留首个左表的完整性: ```sql SELECT t1.col1, t2.col2, t3.col3 FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.id = t2.t1_id LEFT JOIN Table3 t3 ON t2.id = t3.t2_id ``` 2. **三表示例** 假设有订单表(orders)、客户表(customers)、支付表(payments): ```sql SELECT orders.order_id, customers.name, payments.amount FROM orders LEFT JOIN customers ON orders.customer_id = customers.id LEFT JOIN payments ON orders.payment_id = payments.id ``` > 结果包含**所有订单**,即使部分订单无客户信息或支付记录(缺失字段为`NULL`)[^1]。 #### 三、ON 子句关键规则 1. **连接条件优先级** `ON` 条件在连接时立即生效,决定**如何关联表**: ```sql -- 正确:连接时过滤右表 SELECT * FROM users LEFT JOIN orders ON users.id = orders.user_id AND orders.amount > 100 -- 连接时过滤右表 -- 错误:WHERE会过滤最终结果 SELECT * FROM users LEFT JOIN orders ON users.id = orders.user_id WHERE orders.amount > 100 -- 会剔除左表未匹配记录! ``` 2. **多条件组合** `ON` 支持复杂逻辑表达式: ```sql SELECT * FROM employees e LEFT JOIN departments d ON e.dept_id = d.id AND (d.budget > 100000 OR e.salary > 50000) ``` #### 四、性能优化建议 1. **索引策略** - 为`ON`条件的连接字段建立索引(如`orders.customer_id`) - 避免在`ON`中对字段进行计算(如`ON YEAR(date)=2023`) 2. **过滤时机选择** | 场景 | 推荐方式 | |---|---| | 过滤右表数据 | `ON 条件` | | 过滤最终结果 | `WHERE 条件` | | 左表记录必须保留 | `WHERE 右表字段 IS NULL`(查找缺失项) > 显式`LEFT JOIN`比隐式逗号连接更易被优化器解析[^1]。 #### 五、典型应用场景 1. **数据完整性分析** ```sql -- 查找从未下单的客户 SELECT customers.* FROM customers LEFT JOIN orders ON customers.id = orders.customer_id WHERE orders.id IS NULL ``` 2. **层级数据关联** 组织架构查询(即使某些部门无员工): ```sql SELECT dept.name, emp.employee_name FROM departments dept LEFT JOIN employees emp ON dept.id = emp.department_id ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值