복붙노트

[SQL] 사용 A는 WHERE 조건에 비해 절을 가입하는 이유?

SQL

사용 A는 WHERE 조건에 비해 절을 가입하는 이유?

나는 오라클 데이터베이스에 대해 개발한다. 내가 수동으로 기록해야 할 때 (최대 절전 모드와 같은 ORM을 사용하지 않음), 나는 대신이 가입의 WHERE 조건을 사용합니다.

(예를 들어,이 스타일을 설명하기 위해 간단한 단지입니다) :

Select *
from customers c, invoices i, shipment_info si
where c.customer_id = i.customer_id
    and i.amount > 999.99 
    and i.invoice_id = si.invoice_id(+)  -- added to show a replacement for a join
order by i.amount, c.name

나는 OLD 오라클 DBA에서이 스타일을 배웠다. 나는이 표준 SQL 구문 아니라는 것을 알게하기 때문에이있다. 비표준 훨씬 적은 데이터베이스가 휴대용 것보다 다른,이 형식을 사용하는 다른 영향이 있습니까?

해결법

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

    1.어떤 사람들은이 스타일은 덜 읽을 수 있는지 말할 것이다, 그러나 그것은 습관의 문제이다. 쿼리 최적화가 돌봐 때문에 성능 관점에서, 그것은 중요하지 않습니다.

    어떤 사람들은이 스타일은 덜 읽을 수 있는지 말할 것이다, 그러나 그것은 습관의 문제이다. 쿼리 최적화가 돌봐 때문에 성능 관점에서, 그것은 중요하지 않습니다.

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

    2.그것은 더 열심히 절을 시뮬레이션을위한 WHERE 실제 필터에 대해있는 사람 조인하고 결정 할 수 있기 때문에 나는 스타일을 좋아하지 않아, 나는 그것이 불필요하게 어려운 프로그래머의 원래의 의도를 결정하게 코드를 좋아하지 않는다.

    그것은 더 열심히 절을 시뮬레이션을위한 WHERE 실제 필터에 대해있는 사람 조인하고 결정 할 수 있기 때문에 나는 스타일을 좋아하지 않아, 나는 그것이 불필요하게 어려운 프로그래머의 원래의 의도를 결정하게 코드를 좋아하지 않는다.

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

    3.나는이 형식으로 실행 한 것을 가장 큰 문제는 일부 조항하여 카티 제품의 결과의 가입 잊지하는 경향이다. 쿼리에 새 테이블을 추가 할 때이 (적어도 나를 위해) 특히 일반적이다. 예를 들어, 어드레스 테이블 믹스에 던져되고 당신의 마음이 조금 건망증 가정하자 :

    나는이 형식으로 실행 한 것을 가장 큰 문제는 일부 조항하여 카티 제품의 결과의 가입 잊지하는 경향이다. 쿼리에 새 테이블을 추가 할 때이 (적어도 나를 위해) 특히 일반적이다. 예를 들어, 어드레스 테이블 믹스에 던져되고 당신의 마음이 조금 건망증 가정하자 :

    SELECT *
      FROM customers c, invoices i, addresses a
     WHERE c.customer_id = i.customer_id
       AND i.amount > 999.99
     ORDER BY i.amount, c.name
    

    팔! 데카르트 제품! :)

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

    4.오래된 스타일의 조인 (외부 범인입니다 조인) 어떤 경우에는 잘못된 밖으로 평평하다. 내부 조인 사용하는 경우가 더 많거나 적은 당량이지만 외부 결합과, 그들 외측에 열이 널이 될 수 있으며, 특히, 잘못된 결과를 생성 할 수있다. 전체 결과 집합이 생성 될 때까지 상태가 논리적 평가되지 조인 이전 구문을 사용하는 경우는 그 레코드를 필터링 할 가입에,이 때 열 캔 외측으로부터 열 상태를 표현하기 위해 단지 수 없기 때문이다 일치하는 기록이 없기 때문에 null의 경우.

    오래된 스타일의 조인 (외부 범인입니다 조인) 어떤 경우에는 잘못된 밖으로 평평하다. 내부 조인 사용하는 경우가 더 많거나 적은 당량이지만 외부 결합과, 그들 외측에 열이 널이 될 수 있으며, 특히, 잘못된 결과를 생성 할 수있다. 전체 결과 집합이 생성 될 때까지 상태가 논리적 평가되지 조인 이전 구문을 사용하는 경우는 그 레코드를 필터링 할 가입에,이 때 열 캔 외측으로부터 열 상태를 표현하기 위해 단지 수 없기 때문이다 일치하는 기록이 없기 때문에 null의 경우.

    예로서:

    모든 고객을 선택하고 송장 처리 된 8 월의 달에 모든 송장에 위젯의 매출의 합 (Invoice.ProcessDate은 NOT NULL입니다)

    새로운 사용하여 ANSI을-92 구문을 가입

     Select c.name, Sum(d.Amount)
     From customer c
        Left Join Invoice I 
            On i.custId = c.custId
                And i.SalesDate Between '8/1/2009' 
                          and '8/31/2009 23:59:59'
                And i.ProcessDate Is Not Null
        Left Join InvoiceDetails d 
            On d.InvoiceId = i.InvoiceId
                And d.Product = 'widget'
     Group By c.Name
    

    이전 스타일 구문을 사용하는 경우 때문에 ... 이전 구문과 함께이 일을 절은 /는 '외부'행이 모든 처리되지 않은 송장 행이 다시 추가 얻을 것이다, 다시 추가하기 전에 적용을 평가하는 모든 조건을보십시오 이 오래된 구문 수 없습니다 그래서 최종 결과 세트는 ... - 시도가 고객을 제거합니다 널 (null) 처리 된 날짜와 송장을 필터링하는 것을 아무것도 ... 유일한 대안은 상관 하위 쿼리를 사용하는 것입니다.

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

    5.그건 사실이 아니다. 구문은 ANSI-89 표준에서있는 "A, B"는이 구문이 ANSI-92는 "A는 B에 가입". 그러나, 89 구문은 새로운 쿼리를 사용하지 말아야 의미되지 않습니다.

    그건 사실이 아니다. 구문은 ANSI-89 표준에서있는 "A, B"는이 구문이 ANSI-92는 "A는 B에 가입". 그러나, 89 구문은 새로운 쿼리를 사용하지 말아야 의미되지 않습니다.

    또한, 구형 특히 외부 조인하거나 복잡한 쿼리와 관련하여, 표현력이 부족 몇 가지 경우가 있습니다.

    이 조건에 가입 골라하려고 where 절을 통과 통증이있을 수 있습니다. 더 아무것도 들어 하나는 이전 스타일이 절대 악에 가입보다. 새 스타일을 알고 나면, 당신은뿐만 아니라 단지 그것을 계속 사용 할 수 있습니다.

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

    6.이 표준 SQL 구문, 가입보다는 그냥 오래된 표준입니다. 이 구문이 진화하는 이유는 그리고 당신은 새로운 구문 때문에 가입 사용해야합니다 :

    이 표준 SQL 구문, 가입보다는 그냥 오래된 표준입니다. 이 구문이 진화하는 이유는 그리고 당신은 새로운 구문 때문에 가입 사용해야합니다 :

    난 당신이 어디 형이 실질적으로 적은 포터블 JOIN 구문을보다 가입 찾을 수 있다고 생각하지 않습니다.

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

    7.만큼 당신이 ANSI 자연 기능을 조인을 사용하지 않는 한 나는 그것으로 OK입니다.

    만큼 당신이 ANSI 자연 기능을 조인을 사용하지 않는 한 나는 그것으로 OK입니다.

    내가하여 견적을 발견 - ScottCher, 나는 완전히 동의합니다 :

    나는 찾을 구문 INNER보다 쉽게 ​​읽을 수는 가입 어디 - 내가 베지 마이트처럼 자신을 생각한다. 세계에서 대부분의 사람들은 아마 역겨운하지만, 아이들이 그것을 사랑 먹고 자라 찾을 수 있습니다.

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

    8.정말 습관에 따라 달라집니다,하지만 난 항상 오라클의 쉼표가 더 자연스러운 구문 분리 된 발견했다. 첫 번째 이유는 내가 (INNER)를 사용하여 생각 감소 가독성을 가입한다는 것입니다. 두 번째는 유연성에 관한 것입니다. 마지막으로, 조인 정의에 의해 카티 제품입니다. 당신은 반드시 두 테이블의 ID를 기반으로 결과를 제한 할 필요가 없습니다. 매우 드물게 있지만, 하나는 잘 두 테이블의 카티 제품을해야 할 수도 있습니다. ID를 기반으로이를 제한하는 규칙 그냥 아주 합리적인 연습 만이 아닙니다. 당신이 사용하는 경우, 예를 들어,에 키워드 가입 SQL Server는, 당신이 ON 키워드를 생략하지 않습니다. 당신이 조합 목록을 만들려면 가정하자. 당신은 이런 식으로 할 필요가 :

    정말 습관에 따라 달라집니다,하지만 난 항상 오라클의 쉼표가 더 자연스러운 구문 분리 된 발견했다. 첫 번째 이유는 내가 (INNER)를 사용하여 생각 감소 가독성을 가입한다는 것입니다. 두 번째는 유연성에 관한 것입니다. 마지막으로, 조인 정의에 의해 카티 제품입니다. 당신은 반드시 두 테이블의 ID를 기반으로 결과를 제한 할 필요가 없습니다. 매우 드물게 있지만, 하나는 잘 두 테이블의 카티 제품을해야 할 수도 있습니다. ID를 기반으로이를 제한하는 규칙 그냥 아주 합리적인 연습 만이 아닙니다. 당신이 사용하는 경우, 예를 들어,에 키워드 가입 SQL Server는, 당신이 ON 키워드를 생략하지 않습니다. 당신이 조합 목록을 만들려면 가정하자. 당신은 이런 식으로 할 필요가 :

    SELECT *
    FROM numbers
    JOIN letters
    ON 1=1
    

    그 외에도에서, 나는 매우 합리적인 오라클의 (+) 구문을 찾을 수 있습니다. 그것은 말할 수있는 좋은 방법이다 "null의 경우에도, 너무 결과 집합에이 레코드를 추가합니다." 사실 권리가 좌우되기 때문에 그것은 / 좌, JOIN 구문을 더 나은 방법 우보다 더입니다! 당신은 그것이 "왼쪽"과 오른쪽에있는 하나 인 테이블 혼동됩니다 조인을 외부의 여러 가지 유형의 10 개 테이블을 조인 할 때.

    그런데,보다 일반적인 주석으로, 나는 SQL 이동성이 더 이상 실제 세계에 존재 생각하지 않습니다. 나는 100 % 휴대용 SQL 코드가 달성 할 수있는 목표라고 생각하지 않습니다, 표준 SQL은 가난하고 다양한 DBMS의 특정 구문의 표현은 너무 자주 요구된다. 내 관찰의 가장 확실한 증거는 좋은 오래된 행 번호 problemmatic이다. 그냥 "SQL 행 번호", SO 포함에 대한 포럼을 검색하고, 당신은이 특정의 DBMS에서 달성 할 수있는 방법을 묻는 게시물의 수백을 볼 수 있습니다. 유사 그래서, 예를 들면, 리턴 된 행의 수를 제한하고, 그 관련 ..

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

    9.이 거래 SQL 구문이고, 나는 확신이 얼마나 "인자를 취하지"아니에요 - 그것은베이스에 사용되는 주요 구문, 예를 들어뿐만 아니라 많은 다른 데이터베이스 (모든 경우) (사이베이스는 ANSI의뿐만 아니라 구문을 지원) .

    이 거래 SQL 구문이고, 나는 확신이 얼마나 "인자를 취하지"아니에요 - 그것은베이스에 사용되는 주요 구문, 예를 들어뿐만 아니라 많은 다른 데이터베이스 (모든 경우) (사이베이스는 ANSI의뿐만 아니라 구문을 지원) .

    ANSI 구문의 주요 이점은 당신이 몇 가지 매우 까다로운 연쇄은 T-SQL이 금지 조인 쓸 수 있다는 것입니다

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

    10.모든 사람이 JOIN 구문을 지원하는 반면,이, 거의 모든 데이터베이스와 함께 작동하기 때문에 사실,이 구문은, A는 가입보다 더 많은 휴대용 (오라클 라이트, 예를 들어 [이없는 한 최근 변경]되지 않음).

    모든 사람이 JOIN 구문을 지원하는 반면,이, 거의 모든 데이터베이스와 함께 작동하기 때문에 사실,이 구문은, A는 가입보다 더 많은 휴대용 (오라클 라이트, 예를 들어 [이없는 한 최근 변경]되지 않음).

  11. from https://stackoverflow.com/questions/1613304/why-use-a-join-clause-versus-a-where-condition by cc-by-sa and MIT license