2011-11-24 8 views
5

SQL 1 : select * from t1 join t2 on t1.f1 = t2.f2두 SQL join 표기법의 차이점은 무엇입니까?

SQL 2 : select * from t1,t2 where t1.f1 = t2.f2

결과가 반납은 동일합니다. 그들 사이에 어떤 차이점이 있습니까? 예를 들어, DBMS가 실행하는 방법이나 쿼리 계획에서?

+5

http://stackoverflow.com/questions/1018822/inner-join-versus-where-clause-any-difference –

답변

11

두 쿼리간에 운영상의 차이점은 없습니다.

그러나 명시 적 조인 표기법은 배우고 사용할 수있는 더 나은 스타일입니다. 다른 하나는 (아직 변경되지 않은) 레거시 코드로 남겨 두십시오.

+1

감사합니다. 편집. 영어가 충분하지 않습니다. – SleeplessKnight

6

하나는 구식이고 하나는 새로운 (ANSI) 스타일입니다. 왜 내가 새로운 스타일을 사용하고자하는지 알게 된 주된 이유는 외부 조인의 표준 지원 때문입니다. 이전 스타일에서는 외부 조인이 공급 업체별입니다. 새로운 스타일은 그것을 표준이 있습니다

당신의 예에서
select * from t1 left outer join t2 on t1.f1 = t2.f2 

, SQL 1은 새로운 및 SQL 2 BTW, 기존의 스타일입니다.

+0

"올드 스타일"과 "새 스타일"중 어떤 것을 표시하고 싶을 수 있습니다. –

+0

좋은 지적. –

+0

을 업데이트하면 다른 SQL 제품 (예 : sqlserver 및 oracle)에 종속된다는 벤더별 의미가 있습니까? – SleeplessKnight

1

기본적으로 두 개의 쿼리가 작동하는 데 차이가 없습니다.

그러나 둘 다 동일한 실행 계획을 가지고 있으며 동일한 쿼리를 실행하는 데 동일한 시간이 걸리는 동일한 비용이 있습니다 (동일한 성능).

결합 연산자를 사용하는 것이 현대적인 방법입니다.

1

두 개는 의미 상 동일합니다 (테마의 다른 변형과 함께). 한 가지 차이점은 Stackoverflow를 사용하는 많은 사용자가 '올드 스타일'내부 조인 (SQL 2)을 허용하지 않는 것을 표현하는 데있어 매우 보컬입니다. 게시자는 댓글을 달거나 경고에주의를 기울일 위험이 있습니다. '안티 패턴 (anti-pattern)'이라는 용어도 적용될 가능성이 높습니다. 저는 SO 커뮤니티 외부에서 이런 스타일의 편협함을 접하지 않았습니다. 실제로 '구식'내부 조인은 SQL 문학에서 매우 일반적입니다.

+0

아마도 잠시 동안 SO SQL 태그에서 활성화 된 사람이 [see] (http://stackoverflow.com/q/7442344) [lots] (http://stackoverflow.com/q/3056271) [of] 명시 적'JOIN' 구문으로 피할 수있는 우발적 인 데카르트 조인의 예 (http://stackoverflow.com/q/7330433) [examples] (http://stackoverflow.com/q/6156757). –

+0

@MartinSmith : 당신의 논리에 결함이 있습니다 : 나는 잠시 동안 SO SQL 태그에서 활발하게 활동 해 왔으며이 스타일에 대한 편협함을 개발하지 못했습니다;) 나는 오히려 그것이 심리적 인 이유로 개발되었다고 생각합니다. "SELECT *"및 "NATURAL JOIN"과 함께 "Bad things happen if happen ..."의 줄을 따라 평행선을 그릴 수 있습니다. – onedaywhen