
SQL连接查询中ON和WHERE子句筛选的差异总结
5星
- 浏览量: 0
- 大小:None
- 文件类型:PDF
简介:
本文详细探讨了在SQL连接查询中使用ON和WHERE子句进行数据筛选的区别,并总结其适用场景与特点。
在SQL查询中使用连接(JOIN)可以将两个或多个表的数据合并在一起,并基于它们之间的相关列获取结果集。连接操作涉及到`ON`和`WHERE`子句的运用,这两个子句处理筛选条件的方式有所不同,特别是在执行外部联接时这种区别更为显著。
当进行内部联接(INNER JOIN)或者交叉联接(CROSS JOIN),在这些类型的JOIN中使用 `ON` 子句定义连接条件。如果只利用 `ON` 而不采用 `WHERE` ,查询结果依然有效且不会发生变化,因为两者在此类操作中的效果一致。
然而,在执行外部联接时,如左联接(LEFT JOIN)和右联接(RIGHT JOIN),这两种子句的差异便显现出来。这些类型的JOIN旨在返回所有来自一个表中的记录,即使在另一个表中没有匹配项的情况下也会如此。此时:
1. **生成笛卡尔积**:系统首先无条件地合并两个表的所有可能组合。
2. **应用ON筛选器**:随后根据 `ON` 子句的条件过滤满足连接规则的数据对。
3. **添加外部行**:对于左联接,如果右表中没有匹配项,则结果集中将使用NULL填充相应的列;反之亦然,即在右联接时会补充缺少匹配记录的情况。
4. **应用WHERE筛选器**:如果有 `WHERE` 子句存在的话,在上述步骤之后它会对最终的结果集进行进一步的过滤。
假设我们有两个表为`main`和`ext`, 并且希望查找所有地址不是杭州的用户。如果我们使用左联接,并把条件放在ON子句中:
```sql
SELECT * FROM main LEFT JOIN ext ON main.id = ext.id AND address <> 杭州
```
在这个查询里, `address <> 杭州` 只影响到 `ext` 表中的记录;如果在 `main` 表中有条没有匹配项且地址为杭州的记录,则这条记录会被保留下来,并且相应的列将被填充NULL。
若我们将条件移至WHERE子句:
```sql
SELECT * FROM main LEFT JOIN ext ON main.id = ext.id WHERE address <> 杭州
```
这时, `WHERE` 子句会在最后一步中过滤结果集,因此它会同时检查两个表的地址列以确保没有杭州地址出现在最终结果集中。
总结来说,在确定表之间关联时主要使用ON筛选器,并且在执行外部联接操作期间仅在连接阶段有效。而WHERE子句则是在所有连接和初步筛选之后对最终的结果集进行额外条件过滤,这对于编写准确的SQL查询至关重要,尤其是在处理外部联接时避免因误解导致错误结果的发生。
全部评论 (0)


