복붙노트

[SQL] "..에와"사이의 차이 "에 .. 어디"SQL 왼쪽에서 가입? [복제]

SQL

"..에와"사이의 차이 "에 .. 어디"SQL 왼쪽에서 가입? [복제]

SQL 문을.

1.select a.* from A a left join B b on a.id =b.id and a.id=2;

2.select a.* from A a left join B b on a.id =b.id where a.id=2;

이 두 개의 SQL 문장의 차이는 무엇인가?

해결법

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

    1.

    create table A(id int);
    create table B(id int);
    
    INSERT INTO A VALUES(1);
    INSERT INTO A VALUES(2);
    INSERT INTO A VALUES(3);
    
    INSERT INTO B VALUES(1);
    INSERT INTO B VALUES(2);
    INSERT INTO B VALUES(3);
    
    SELECT * FROM A;
    SELECT * FROM B;
    
    id
    -----------
    1
    2
    3
    
    id
    -----------
    1
    2
    3
    

    온 필터는이 과정을 가입시 추가되는 행을 방지하기 위해 가입.

    select a.*,b.*
    from   A a left join B b 
    on     a.id =b.id and a.id=2;
    
    id          id
    ----------- -----------
    1           NULL
    2           2
    3           NULL
    

    (가) 발생에 가입하면 WHERE 필터링한다.

    select a.*,b.* 
    from   A a left join B b 
    on     a.id =b.id 
    where  a.id=2;
    
    id          id
    ----------- -----------
    2           2
    
  2. ==============================

    2.조인 조건에서 이것은 단지 a.id <> (2)가 필터링되지 않는 경우 기록 있도록, a.id를 사용합니다. 이 같은 결과를 얻을 수 있습니다 :

    조인 조건에서 이것은 단지 a.id <> (2)가 필터링되지 않는 경우 기록 있도록, a.id를 사용합니다. 이 같은 결과를 얻을 수 있습니다 :

    +------+------+
    | a.id | b.id |
    +------+------+
    | 1    | NULL |
    | 2    | 2    |
    | 3    | NULL |
    +------+------+
    

    당신은 B의 열 중 하나를 선택하지 않는다, 그러나 당신이 경우에, 쉽게 이해할 수 있습니다.

    a.id <> 2 필터링합니까 어디 이제 기록합니다.

    +------+------+
    | a.id | b.id |
    +------+------+
    | 2    | 2    |
    +------+------+
    
  3. ==============================

    3.@hvd 말하는 것처럼이 "여기서"버전은 외부 조인 행을 (어떤이 a.id = NULL) 반환하지 않습니다, 그래서에 의해 반환 된 "여기서"절 필터 행은, 가입 할 수 있습니다.

    @hvd 말하는 것처럼이 "여기서"버전은 외부 조인 행을 (어떤이 a.id = NULL) 반환하지 않습니다, 그래서에 의해 반환 된 "여기서"절 필터 행은, 가입 할 수 있습니다.

    그러나 또 다른 중요한 차이가있다 : 외부 조인 행이 필터링되지 않은 경우에도, 결과 세트가 이전 작게되기 때문에, 절 "의"에 조건을 넣는 엄청난 성능 향상이있을 수 있습니다.

    당신도 적합하지 않은 행에 대해 다음 표를 발생하지 조인 방지하고 잠재적으로 필터링에 도달 수백만 개의 행을 잘라 수 있습니다 ( "- 다른 왼쪽 조인 된 테이블의 일련가"와 "조건 하나를 다음과 경우에 특히 발음 ") 단계.

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

    4.나는 시간을 시도하고 나는 이유, 그것은 단지 우선 순위와 관련이 무엇인지 알고있다.

    나는 시간을 시도하고 나는 이유, 그것은 단지 우선 순위와 관련이 무엇인지 알고있다.

    select * from A a left join B b on a.id=b.id and b.id=2
    

    이 수단은 이것이 조건이다 (여기서 b.id = 2) 가입 왼쪽 필터 B 제

    Select * from A a left join B b on a.id=b.id where a.id=2
    

    이 방법은 이후 a.id = B (2)에 의해, 다음 필터 합류

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

    5.당신은 SQL 쿼리 구문에 대해 생각하는 경우는 'AND'는 블록을 결합 확장 (있는 경우와 같은 경우 괄호) 곳으로 쿼리의 WHERE / 필터링 블록의 시작을 정의하는 'WHERE'가.

    당신은 SQL 쿼리 구문에 대해 생각하는 경우는 'AND'는 블록을 결합 확장 (있는 경우와 같은 경우 괄호) 곳으로 쿼리의 WHERE / 필터링 블록의 시작을 정의하는 'WHERE'가.

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

    6.명확하게 @mr_eclair에 의해 설명 된 바와 같이

    명확하게 @mr_eclair에 의해 설명 된 바와 같이

    무슨 일이 두 경우에 발생합니다. 내가 당신이 기억하는 쉬운 방법을 말씀 드리겠습니다.

    select a.*,b.*
    from   A a left join B b 
    **on**     a.id =b.id ***and*** a.id=2;
    

    여기에 "AND"를 "ON"에 근무하고 그것은 가입 기준과 조건을 제공합니다.

    select a.*,b.* 
    from   A a left join B b 
    on     a.id =b.id 
    **where**  a.id=2;
    

    여기 반면 "WHERE"모든 결과에 조건을 제공했다.

    더 명확하게 넣어하기 위해, "WHERE"에서 결과를 발견 한 후 결과 집합 필터링 문 "을 선택합니다." "AND"두 테이블을 조인의 조건이다.

  7. from https://stackoverflow.com/questions/12400567/difference-between-on-and-and-on-where-in-sql-left-join by cc-by-sa and MIT license