복붙노트

[SQL] SQL / MySQL의에서 "ON"과 "WHERE"의 차이는 문을 조인 무엇입니까?

SQL

SQL / MySQL의에서 "ON"과 "WHERE"의 차이는 문을 조인 무엇입니까?

다음 명령문은 (하나에 사용하고, 다른 하나는 어디에 사용) 동일한 결과를 제공합니다 :

mysql> select * from gifts INNER JOIN sentGifts ON gifts.giftID = sentGifts.giftID;
mysql> select * from gifts INNER JOIN sentGifts WHERE gifts.giftID = sentGifts.giftID;

난 단지 "타의 추종을 불허하는"경우를 찾는 왼쪽 외부 조인의 경우에서 볼 수있다 : (누군가가 보낸 적이없는 선물을 찾을 수)

mysql> select name from gifts LEFT OUTER JOIN sentgifts 
           ON gifts.giftID = sentgifts.giftID 
           WHERE sentgifts.giftID IS NULL;

이 경우에 먼저 사용하고 곳이다. 는에 먼저 일치 하는가, 그리고 어디에 "차"는 필터링합니까? 또는 어디에 대에 사용하는 일반적인 규칙이있다? 감사.

해결법

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

    1.전체 SELECT 쿼리의 일부이고, ON은 각 개인이 가입의 일부입니다.

    전체 SELECT 쿼리의 일부이고, ON은 각 개인이 가입의 일부입니다.

    ON은 이전에 사용 된 테이블의 필드를 참조 할 수 있습니다.

    왼쪽 테이블의 레코드에 대한 실제 경기가없는 경우, LEFT는 반환에게 NULLS에 설정된 모든 필드 오른쪽 테이블에서 하나 개의 레코드 가입하세요. 절은 다음과 평가 WHERE이를 필터링 할 수 있습니다.

    쿼리에서 'sentgifts'에 일치하지 않고 선물 만 레코드가 반환됩니다.

    여기에 예제가있다

    gifts
    
    1   Teddy bear
    2   Flowers
    
    sentgifts
    
    1   Alice
    1   Bob
    
    ---
    SELECT  *
    FROM    gifts g
    LEFT JOIN
            sentgifts sg
    ON      g.giftID = sg.giftID
    
    ---
    
    1  Teddy bear   1     Alice
    1  Teddy bear   1     Bob
    2  Flowers      NULL  NULL    -- no match in sentgifts
    
    ---
    SELECT  *
    FROM    gifts g
    LEFT JOIN
            sentgifts sg
    ON      g.giftID = sg.giftID
    WHERE   sg.giftID IS NULL
    
    ---
    
    2  Flowers      NULL  NULL    -- no match in sentgifts
    

    당신이 볼 수 있듯이, 실제 경기는 sentgifts.id에서 지금까지 반환 된 전송되지 않은 그래서 단지 선물에 NULL을 남길 수 있습니다.

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

    2.ON 절은 테이블 간의 관계를 정의합니다.

    ON 절은 테이블 간의 관계를 정의합니다.

    WHERE 절은 관심있는 행을 설명합니다.

    당신은 여전히 ​​그들을 교환 할 수 많은 시간 그러나이 항상 왼쪽 외부 조인을 가진 경우가 아니라, 같은 결과를 얻을.

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

    3.내부 조인 사용하는 경우, ON과 WHERE이 같은 결과를해야합니다. 그래서,

    내부 조인 사용하는 경우, ON과 WHERE이 같은 결과를해야합니다. 그래서,

    select *
    from Table1 t1
    inner join Table2 t2 on t1.id = t2.id
    where t1.Name = 'John'
    

    동일한 출력으로이있을 것이다

    select *
    from Table1 t1
    inner join Table2 t2 on t1.id = t2.id
        and t1.Name = 'John'
    

    당신이 언급 한 것처럼 외부 조인을 사용하는 경우, 이것은 사실이 아니다. 어떤 쿼리 계획이 내장됩니다 것은 그래서 혼자 기초가 보장 된 쿼리 계획을 포기하지 않을에 결정, 데이터베이스 플랫폼뿐만 아니라 쿼리 특성에 따라 달라집니다, 변경 될 수 있습니다.

    엄지 손가락의 규칙으로, 당신은 WHERE 절에 필터링에 사용되는 조항과 열 ON에서 테이블을 조인 열을 사용합니다. 이것은 최선의 가독성을 제공합니다.

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

    4.결과는 동일 있지만, 'ON'은 처음 가입하게 한 후 결합 된 세트의 데이터를 검색 할 수 있습니다. 검색은 빠른 부하가 적다. 그러나 사용 'WHERE'개의 결과 세트는 제 페치 될 다음 조건을 적용시킬. 그래서 당신은 선호가 뭔지 알아.

    결과는 동일 있지만, 'ON'은 처음 가입하게 한 후 결합 된 세트의 데이터를 검색 할 수 있습니다. 검색은 빠른 부하가 적다. 그러나 사용 'WHERE'개의 결과 세트는 제 페치 될 다음 조건을 적용시킬. 그래서 당신은 선호가 뭔지 알아.

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

    5.실제로, ON은 NULL과의 조건을 만족하지 않는 각 필드를 대체합니다. @Quassnoi으로 예를 감안할 때

    실제로, ON은 NULL과의 조건을 만족하지 않는 각 필드를 대체합니다. @Quassnoi으로 예를 감안할 때

    gifts
    
    1   Teddy bear
    2   Flowers
    
    sentgifts
    
    1   Alice
    1   Bob
    
    ---
    SELECT  *
    FROM    gifts g
    LEFT JOIN
            sentgifts sg
    ON      g.giftID = sg.giftID
    
    ---
    

    왼쪽은 조건에는이 있다면 순열은 다음 컬렉션에 대해 계산되어 있지 않은 것 가입 :

    { '테디 베어'{ '앨리스', '밥'}, '꽃'{ '앨리스', '밥'}}

    g.giftID sg.giftID = ON 상태로,이 순열을 생성하는 데 사용되는 컬렉션이다 :

    { '테디 베어'{ '앨리스', '밥'}, '꽃': {NULL, NULL}}

    이는 적용됩니다 :

    { '테디 베어'{ '앨리스', '밥'}, '꽃': {NULL}}

    왼쪽에서 결과의 가입 있도록 :

    Teddy bear Alice
    Teddy bear Bob
    Flowers    NULL
    

    그리고 FULL OUTER에 대해 당신이 가진 것 가입 :

    { '테디 베어'{ '앨리스', '밥'}, '꽃': {NULL}} LEFT에 대한이 가입하고 { '앨리스'{ '테디 베어', NULL}, '꽃'{ '테디 베어 'RIGHT에 대한 NULL}}이 (가) 가입 :

    Teddy bear Alice
    Teddy bear Bob
    Flowers    NULL
    

    당신은 또한 ON g.giftID 같은 조건 = 1이 있다면 그것은 것

    {NULL : { '앨리스', '밥'}, '꽃': {NULL}}

    초래 가입 왼쪽에있는

    꽃 NULL

    그리고 FULL OUTER에 대한 초래 가입 {NULL : { '앨리스', '밥'}, '꽃': {NULL}} LEFT은 가입과 { '앨리스': {NULL, NULL} '꽃': {NULL, NULL}} 권리는 가입

    NULL    Alice
    NULL    Bob
    Flowers NULL
    

    참고 MySQL은 전체 외부 조인이없는 당신은 왼쪽에 UNION을 적용해야 가입 및 RIGHT가 가입

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

    6.당신이이 가입 사용하는 경우, 당신은 당신이에 가입하는 조건을 지정해야합니다. 그 목록은 ON 절에 간다. 절 쿼리에 어디 대한 상태 데이터를 저장하는 데 사용되는.

    당신이이 가입 사용하는 경우, 당신은 당신이에 가입하는 조건을 지정해야합니다. 그 목록은 ON 절에 간다. 절 쿼리에 어디 대한 상태 데이터를 저장하는 데 사용되는.

  7. from https://stackoverflow.com/questions/2722795/in-sql-mysql-what-is-the-difference-between-on-and-where-in-a-join-statem by cc-by-sa and MIT license