복붙노트

[SQL] SQL은 가입 : 사용 ON 또는 WHERE 사이에 차이가?

SQL

SQL은 가입 : 사용 ON 또는 WHERE 사이에 차이가?

이러한 문을 가입의 방법으로 SQL의 수행에 어떤 차이가 있는지 궁금 해서요 :

SELECT * FROM a,b WHERE a.ID = b.ID

SELECT * FROM a JOIN b ON a.ID = b.ID

SELECT * FROM a JOIN b USING(ID)

성능 차이가 있나요? 또는 알고리즘의 차이점은 무엇입니까?

아니면 그냥 문법 설탕입니까?

해결법

  1. ==============================

    1.성능 차이가 없습니다.

    성능 차이가 없습니다.

    그러나, 첫 번째 스타일은 ANSI-89이며, 다리는 약간의 상점에서 깨진 얻을 것이다. 내 포함. 두 번째 스타일은 ANSI-92이며 훨씬 명확하다.

    예를 들면 :

    어느 필터가 이는, 가입입니까?

    FROM T1,T2,T3....
    WHERE T1.ID = T2.ID AND
         T1.foo = 'bar' AND T2.fish = 42 AND
         T1.ID = T3.ID
    
    FROM T1 
       INNER JOIN T2 ON T1.ID = T2.ID
       INNER JOIN T3 ON T1.ID = T3.ID
    WHERE
       T1.foo = 'bar' AND T2.fish = 42
    

    당신이 (= *, * =) 외부 조인이 경우 2 스타일 광고로 작동합니다. 먼저 가장 가능성 또한 SQL 서버에서 더 이상 사용되지 않습니다하지 않습니다 2005 +

    는 ANSI-92 스타일도 bollix에 어렵습니다. 당신이 조건을 놓치면 쉽게 데카르트 제품으로 끝낼 수있는 구형으로 (크로스 결합). 당신은 ANSI-92 구문 오류가 발생합니다.

    편집 : 좀 더 명확한 설명

    그냥 문법되지 않습니다 : 그것은 의미 정확한 쿼리를 가진 관하여

    [편집] 2011 년 12월

    SQL 서버의 논리적 쿼리 처리 순서는 ON가, WHERE 가입, FROM입니다 ...

    당신이 혼합한다면 "외부로부터 명시 적 조인"쿼리가 모호하기 때문에 당신이 가장 가능성이 결과를 예상되지 않습니다 "암시 적 내부 조인 WHERE"와 ...

  2. ==============================

    2.차이는 가독성과 유지 보수입니다. A로부터 SELECT *는 a.ID = b.ID 전달한다 ON B 같은 곳에서, 정확한 의도를 가입.

    차이는 가독성과 유지 보수입니다. A로부터 SELECT *는 a.ID = b.ID 전달한다 ON B 같은 곳에서, 정확한 의도를 가입.

    나는 마지막 쿼리 최적화의 후드를 확보하지 않았기 때문에 확실히 말을하지 않습니다,하지만 난 어떤 경우, 성능 사소한 차이에서 찾고 꽤 확신한다.

  3. ==============================

    3.당신이 WHERE 사용하여 가입 강제 때 나는 경멸. 그냥 나에게하지 않는이 더러운 해킹을 마우스 오른쪽 단추로 보인다. ANSI 조인 적절한는 ON 사용하는 것입니다 :

    당신이 WHERE 사용하여 가입 강제 때 나는 경멸. 그냥 나에게하지 않는이 더러운 해킹을 마우스 오른쪽 단추로 보인다. ANSI 조인 적절한는 ON 사용하는 것입니다 :

    SELECT 
        p.Product,
        o.Order
    FROM 
        Product p
    INNER JOIN
        Order o
    ON
        o.OrderID = p.OrderID
    

    필터 결과에 WHERE 가입 때 ON을 사용하여 선호합니다. 당신이 당신의 결과를 필터링 할 위치에 의해 그룹화 및 주문 이외에 사용하는 마지막 일 중 하나입니다 기억하십시오. 읽기 매우 어렵 기 때문에 당신은 WHERE 사용하여 테이블을 조인해서는 안.

    SELECT 
        p.Product,
        o.Order
    FROM 
        Product p
    INNER JOIN
        Order o
    ON
        o.OrderID = p.OrderID
    WHERE
        o.Category = 'IT'
    

    가독성과 유지 보수성이 (가) 코드를 :) 인수하는 영혼을 부어 도움이 될 것입니다, 그래서 결국 당신 (개발자)는 미래에 주위하지 않을 수 있습니다.

    내가 볼 때 개발자는 WHERE는 보통 충분히 T-SQL을 모르는 표시의 자신의 테이블을 조인하는 데 사용. 그건 내 개인적인 의견입니다.

  4. ==============================

    4.이것 좀 봐

    이것 좀 봐

    INNER는 WHERE 절 대 ON 가입

  5. ==============================

    5.이것은이 SO 질문의 중복 : 암시 적 SQL 조인 명시 대. 일반적으로 내가 암시 적 (여기서 버전)을 생각하는 것은 나쁜 형태 (버전) 명시 적으로 명확하지 않다. 나는 또한 암시가 감가 상각되는 생각하지만 하나에 100 %. 실행 계획은 모두하지만 동일합니다.

    이것은이 SO 질문의 중복 : 암시 적 SQL 조인 명시 대. 일반적으로 내가 암시 적 (여기서 버전)을 생각하는 것은 나쁜 형태 (버전) 명시 적으로 명확하지 않다. 나는 또한 암시가 감가 상각되는 생각하지만 하나에 100 %. 실행 계획은 모두하지만 동일합니다.

  6. ==============================

    6.아무도 사용 (...) 구문을 아직 대한 해답을 제공하지 않았다.

    아무도 사용 (...) 구문을 아직 대한 해답을 제공하지 않았다.

    이 두 쿼리는 가장 현대적인 optimisers의 관점에서 논리적으로, 또한 동일하지만 :

    SELECT * FROM a, b WHERE a.id = b.id
    SELECT * FROM a JOIN b ON a.id = b.id
    

    이 사람은 약간 다른 의미를 가지고 :

    SELECT * FROM a JOIN b USING (id)
    

    다음 스키마를 가정 :

    CREATE TABLE a (id int, a1 int, a2 int);
    CREATE TABLE b (id int, b1 int, b2 int);
    

    처음 두 쿼리는 자신의 별표로 확대 할 것이다 :

    SELECT a.id, a.a1, a.a2, b.id, b.a1, b.a2 FROM ...
    

    반면 세 번째 질의는 별표 (*)로 확대 할 것이다 :

    SELECT coalesce(a.id, b.id) AS id, a.a1, a.a2, b.a1, b.a2 FROM ...
    

    이것은 여러 가지 이유로, 포함한 매우 다르다 :

  7. from https://stackoverflow.com/questions/5654278/sql-join-is-there-a-difference-between-using-on-or-where by cc-by-sa and MIT license