我是靠谱客的博主 壮观电源,这篇文章主要介绍SQL中使用JOIN时,过滤条件放在on和where中的区别,现在分享给大家,希望可以做个参考。

SQL语法中,最常用的几个join:

类型含义
Inner Join输出符合关联条件的数据
Left Join输出左表的所有记录,对于右表符合关联的数据,输出右表,没有符合的,右表补null
Right Join输出右表的所有记录,对于左表符合关联的数据,输出左表,没有符合的,左表补null
Full Join输出左表和右表的所有记录,对于没有关联上的数据,未关联的另一侧补null

根据不同的场景,可以使用不同的Join类型来实现对应的关联操作。而对关联前后表的过滤有几种方式:

  1. 子查询的WHERE条件
  2. JOIN ON条件
  3. JOIN ON后的WHERE条件

而针对不同的Join类型,几种方式有很大区别,使用不正确,不仅无法将过滤条件下推,导致全表扫描,而且会导致正确性问题。这里主要记录一下几种过滤条件的区别。

首先先明确一下JOIN和WHERE条件的计算顺序,对于

复制代码
1
2
3
4
5
6
(SELECT * FROM t1 WHERE {subquery_where_condition}) a JOIN (SELECT * FROM t2 WHERE {subquery_where_condition}) b ON {on_condition} WHERE {where_condition} ;

来说,计算顺序为:

  1. 子查询中的WHERE子句(即{subquery_where_condition})。
  2. JOIN子句中的关联条件(即{on_condition})。
  3. JOIN结果集中的WHERE子句(即{where_condition})。

对于不同的JOIN类型,过滤语句放在{subquery_where_condition}、{on_condition}和{where_condition}中,有时结果是一致的,有时候结果又是不一致的。正确用法为:

  • INNER JOIN 左右表的过滤条件不受限制。
  • LEFT JOIN 左表的过滤条件需放在{subquery_where_condition}或{where_condition}中,右表的过滤条件需放在{subquery_where_condition}或{on_condition}中。
  • RIGHT JOIN和LEFT JOIN相反,右表的过滤条件需放在{subquery_where_condition}或{where_condition}中,左表的过滤条件需放在{subquery_where_condition}或{on_condition}。
  • FULL OUTER JOIN的过滤条件只能放在{subquery_where_condition}中。

当然,比较容易记的,也是比较推荐的写法是在做表关联时,尽量将每个表的单表过滤条件单独写成子查询,而不要在join结束以后再用where或者on去做单表的过滤,虽然写起来啰嗦一些,但这种写法最靠谱!

尤其对于INNER JOIN ,虽然过滤条件放在{subquery_where_condition}、{on_condition}和{where_condition}中没有区别,但效率是有差别的,养成最小化join是个很好的习惯,适合所有join,表数据越大体现在效率上就越快。


比如:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT a.c1 ,b.c2 FROM ( SELECT id ,c1 FROM t1 WHERE ds = '20220207' ) a INNER JOIN ( SELECT id ,c2 FROM t2 WHERE ds = '20220207' ) b ON a.id = b.id

最后

以上就是壮观电源最近收集整理的关于SQL中使用JOIN时,过滤条件放在on和where中的区别的全部内容,更多相关SQL中使用JOIN时,过滤条件放在on和where中内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(130)

评论列表共有 0 条评论

立即
投稿
返回
顶部