SQL中join on ...and 和join on ... where

本文详细解析了SQL查询中LEFT JOIN操作的ON条件与WHERE条件的不同作用,通过实例对比说明两者如何影响查询结果。

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

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

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

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

      假设有两张表:

表1:tab2

id
size
1
10
2
20
3
30
表2:tab2
size
name
10
AAA
20
BBB
20
CCC


两条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
tab1.idtab1.sizetab2.sizetab2.name
1
10
10
AAA
2
20
20
BBB
2
20
20
CCC
3
30
(null)
(null)
|
|

2、再对中间表过滤
where 条件:
tab2.name=’AAA’

tab1.idtab1.sizetab2.sizetab2.name
1
10
10
AAA
  

 

第二条SQL的过程:

1、中间表
on条件:
tab1.size = tab2.size and tab2.name=’AAA’
(条件不为真也会返回左表中的记录)
tab1.idtab1.sizetab2.sizetab2.name
1
10
10
AAA
2
20
(null)
(null)
3
30
(null)
(null)

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

<think>好的,我需要回答用户关于SQL Server中JOIN ON语法的问题,包括作用、使用场景示例。首先,我得回顾一下JOIN的基本概念,然后整理不同类型JOIN的区别,比如INNER JOIN、LEFT JOIN等。用户提供的引用中有提到LEFT JOIN的语法示例,可以引用那个例子。同时,引用4提到了ON条件后接ANDWHERE的区别,这部分也需要解释清楚。 首先,JOIN ON的主要作用是根据两个表的共同列连接数据。需要说明它用于关联表,形成临时结果集。使用场景包括需要从多个表组合数据的查询,比如订单客户信息关联。然后,要给出每种JOIN类型的示例,特别是用户提到的LEFT JOIN,并且用代码块展示。 接下来,要注意用户提供的引用内容,比如引用2中的LEFT JOIN示例,需要正确引用并标注[^2]。同时,关于ONWHERE的区别,引用4提到过,这部分需要详细说明,比如ON是连接条件,WHERE是过滤结果集。 还要检查是否需要遵守系统级指令,比如数学表达式用$...$,但这个问题可能不涉及数学公式,所以可能不需要。但需要确保中文回答,结构清晰,分点说明。最后生成相关问题,可能涉及其他JOIN类型、性能优化、实际应用案例等。 现在需要组织内容,确保每个部分都涵盖,并正确引用提供的资料。可能的结构是: 1. 作用:关联表,组合数据 2. 使用场景:多表查询,统计分析,数据整合 3. 语法示例:不同JOIN类型的例子,特别是LEFT JOIN 4. ONWHERE的区别:引用4的解释 5. 其他注意事项:索引优化,性能影响(引用3提到ALTER INDEX,可能相关) 最后生成相关问题,比如不同JOIN的区别,优化方法,实际案例等。</think>### SQL Server中JOIN ON语法详解 #### 一、作用 `JOIN ON` 是 SQL Server 中用于**关联多个表**的关键语法,通过指定连接条件将不同表中的行组合成临时结果集。其核心作用包括: - **数据关联**:基于共同列(如外键)将多个表的数据横向拼接。 - **结果筛选**:通过 `ON` 后的条件过滤有效关联数据[^4]。 #### 二、使用场景 1. **多表数据查询**:例如查询订单表时关联客户表以获取客户姓名。 2. **统计分析**:如统计每个部门的销售额时需要连接部门表销售表。 3. **数据整合**:将分散在不同表中的信息合并为完整视图(如商品信息+库存信息)。 #### 三、语法示例 ##### 1. 基础语法 ```sql SELECT 列名 FROM 表1 [INNER/LEFT/RIGHT/FULL] JOIN 表2 ON 表1.共同列 = 表2.共同列; ``` ##### 2. 不同JOIN类型示例 - **INNER JOIN**(默认):仅返回匹配的行。 ```sql SELECT Orders.OrderID, Customers.CustomerName FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID; ``` - **LEFT JOIN**:返回左表所有行,右表无匹配时填充`NULL`。 ```sql SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.CommonColumn = 表2.CommonColumn; ``` - **RIGHT JOIN**:与LEFT JOIN相反,返回右表所有行。 - **FULL JOIN**:返回左右表全部行,无匹配时填充`NULL`。 #### 四、`ON`与`WHERE`的区别 - **ON**:定义表连接时的匹配条件,影响关联过程。 - **WHERE**:在连接完成后过滤结果集。 例如,以下查询会保留左表所有行,但仅筛选右表满足条件的匹配: ```sql SELECT * FROM 表A LEFT JOIN 表B ON 表A.ID = 表B.ID AND 表B.Status = 'Active' -- ON中定义连接部分过滤 WHERE 表A.Amount > 100; -- WHERE过滤最终结果 ``` #### 五、性能注意事项 1. **索引优化**:确保连接列(如`CustomerID`)已建立索引,可加速关联过程[^3]。 2. **避免过多JOIN**:超过3个表的连接可能影响性能,需评估是否需要冗余字段或临时表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值