SQL 语句中 left join 后用 on 还是 where,区别大了!

LEFTJOIN的ON条件用于生成临时表,即使条件不满足也会返回左表所有记录;WHERE条件则在临时表生成后过滤结果。这两者在使用时会导致不同的结果集,特别是与INNERJOIN相比,LEFTJOIN会保留左表的所有记录。示例SQL查询展示了不同条件下的查询效果。

前天写SQL时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条,奈何发现还是有两条。

后来发现 join on and 不会过滤结果记录条数,只会根据and后的条件是否显示 B表的记录,A表的记录一定会显示。

不管and 后面的是A.id=1还是B.id=1,都显示出A表中所有的记录,并关联显示B中对应A表中id为1的记录或者B表中id为1的记录。

运行sql :

select * from student s left join class c on s.classId=c.id order by s.id

 

运行sql :

select * from student s left join class c on s.classId=c.id and s.name="张三" order by s.id

 

运行sql :

select * from student s left join class c on s.classId=c.id and c.name="三年级三班" order by s.id

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

在使用left jion时,on和where条件的区别如下:

1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

假设有两张表:

表1:tab2

idsize
110
220
330

表2:tab2

sizename
10AAA
20BBB
30CCC

两条SQL:

1、

select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’

2、

select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)

第一条SQL的过程:

1、中间表on条件:

tab1.size = tab2.size

 

2、再对中间表过滤where 条件:

tab2.name=’AAA’

 

第二条SQL的过程:

1、中间表on条件:

tab1.size = tab2.size and tab2.name=’AAA’

(条件不为真也会返回左表中的记录)

其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。

<think>首先,用户的问题是关于SQLLEFT JOIN的使用方法和示例。我需要基于系统指令来构建我的回答。 系统级指令关键点: - 所有行内数学表达式使用$...$格式,但这里没有数学内容,所以可能不需要。 - 独立公式使用$$...$$格式,但SQL不是数学公式,所以可能不适用。 - LaTeX语法正确,但SQL查询不需要LaTeX。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,逐步解决问题。 - 参考站内引用:用户提供了引用[1]到[4],这些是关于SQL LEFT JOIN的引用。我需要参考这些来构建回答。 用户提供的引用: - [^1]: SQL LEFT JOIN 简介。基本语法和示例。 - [^2]: SQL LEFT JOIN 关键字的使用方法和注意事项。基本语法和NULL填充。 - [^3]: SQL中的LEFT JOIN、RIGHT JOIN和INNER JOIN。介绍三种JOIN类型。 - [^4]: SQL中INNER JOINLEFT JOIN区别和用法。基本概念和区别。 用户的问题: "我想理解SQLLEFT JOIN的使用方法 请问SQL LEFT JOIN 用法和示例" 我的回答需要: 1. 结构清晰,逐步解释LEFT JOIN。 2. 包括用法和示例。 3. 使用中文。 4. 在引用段落末尾添加引用标识。 5. 生成相关问题。 结构建议: - 先介绍LEFT JOIN的概念。 - 解释基本语法。 - 提供示例。 - 讨论注意事项或与其他JOIN区别。 - 最后生成相关问题。 添加引用:当引用信息时,在段落末尾加[^1]等。例如,如果我从引用[1]取语法,就在那段末尾加[^1]。 生成相关问题:在回答结束后,添加"§§相关问题§§"部分,列出几个相关问题。 确保回答真实可靠:基于提供的引用和标准SQL知识。 纲回答: 1. **介绍LEFT JOIN**:解释什么是LEFT JOIN,它的作用(返回左表所有行,右表匹配或无匹配时用NULL填充)。 - 参考引用[1],[2],[3]。 2. **基本语法**:给出SQL语法。 - 例如:SELECT columns FROM table1 LEFT JOIN table2 ON condition; - 参考引用[1],[2]。 3. **示例**:提供一个简单的示例。 - 例如,两个表:Customers和Orders。 - 查询所有客户及其订单,如果没有订单则显示NULL。 - 参考引用[1],[2]。 4. **注意事项**:讨论NULL值、性能等。 - 参考引用[2]。 5. **与其他JOIN区别**:简要比较INNER JOIN和RIGHT JOIN。 - 参考引用[3],[4]。 6. **生成相关问题**:在最后添加相关问题部分。 使用中文:整个回答用中文。 添加引用标识: - 例如:当描述语法时,说"基本语法是:SELECT ... FROM ... LEFT JOIN ... ON ... [^1]"。 最终输出格式: - 回答内容。 - §§相关问题§§ - 相关问题列表。</think>### SQL LEFT JOIN 用法和示例 在 SQL 中,LEFT JOIN(左连接)是一种常见的表连接操作,用于返回左表(table1)的所有行,无论右表(table2)是否有匹配的行。如果右表没有匹配的行,结果集中右表的列将用 NULL 值填充。这使得 LEFT JOIN 特别适合查询“所有左表记录及其可能关联的右表记录”的场景,例如获取所有客户及其订单(即使某些客户没有订单)[^2]。下面我将逐步解释 LEFT JOIN 的用法、语法和示例,确保内容清晰易懂。 #### 1. LEFT JOIN 的基本概念 - **作用**:LEFT JOIN 确保左表的所有行都出现在结果中。如果右表有匹配的行(基于连接条件),则显示匹配数据;如果没有匹配,右表列返回 NULL。 - **适用场景**:常用于查询“主表”数据时,需要包含所有记录,即使“从表”无关联数据。例如,在客户管理系统、订单跟踪或数据分析中[^1][^3]。 - **与其他 JOIN区别**: - **INNER JOIN**:只返回两个表都有匹配的行。 - **RIGHT JOIN**:返回右表所有行,左表无匹配时用 NULL 填充。 - LEFT JOIN 优先保证左表完整性,而 INNER JOIN 更注重数据交集[^3][^4]。 #### 2. LEFT JOIN 的基本语法 LEFT JOIN 的语法结构如下: ```sql SELECT column_names FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name; ``` - **参数说明**: - `column_names`:要选择的列名(可以是具体列如 `table1.id`, `table2.name`,或通配符 `*`)。 - `table1`:左表名称(主表)。 - `table2`:右表名称(从表)。 - `ON` 子句:指定连接条件,通常是两个表中具有相同值的列(如主键-外键关系)[^1][^2]。 - **注意事项**: - **NULL 值处理**:当右表无匹配时,结果中右表列显示 NULL。需在查询中处理 NULL,以避免逻辑错误。 - **性能优化**:对型表使用 LEFT JOIN 时,确保连接列有索引,否则可能导致查询缓慢[^2][^4]。 - **别名使用**:建议为表指定别名(如 `FROM customers AS c`),以提高可读性。 #### 3. LEFT JOIN 示例 假设有两个表:`customers`(客户表)和 `orders`(订单表)。`customers` 表包含客户 ID 和姓名,`orders` 表包含订单 ID 和客户 ID(外键)。我们要查询所有客户及其订单信息,包括没有订单的客户。 - **表结构**: - `customers` 表: | customer_id | customer_name | |-------------|---------------| | 1 | 张三 | | 2 | 李四 | | 3 | 王五 | - `orders` 表: | order_id | customer_id | amount | |----------|-------------|--------| | 101 | 1 | 100 | | 102 | 1 | 200 | | 103 | 2 | 150 | - **查询示例**:使用 LEFT JOIN 获取所有客户及其订单(无订单时显示 NULL)。 ```sql SELECT c.customer_name, o.order_id, o.amount FROM customers AS c LEFT JOIN orders AS o ON c.customer_id = o.customer_id; ``` - **结果解释**: | customer_name | order_id | amount | |---------------|----------|--------| | 张三 | 101 | 100 | | 张三 | 102 | 200 | | 李四 | 103 | 150 | | 王五 | NULL | NULL | 在这个结果中: - “张三”有两条订单记录(匹配成功)。 - “李四”有一条订单记录(匹配成功)。 - “王五”没有订单,因此 `order_id` 和 `amount` 显示 NULL(LEFT JOIN 确保了左表所有行被保留)[^1][^2]。 #### 4. 注意事项和最佳实践 - **避免数据冗余**:如果左表有重复行,LEFT JOIN 可能返回多行结果。使用 `DISTINCT` 或子查询去重。 - **结合 WHERE 子句**:可以在 LEFT JOIN 后添加 WHERE 条件过滤结果。例如,只查询没有订单的客户: ```sql SELECT c.customer_name FROM customers AS c LEFT JOIN orders AS o ON c.customer_id = o.customer_id WHERE o.order_id IS NULL; ``` - **与 INNER JOIN 对比**:INNER JOIN 会排除“王五”这样的无匹配记录,而 LEFT JOIN 会包含它们。这体现了 LEFT JOIN 在数据完整性上的优势[^4]。 - **实际应用**:LEFT JOIN 广泛用于报表生成、数据分析和 Web 应用中,例如在电商平台展示所有用户及其购买历史[^3]。 通过以上步骤,您应该能理解 LEFT JOIN 的核心用法。如果需要更复杂的示例(如多表连接),可以参考 SQL 文档或练习工具如 SQL Fiddle。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值