복붙노트

[SQL] INNER는 WHERE 절 대 ON 가입

SQL

INNER는 WHERE 절 대 ON 가입

단순화하기 위해, 모든 관련 필드는 NULL NOT 가정합니다.

넌 할 수있어:

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1, table2
WHERE
    table1.foreignkey = table2.primarykey
    AND (some other conditions)

그렇지 않으면:

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1 INNER JOIN table2
    ON table1.foreignkey = table2.primarykey
WHERE
    (some other conditions)

MySQL은 같은 방법에 두 가지 일을합니까?

해결법

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

    1.INNER JOIN은 사용한다 ANSI 구문입니다.

    INNER JOIN은 사용한다 ANSI 구문입니다.

    일반적으로 테이블의 많은 참여 특히, 더 읽기 간주됩니다.

    필요가 발생 할 때마다 그것은 또한 쉽게 OUTER로 대체 할 수는 가입하세요.

    WHERE 구문이 더 관계형 모델을 지향한다.

    두 테이블의 결과가 테이블 직교하는 제품에 필터가 적용되고 접합되는 컬럼 선택 매칭 합류와 행만.

    그것은 WHERE 구문과이 참조하는 것이 더 쉽습니다.

    귀하의 예로서, MySQL의에 (일반적으로 SQL에서)이 두 쿼리는 동의어입니다.

    또한 MySQL은 또한 STRAIGHT_JOIN 절을 가지고 있습니다.

    외부 루프에 스캔하는 하나의 내부 루프에 있습니다 테이블 :이 절을 사용하면 조인 순서를 제어 할 수 있습니다.

    당신은 WHERE 구문을 사용하여 MySQL의에서이를 제어 할 수 없습니다.

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

    2.다른 사람은 INNER 인간의 가독성을하는 데 도움이, 그리고 그 상위 우선 순위의 가입 있다고 지적 밖으로있다; 나는 동의한다. (가) 구문을 더 읽을 가입 이유를 설명해 해보자.

    다른 사람은 INNER 인간의 가독성을하는 데 도움이, 그리고 그 상위 우선 순위의 가입 있다고 지적 밖으로있다; 나는 동의한다. (가) 구문을 더 읽을 가입 이유를 설명해 해보자.

    기본 SELECT 쿼리는 이것이다 :

    SELECT stuff
    FROM tables
    WHERE conditions
    

    SELECT 절은 우리가 얻고있는 것을 우리에게 알려줍니다; FROM 절은 우리가에서 그것을 얻고, 그리고 WHERE 절은 우리가 얻고있는 것을 우리에게 알려줍니다 어디 있는지를 알려줍니다.

    가입은 함께 결합하는 방법, 테이블에 대한 성명 (개념적으로, 실제로, 하나의 테이블에). 우리가에서 물건을 받고있어 - - 테이블을 제어하는 ​​Query 요소를 의미 FROM 절에 속한다 (요소 가입 물론, 그의는 이동). WHERE 절에 결합 요소를 두는 것은 어느과 conflates를 Where에서부터; (가) 구문이 선호 가입 이유입니다.

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

    3.ON /에 조건문을 적용

    ON /에 조건문을 적용

    여기에 논리 질의 처리 단계에 대해 설명했다.

    참고 : 내부 마이크로 소프트 SQL 서버 ™ 2005 T-SQL 쿼리 제작사 : Microsoft Press에서 출판 일 : 2006년 3월 7일 인쇄 ISBN-10 : 0-7356-2313-9 인쇄 ISBN-13 : 978-0-7356-2313-2 페이지 : 640

    내부 마이크로 소프트 SQL 서버 ™ 2005 T-SQL 쿼리

    (8)  SELECT (9) DISTINCT (11) TOP <top_specification> <select_list>
    (1)  FROM <left_table>
    (3)       <join_type> JOIN <right_table>
    (2)       ON <join_condition>
    (4)  WHERE <where_condition>
    (5)  GROUP BY <group_by_list>
    (6)  WITH {CUBE | ROLLUP}
    (7)  HAVING <having_condition>
    (10) ORDER BY <order_by_list>
    

    다른 프로그래밍 언어와 다른 SQL의 제 두드러진 양상은 코드가 처리되는 순서이다. 대부분의 프로그래밍 언어에서 코드가 기록 된 순서대로 처리됩니다. 처음 나타나는 SELECT 절은, 거의 마지막으로 처리되는 동안 SQL에서 처리되는 첫 번째 절은 FROM 절입니다.

    각 단계는 다음 단계의 입력으로 사용되는 가상 테이블을 생성한다. 이러한 가상 테이블은 호출자 (클라이언트 응용 프로그램 또는 외부 쿼리)에 사용할 수 없습니다. 마지막 단계에서 생성 만 표는 호출자에게 반환됩니다. 특정 절을 쿼리에 지정되지 않은 경우, 해당 단계는 간단하게 건너 뜁니다.

    단계의 설명 지금은 많은 의미를하지 않는 것 경우 너무 걱정하지 마십시오. 이들은 참조로서 제공된다. 시나리오 예를 쫓을 섹션 훨씬 더 상세하게 단계를 다룰 것입니다.

    따라서, ON의 데이터를 필터링한다 (내부 조인) WHERE 절을 적용하기 전에 (여기서 데이터 자체 감소 될 것이다 VT의 계산). 후속 조건이 성능을 향상 필터링 된 데이터와 함께 실행된다 조인. 그 후 단지 WHERE 조건은 필터 조건을 적용합니다.

    (몇 가지 경우에서 큰 차이를하지 않습니다 ON / 조건문을 적용. 이것은 당신이 합류 행 수 사용할 수있는 각 테이블 조인에 얼마나 많은 테이블에 따라 다름)

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

    4.암시는 ANSI 구문 나이가 덜 분명하고하지 않는 것이 좋습니다 가입 할 수 있습니다.

    암시는 ANSI 구문 나이가 덜 분명하고하지 않는 것이 좋습니다 가입 할 수 있습니다.

    또한, 너무도 INNER이 조항은 최적화 rearrranged 술어를 가질 수 WHERE와 쿼리 가입, 관계 대수는 WHERE 절에서 술어의 호환성을 허용하고 내부는 가입하세요.

    난 당신이 가능한 가장 읽기 쉬운 방식으로 쿼리를 작성하는 것이 좋습니다.

    때때로 이것은 내부가 상대적으로 "불완전"가입하고 단순히 더 쉽게 유지 보수 기준을 필터링의 목록을 만들기 위해 WHERE의 기준의 일부를 퍼팅이 포함되어 있습니다.

    예를 들어, 대신 :

    SELECT *
    FROM Customers c
    INNER JOIN CustomerAccounts ca
        ON ca.CustomerID = c.CustomerID
        AND c.State = 'NY'
    INNER JOIN Accounts a
        ON ca.AccountID = a.AccountID
        AND a.Status = 1
    

    쓰다:

    SELECT *
    FROM Customers c
    INNER JOIN CustomerAccounts ca
        ON ca.CustomerID = c.CustomerID
    INNER JOIN Accounts a
        ON ca.AccountID = a.AccountID
    WHERE c.State = 'NY'
        AND a.Status = 1
    

    그러나 물론, 따라 달라집니다.

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

    5.암시는 쿼리에 더 많은 테이블을 추가하기 시작해야하면 훨씬 더 혼란, 하드 읽으려면 및 유지 관리가 어려워 질 (첫 번째 쿼리가로 알려진입니다) 조인. 같은 쿼리를하고 상상해 네다섯 다른 테이블에 조인의 종류 ... 그것은 악몽입니다.

    암시는 쿼리에 더 많은 테이블을 추가하기 시작해야하면 훨씬 더 혼란, 하드 읽으려면 및 유지 관리가 어려워 질 (첫 번째 쿼리가로 알려진입니다) 조인. 같은 쿼리를하고 상상해 네다섯 다른 테이블에 조인의 종류 ... 그것은 악몽입니다.

    명시 적 (두 번째 예)에 가입 사용하면 훨씬 더 읽기 쉽고 유지 보수가 용이하다.

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

    6.나는 또한 오래된 구문을 사용하면 오류가 더 피사체가 있음을 지적합니다. 당신은 내부가 ON 절없이 조인을 사용하는 경우, 당신은 구문 오류가 발생합니다. 당신은 오래된 구문을 사용하고 중 하나를 잊어 버린 경우 WHERE 절에 조인 조건을, 당신은 크로스 조인을 얻을 것이다. 개발자는 종종 별개의 키워드를 추가하여이 문제를 해결 문제를 치료 나타날 수 있지만 상당히 쿼리를 느리게 할 (대신 가입 고정 그들은 여전히 ​​자체가 파손 조인 인식하지 않기 때문에).

    나는 또한 오래된 구문을 사용하면 오류가 더 피사체가 있음을 지적합니다. 당신은 내부가 ON 절없이 조인을 사용하는 경우, 당신은 구문 오류가 발생합니다. 당신은 오래된 구문을 사용하고 중 하나를 잊어 버린 경우 WHERE 절에 조인 조건을, 당신은 크로스 조인을 얻을 것이다. 개발자는 종종 별개의 키워드를 추가하여이 문제를 해결 문제를 치료 나타날 수 있지만 상당히 쿼리를 느리게 할 (대신 가입 고정 그들은 여전히 ​​자체가 파손 조인 인식하지 않기 때문에).

    또한 유지 보수를 위해 당신이 십자가는 이전 구문에 참여있는 경우, 어떻게 의미 경우 테이너의 노하우 하나를 가질 것입니다 (이 필요한 조인 크로스 상황입니다)하거나 수정해야 사고가 있다면?

    내가 당신이 왼쪽 조인을 사용하는 경우 암시 적 구문이 나쁜 이유를이 질문에 당신을 가리킬 수 있습니다. 베이스 * = 같은 내부 테이블 2 개 외 다른 테이블은 ANSI 표준에

    플러스 (개인 호언 장담 여기), 명시 적 조인을 사용하여 표준은 암시 적 구문은 그 20 년 동안 구식이 된 결합을 의미하는 20 세 이상입니다. 당신은 20 년 동안 구식이 된 구문을 사용하여 응용 프로그램 코드를 작성시겠습니까? 왜 당신은 데이터베이스 코드를 작성 하시겠습니까?

  7. ==============================

    7.그들은 다른 사람이 읽을 수있는 의미를 가지고있다.

    그들은 다른 사람이 읽을 수있는 의미를 가지고있다.

    그러나, 쿼리 최적화에 따라, 그들은 컴퓨터에 같은 의미를 가질 수있다.

    당신은 항상 코드를 읽을 수 있어야합니다.

    이것은이 내장 관계, 명시 적 조인을 사용하는 경우 즉, 말을하는 것입니다. 당신이 약하게 관련 데이터에 일치하는 경우, where 절을 사용합니다.

  8. ==============================

    8.는 SQL : A는 문이 "쉼표"에 우선 가입 있도록 2003 표준에 어떤 우선 순위 규칙을 변경 가입 할 수 있습니다. 이것은 실제로는 설치 방법에 따라 쿼리의 결과를 변경할 수 있습니다. 이 원인은 MySQL은 5.0.12 표준 준수로 전환 어떤 사람에 대한 몇 가지 문제 때.

    는 SQL : A는 문이 "쉼표"에 우선 가입 있도록 2003 표준에 어떤 우선 순위 규칙을 변경 가입 할 수 있습니다. 이것은 실제로는 설치 방법에 따라 쿼리의 결과를 변경할 수 있습니다. 이 원인은 MySQL은 5.0.12 표준 준수로 전환 어떤 사람에 대한 몇 가지 문제 때.

    그래서 예에서 쿼리는 동일하게 작동합니다. 하지만 세 번째 테이블을 추가 한 경우 : SELECT는 ... 표 FROM ... WHERE 표 3 가입하기 표 2 ...

    이전 MySQL을 5.0.12로, 표 1 및 표 2는 표 3, 첫 합류 될 것이다. 이제 (5.0.12)에, 표 2 및 표 3은 표 1, 제 결합된다. 항상 결과를 변경하지 않습니다, 그러나 그것은 할 수 있고 당신도 그것을 실현하지 않을 수 있습니다.

    나는 두 번째 예를 들어 말인가, 더 이상 "쉼표"구문을 사용하지 않습니다. 그것은이 아닌 별도의 쿼리 섹션으로 분리, 조인 조건은 가입, 더 많은 읽을 수 어쨌든입니다.

  9. ==============================

    9.난 당신이 어쨌든하지만, MySQL의에 대해 얘기하고 알고 : 오라클에서 9 명시 적 조인과 암시 다른 실행 계획을 생성하는 것입니다 합류했다. 더 이상 그러한 차이가 없습니다 : 오라클 10+에서 해결되었습니다 AFAIK.

    난 당신이 어쨌든하지만, MySQL의에 대해 얘기하고 알고 : 오라클에서 9 명시 적 조인과 암시 다른 실행 계획을 생성하는 것입니다 합류했다. 더 이상 그러한 차이가 없습니다 : 오라클 10+에서 해결되었습니다 AFAIK.

  10. ==============================

    10.ANSI 구문은 확실히 더 이식성이 가입 할 수 있습니다.

    ANSI 구문은 확실히 더 이식성이 가입 할 수 있습니다.

    나는 마이크로 소프트 SQL 서버의 업그레이드를 통해 갈거야, 나는 또한 2005 SQL 서버와 나중에 그 = * 및 * = 외부에 대한 구문은 SQL 서버에서 조인이 (호환성 모드없이)는 지원되지 않습니다 말할 것이다.

  11. ==============================

    11.자주 동적 저장 프로 시저를 프로그래밍하는 경우 (여기서 사용) 두 번째 예와 사랑에 빠지게됩니다. 다양한 입력 매개 변수와 모프 혼란을 많이 가지고 있다면, 그 유일한 방법입니다. 고전 쿼리에서 명백한 차이가 확실히 없다, 그래서 그렇지 않으면 둘 다 동일한 쿼리 계획을 실행합니다.

    자주 동적 저장 프로 시저를 프로그래밍하는 경우 (여기서 사용) 두 번째 예와 사랑에 빠지게됩니다. 다양한 입력 매개 변수와 모프 혼란을 많이 가지고 있다면, 그 유일한 방법입니다. 고전 쿼리에서 명백한 차이가 확실히 없다, 그래서 그렇지 않으면 둘 다 동일한 쿼리 계획을 실행합니다.

  12. from https://stackoverflow.com/questions/1018822/inner-join-on-vs-where-clause by cc-by-sa and MIT license