回答

收藏

SQL JOIN:USING,ON或WHERE之间有区别吗?

技术问答 技术问答 122 人阅读 | 0 人回复 | 2023-09-13

我想知道SQL对这些连接语句执行的方式是否有所不同:3 M: \# }0 K" Q. N3 y+ i( J  Z
SELECT * FROM a,b WHERE a.ID = b.ID: `% J# ~$ P* q& J: t
SELECT * FROM a JOIN b ON a.ID = b.ID) s0 a" j5 r8 v' A
SELECT * FROM a JOIN b USING(ID)
1 @! u: |8 Y0 @. w% Z% o, h2 \有性能差异吗?还是算法上的差异?& k6 ]$ s. s9 `1 o9 U6 _
还是仅仅是语法糖?
' E. H$ ?  x/ }                ! W, W0 ]. d4 N. i
解决方案:
& W; W9 W1 O/ Z& r2 C5 |                3 \% c, F+ g1 Z1 A
" U1 `8 G1 U# p# x
/ |! m! j/ E$ _$ E. Z8 S) }
                性能没有差异。
1 S1 g" T& X' |+ K4 j0 c' V但是,第一种样式是ANSI-89,在某些商店中,您的腿会折断。包括我的。第二种样式是ANSI-92,更加清晰。
+ }" m! R/ O: d- h8 B例子:
3 b! m4 E6 G% w5 Q3 a* R哪个是JOIN,哪个是过滤器?
6 O6 a  H3 \; x3 _2 @; h7 r! xFROM T1,T2,T3..... X+ e7 N4 J: V  D( {
WHERE T1.ID = T2.ID AND
+ {- q5 b* w/ ?' g% `0 Q& o- v     T1.foo = 'bar' AND T2.fish = 42 AND- x8 i1 j2 u3 B' c' F& ~& M& E* d
     T1.ID = T3.ID
- H) Z0 O7 S/ O* E6 D" ~FROM T1 5 ?" m8 O& W3 L
   INNER JOIN T2 ON T1.ID = T2.ID
; \8 C" s& l4 B, T2 P7 y   INNER JOIN T3 ON T1.ID = T3.ID
5 L5 C1 {  g, ]0 h; i) l$ x( pWHERE6 Y+ e( f3 T# Z! c5 q
   T1.foo = 'bar' AND T2.fish = 42
$ Y" s1 [  G1 y6 ^" ]+ S  e& _如果您有OUTER JOINs(=*,*=),则第二种样式将按照广告中的说明工作。第一个最有可能不会这样做,并且在SQL Server9 d  j2 G/ S* m2 G3 n, a: }3 J
2005+中也已弃用
! N! ]+ Z3 U3 j; N3 \* @ANSI-92样式也很难实现。使用旧样式时,如果您错过条件,则可以轻松获得笛卡尔乘积(交叉连接)。您将收到ANSI-92的语法错误。$ L6 C$ c2 l9 w2 ^- ]& x
编辑:更多澄清3 `  t0 `# }+ Y" `6 p
不使用“在何处联接”(隐式)的原因是外部联接的结果令人迷惑。7 ?; w# k" u3 e% t8 c7 g* s
如果您使用显式的OUTER JOINs +隐式的INNER JOINs,您仍然会得到不可靠的结果+您的用法不一致
! O3 n7 H2 I5 ?

6 [" f4 h# R: P6 Z  W这不仅是 语法 :它是关于 语义正确的 查询的9 A; R. `' m, L" L4 N; v7 S6 b
编辑,2011年12月! S" z4 n) b. ^; X9 ^1 f
SQL Server 逻辑 查询的处理顺序为FROM,ON,JOIN,WHERE …/ ~$ l# I  l3 ^7 B# L! `! y
因此,如果您将“隐式WHERE内部联接”和“显式来自外部联接”混合使用,则由于查询是模棱两可的,您极有可能无法获得预期的结果…
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则