복붙노트

[SQL] LEFT 대 가입한다고 설명 자세한 내용과 WHERE 조건의 성능 제안을 가입

SQL

LEFT 대 가입한다고 설명 자세한 내용과 WHERE 조건의 성능 제안을 가입

왼쪽이 조항이 쿼리 계획을 혼동하지와 "무의미"하지 않기 때문에 WHERE 일부를 포함하는 어떤 상황에서 가입보다 더 나은 가입이 주장되는이 후보의 답변을합니다. 주장 / 가정은 누구에게나 명백해야한다는 것입니다.

더 설명하거나 추가 읽기를위한 링크 (들)을 제공하십시오.

해결법

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

    1.다음의 예를 생각해 보자. 우리는 두 개의 테이블, 부서 및 직원이있다.

    다음의 예를 생각해 보자. 우리는 두 개의 테이블, 부서 및 직원이있다.

    일부 부서는 아직 직원이 없습니다.

    이 쿼리는 그렇지 않은 경우는 아무것도 (직원 또는 자신의 이름조차)를 보여줍니다, 내부가 999 개 작품, 어떤 경우에 부서 직원을 찾아 가입 사용

    select a.department_id, a.department_desc, b.employee_id, b.employee_name
      from departments a
      join employees b
        on a.department_id = b.department_id
     where b.employee_id = '999'
    

    이 다음 질의는 (부서와 직원 사이 왼쪽) 외부 조인을 사용하고 해당 직원 999 작품 부서를 찾습니다. 그들이 어떤 부서에서 일을하지 않는 경우에는 너무, 직원의 ID 또는 자신의 이름을 표시하지 않습니다. 그 때문에 외부 조인 된 테이블의 WHERE 절에서 사용하고 있습니다. 일치하는 부서가없는 경우에는 (999 직원에 존재에도 불구하고, 아니 999) null이됩니다.

    select a.department_id, a.department_desc, b.employee_id, b.employee_name
      from departments a
      left join employees b
        on a.department_id = b.department_id
     where b.employee_id = '999'
    

    그러나이 쿼리를 고려 :

    select a.department_id, a.department_desc, b.employee_id, b.employee_name
      from departments a
      left join employees b
        on a.department_id = b.department_id
       and b.employee_id= '999'
    

    지금 기준은 절에서입니다. 이 직원이 어떤 부서에서 일하는 그래서 경우에도, 그는 여전히 (자신의 ID와 이름을) 반환됩니다. 부서 열은 null이 될 것이다, 그러나 우리는 결과 (직원 측)을 얻는다.

    당신은 당신이 WHERE 절에서 외부 조인 된 테이블을 사용하고 싶지는 않을 것이라고 생각할 수도 있지만 반드시 그런 것은 아닙니다. 일반적으로 그것은 이유가 있지만, 위의 설명을 위해입니다.

    당신이없는 직원들과 모든 부서를한다고 가정. 그럼 당신은 외부 조인을 사용하지 다음을 실행할 수 있고, 외부 조인 된 테이블은 where 절에 사용된다 :

    select a.department_id, a.department_desc, b.employee_id
      from departments a
      left join employees b
        on a.department_id = b.department_id
     where b.employee_id is null
    

    ^^ 어떤 직원 쇼 부서.

    위의 가능성은 WHERE 절보다는 ON 절에서 외부 조인 된 테이블을 사용하고자 할 유일한 합법적 인 이유 (나는 당신의 질문이 무엇인지 생각, 내부 및 외부 결합의 차이는 완전히 다른 주제입니다).

    보는 좋은 방법은 이것이다 : 당신은 외부 널 (null)을 허용 조인을 사용합니다. 왜 그런 다음 외부 조인 및 필드가 null 안와 'XYZ'동일해야한다는 말을 사용해야합니까? 값이 'XYZ'(NOT NULL)해야하는 경우, 왜 데이터베이스 지시 널 돌아올 수 있도록? 그것은 나중에 무시 다음 한 가지 말과 같다.

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

    2.효과적으로, 조건과 조건이 가입 WHERE [INNER] PostgreSQL의 100 % 당량 조인. (그래도 읽고 쉽게 유지하기 위해 쿼리를 만들기 위해 명시 적 조건을 조인을 사용하는 것이 좋습니다입니다).

    효과적으로, 조건과 조건이 가입 WHERE [INNER] PostgreSQL의 100 % 당량 조인. (그래도 읽고 쉽게 유지하기 위해 쿼리를 만들기 위해 명시 적 조건을 조인을 사용하는 것이 좋습니다입니다).

    왼쪽이 조인의 오른쪽 테이블에 WHERE 조건과 결합 된 조인 같은 사실이 아니다. (가), 오른쪽에 일치 선명하게 촬상 가입의 가입 왼쪽의 목적은 왼쪽에있는 모든 행을 보존하는 것입니다. 일치하는 항목이없는 경우, 행은 오른쪽 열에 NULL 값으로 확장됩니다. 수동 :

    그런 다음 오른쪽에있는 테이블의 컬럼에 WHERE 조건을 적용하는 경우, 당신은 단지 더 비싸게 인해 더 복잡한 쿼리 계획으로, 왼쪽은 가입 일반 같은 작업에 가입 변환을 강제하는 효과를 무효로합니다.

    많은 조인 된 테이블과 쿼리에서, 포스트 그레스 (또는 RDBMS가)의 매력 (또는 좋은) 쿼리 계획을 찾기 어려운 넣어이다. 테이블을 조인하기 위해 이론적으로 가능한 시퀀스의 수는 factorially 증가 (!). 포스트 그레스 작업에 대해 "일반 쿼리 최적화"를 사용하며, 영향을 미칠 수있는 몇 가지 설정이 있습니다.

    LEFT이 설명 된대로, 열심히 쿼리 플래너의 일을하게 쿼리 논리의 오류에 인간의 독자 일반적으로 힌트에 대한 오해의 소지 가입 오해와 쿼리를 난독.

    이에 따른 문제에 대한 많은 관련 답변 :

    기타.

  3. from https://stackoverflow.com/questions/24876673/explain-join-vs-left-join-and-where-condition-performance-suggestion-in-more-de by cc-by-sa and MIT license