복붙노트

[SQL] "and"와 "여기서"에 조인의 차이

SQL

"and"와 "여기서"에 조인의 차이

무엇이 차이 사이

SELECT DISTINCT field1 
  FROM table1 cd  
  JOIN table2 
    ON     cd.Company = table2.Name 
       and table2.Id IN (2728) 

SELECT DISTINCT field1 
  FROM table1 cd  
  JOIN table2 
    ON cd.Company = table2.Name 
 where table2.Id IN (2728) 

모두 같은 결과를 반환하고 모두 동일한가 출력을 설명

해결법

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

    1.첫째 의미 론적 차이가있다. 당신이 가입이있을 때, 당신은 두 테이블 사이의 관계가 그 조건에 의해 정의되는 것을 말하고있다. 그래서 첫 번째 예제에서 당신은 테이블이 cd.Company = table2.Name 및 table2.Id IN (2728)에 의해 관련되어 있음을 말하고있다. 당신은 WHERE 절을 사용하면 관계 cd.Company = table2.Name에 의해 정의되어 있고 당신은 단지 조건 table2.Id IN (2728)이 적용되는 행을 원하는 말하고있다. 이들은 같은 대답을하더라도, 그것은 당신의 코드를 읽는 프로그래머에게 매우 다른 것을 의미한다.

    첫째 의미 론적 차이가있다. 당신이 가입이있을 때, 당신은 두 테이블 사이의 관계가 그 조건에 의해 정의되는 것을 말하고있다. 그래서 첫 번째 예제에서 당신은 테이블이 cd.Company = table2.Name 및 table2.Id IN (2728)에 의해 관련되어 있음을 말하고있다. 당신은 WHERE 절을 사용하면 관계 cd.Company = table2.Name에 의해 정의되어 있고 당신은 단지 조건 table2.Id IN (2728)이 적용되는 행을 원하는 말하고있다. 이들은 같은 대답을하더라도, 그것은 당신의 코드를 읽는 프로그래머에게 매우 다른 것을 의미한다.

    이 경우, WHERE 절은 당신이 그것을 사용한다, 그래서 당신이 무슨 뜻인지 거의 확실하다.

    둘째 당신이 왼쪽 대신 내부의 조인 사용하는 것이 실제로 경우 결과에 차이가 있습니다. 당신이 가입의 일환으로 두 번째 조건을 포함하는 경우 조건이 실패 할 경우, 당신은 여전히 ​​결과 행을 얻을 것이다 - 당신은 바로 테이블의 왼쪽 테이블의 값과 null을 얻을 것이다. 당신은 WHERE 절의 일부로서 조건을 포함하고 해당 조건이 실패 할 경우, 당신은 전혀 행을받지 않습니다.

    여기서이 방법을 설명하기 위해 예시된다.

    쿼리 1 (WHERE) :

    SELECT DISTINCT field1
      FROM table1 cd
      LEFT JOIN table2
        ON cd.Company = table2.Name
     WHERE table2.Id IN (2728);
    

    결과:

    field1
    200
    

    질의 2 (AND) :

    SELECT DISTINCT field1
      FROM table1 cd
      LEFT JOIN table2
        ON cd.Company = table2.Name
       AND table2.Id IN (2728);
    

    결과:

    field1
    100
    200
    

    테스트 데이터 사용 :

    CREATE TABLE table1 (Company NVARCHAR(100) NOT NULL, Field1 INT NOT NULL);
    INSERT INTO table1 (Company, Field1) VALUES
    ('FooSoft', 100),
    ('BarSoft', 200);
    
    CREATE TABLE table2 (Id INT NOT NULL, Name NVARCHAR(100) NOT NULL);
    INSERT INTO table2 (Id, Name) VALUES
    (2727, 'FooSoft'),
    (2728, 'BarSoft');
    
  2. ==============================

    2.SQL 관계형 대수에서 온다.

    SQL 관계형 대수에서 온다.

    차이를 볼 수있는 한 가지 방법은 당신이 원래의 테이블에했던 것보다 결과에 더 레코드 이하의 기록을 생성 할 수 있습니다 설정에 대한 작업을 조인입니다. 다른 측면에서 WHERE 항상 결과의 수를 제한합니다.

    텍스트의 나머지는 별도의 설명이다.

    의 개요 유형을 다시 문서를 참조 가입 할 수 있습니다.

    나는 어디 조건이 항상 결과를 제한 할 것이라고 말했을 때, 당신은 키워드 가입하기 더있는 경우에도이 테이블에서 어떻게 든 쌍의 기록에 우리가 테이블을 두에 쿼리 얘기 (또는 그 이상)의 경우 당신이 가진 것을 고려하지해야합니다.

    그래서 SQL의 테이블은 단순히 쉼표로 구분하는 경우, 당신은 실제로 CROSS이 다른 각 행에 대해 하나 개의 테이블에서 모든 행을 반환하는 (직교 제품)을 가입 사용하고 있습니다.

    이는 두 개의 테이블 결합 조작으로 교차 결합 표에 표현 될 수있는 결과의 행의 조합의 최대 수는 때문이다.

    당신이 LEFT, RIGHT를 소개하고 FULL OUTER 조인 때 보류이 최대 예외가 있습니다.

    왼쪽 오른쪽 테이블에서 레코드가 주어진 기준에 왼쪽 테이블에서 레코드를 참여합니다 가입하지만 오른쪽 테이블 왼쪽의 모든 레코드에 대해 만족하지 않는 왼쪽 테이블에서 행보고 기준을 가입하는 경우 가입 반환 여전히 것 왼쪽 테이블에서하고 NULL을 반환합니다 오른쪽 테이블에서 올 것 컬럼의 레코드 (오른쪽 유사 작품을 가입하지만, 다른 측면에서, FULL OUTER는 두 가지를 동시에 같이 작동).

    크로스 조인을 기본 그 레코드를 반환하지 않기 때문에 당신이이 WHERE 조건 기준을 가입하고 사용이 구문을 가입하기에 당신이 강제로 표현할 수 없습니다 (오라클 연산자 = SQL 표준과의 확장이 예외는했지만,이 아니었다 다른 업체도 표준)에 의해 받아 들였다.

    또한, 항상 참조 무결성을 기존의 엔티티 사이의 관계를 제안하지만, 내가 그에 많은 무게로 생각하지 않을 수와 일치 이후 조건합니다 (앞서 언급 한 경우를 제외하고) 동일한 기능을 수행 할 수 있습니다 어디 좋은 보통 조인하지만, RDBMS는 당신이 당신의 기준을 지정 차이를 만들 수 없습니다.

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

    3.조인 그래서 절은 '정적'이다 (엔티티 관계 변화하지 않는 한) 동안 절을 사용하는 경우의 특정 위치를.

    조인 그래서 절은 '정적'이다 (엔티티 관계 변화하지 않는 한) 동안 절을 사용하는 경우의 특정 위치를.

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

    4.다른 점이 없다. "ON"은 같은 읽기의 "WHERE", 두 번째 종류의 일에 대한 동의어 같다 :

    다른 점이 없다. "ON"은 같은 읽기의 "WHERE", 두 번째 종류의 일에 대한 동의어 같다 :

    표 2 가입 WHERE cd.Company = table2.Name table2.Id IN AND (2728)

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

    5.쿼리 최적화 엔진은 관련 쿼리 연산자로 분해 할 때 차이가 없습니다.

    쿼리 최적화 엔진은 관련 쿼리 연산자로 분해 할 때 차이가 없습니다.

  6. from https://stackoverflow.com/questions/2559194/difference-between-and-and-where-in-joins by cc-by-sa and MIT license