回答

收藏

WHERE子句或ON子句中的INNER JOIN条件?

技术问答 技术问答 270 人阅读 | 0 人回复 | 2023-09-14

我今天输入了错误的查询,但它仍然有效,并给出了预期的结果。我的意思是运行此查询:
* v. ~6 Y5 U& V# H  TSELECT e.id FROM employees e JOIN users u ON u.email=e.email WHERE u.id='139840'但是我不小心跑了这个查询$ A  G; Q! H8 p) N4 ~$ K! g6 V
SELECT e.id FROM employees e JOIN users u ON u.email=e.email AND u.id='139840'(请注意,AND而不是WHERE在最后一个子句中)) g( Y" r( Y0 l  L% d5 {
而且都来自用户ID返回正确的员工ID。6 ]' J0 o9 ?7 Q: q) i. A
这两种查询有什么区别?第二种形式是否只连接符合条件的两个表成员,第一种形式是否连接整个表,然后运行查询?一个比另一个更有效吗?还有其他我想念的吗?
  ^& U) H* M! Q& ^* I谢谢!4 E6 O7 b- c  n. J$ }+ s) f1 g+ g5 k
                                                               
2 v5 j, c0 M( i( z7 X    解决方案:                                                               
6 Z+ i8 B. v& L  s5 u                                                                对于这种内部连接,它们在逻辑上是等效的。但是,你可能会遇到它join子句中的条件与where子句中的条件含义不同。
  Q/ Z) G' s/ f/ D# R5 P假设你像这样左连接,举个简单的例子;
5 h0 T* G2 f+ p3 |3 _select x.idfrom x       left join y         on x.id = y.id;在这里,我们将获取x不管y是否有匹配id。现在我们的加入条件增加了-
) K7 W8 V; K# y! o' _我们不仅仅是基于id的y在中间寻找匹配项,也是基于id_type中间寻找匹配项。% u; a5 e6 c! {* F" E* F0 V8 B/ J; v
select x.idfrom x       left join y         on x.id = y.id         and y.id_type = 'some type';同样,这也会给出x不管y是否有匹配(id,id_type)。7 u+ s8 R% X/ o( w+ l# ^
但是,这是非常不同的:" \# ~& g8 [% g  i& L  ]/ F
select x.idfrom x       left join y         on x.id = y.idwhere y.id_type = 'some type';在这种情况下,我们将选择x试着匹配所有的行,y行。现在,对y不匹配的行,y.id_type将为null。所以,不满意y.id_type =’some. y- D1 \7 T8 J7 f
type’因此,丢弃那些不匹配的行,从而有效地将其转化为内部连接。7 r) B+ C, j; @9 O+ z6 }) x; e  {
长话短说:对于内部联接来说,条件在哪里都无关紧要,对于外部联接则可以。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则