복붙노트

[SQL] SQL INNER 구문 가입

SQL

SQL INNER 구문 가입

SQL의 2 비트는 다음과 같은 결과를 얻을

SELECT c.name, o.product  
FROM customer c, order o  
WHERE c.id = o.cust_id  
AND o.value = 150  

SELECT c.name, o.product  
FROM customer c  
INNER JOIN order o on c.id = o.cust_id  
WHERE o.value = 150

나는 여러 회사에서 표준으로 사용되는 두 스타일을 보았다. 내가 본 바로는, 제 2 하나는 대부분의 사람들이 온라인 추천 할 것입니다. 스타일보다는이 기타에 대한 진짜 이유가 있습니까? [내부 가끔 가입 더 나은 성능을 사용합니까?

나는 앵그르 나타났습니다 오라클 개발자는 첫 번째 스타일을 사용하는 경향이, 마이크로 소프트 SQL 서버 사용자가 두 번째를 사용하는 경향이있는 반면, 그러나 그것은 단지 우연의 일치 일 수 있습니다.

어떤 통찰력을 주셔서 감사합니다, 나는 잠시 동안 이것에 대해 궁금했습니다.

편집 : 내가 잘못된 terminlogy을 사용하고 있었던 나는이 '데카르트 제품에 비해 가입 SQL 내부'에서 제목을 변경했습니다. 지금까지 모든 응답을 주셔서 감사합니다.

해결법

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

    1.두 쿼리는 내부 조인과 동일합니다. 의 사용은 (, 나는 그것이 기존의 정의에 믿습니다 만, 특히 널리 다음 이전에 사용되지 않은) 구문 만 SQL-92 표준의 도입 후 일반되었다 가입 반면 먼저 일을하는 기존의 방법입니다.

    두 쿼리는 내부 조인과 동일합니다. 의 사용은 (, 나는 그것이 기존의 정의에 믿습니다 만, 특히 널리 다음 이전에 사용되지 않은) 구문 만 SQL-92 표준의 도입 후 일반되었다 가입 반면 먼저 일을하는 기존의 방법입니다.

    의 사용은 그것이이 WHERE 절에서 필터링 로직 로직 가입 분리 구로서 강하게 바람직 조인. 는 내부가 모호하지 않게 조인을 설명하는 것은 불가능하고, 해석이 구현에 의존 경우 이전 * 구문이 상황을 생산할 수있는 외부와 그것의 강도 거짓말 조인 조인 (join) 구문 정말 문법 설탕입니다 가입하는 동안. 에서 [LEFT | 오른쪽] 구문이 함정을 방지하고, 이에 따라 사용이 절은 모든 상황에서 바람직하다 가입 일관성 가입.

    이 두 사례도 직교 제품은 참고 있음. 이를 위해 당신이 중 하나를 사용하십시오

    SELECT c.name, o.product  
    FROM customer c, order o  
    WHERE o.value = 150  
    

    또는

    SELECT c.name, o.product  
    FROM customer c  CROSS JOIN order o 
    WHERE o.value = 150
    
  2. ==============================

    2.귀하의 질문의 대답 부분에, 나는이 가입 초기에 버그가 ... 오라클의 ON 구문이 떨어져 그 구문에서 오라클 사용자를 낙담 생각합니다. 나는 특정 문제가 지금 있다고 생각하지 않습니다.

    귀하의 질문의 대답 부분에, 나는이 가입 초기에 버그가 ... 오라클의 ON 구문이 떨어져 그 구문에서 오라클 사용자를 낙담 생각합니다. 나는 특정 문제가 지금 있다고 생각하지 않습니다.

    그들은 동등 및 최적화를 위해 동일한 내부 표현으로 해석되어야한다.

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

    3.사실 이러한 예는 동일 어느 쪽도 아니는 카티 제품입니다. 당신이는 같이 조인 조건을 지정하지 않고 두 개의 테이블을 조인 할 때 직교 제품이 반환된다

    사실 이러한 예는 동일 어느 쪽도 아니는 카티 제품입니다. 당신이는 같이 조인 조건을 지정하지 않고 두 개의 테이블을 조인 할 때 직교 제품이 반환된다

    select *
    from t1,t2
    

    위키 백과에이 좋은 토론이있다.

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

    4.오라클은 늦게은 가입 지원에했다 ... ON (ANSI) 구문 (안 오라클 9까지) 오라클 개발자가 자주 사용하지 않는 이유입니다.

    오라클은 늦게은 가입 지원에했다 ... ON (ANSI) 구문 (안 오라클 9까지) 오라클 개발자가 자주 사용하지 않는 이유입니다.

    개인적으로, 나는 하나 개의 테이블 쿼리를 운전하는 것이 논리적으로 명확하고 다른 사람이 조회 테이블 때 ANSI 구문을 사용하여 선호합니다. 테이블이 "동일"때, 나는 데카르트 구문을 사용하는 경향이있다.

    성능은 전혀 차이가 있습니다.

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

    5.조인 ... ON ... 구문은 SQL에 대한 ANSI 및 ISO 규격에 최근 추가되었습니다. 그것은 1)이 단지 필터링 WHERE 절을 WHERE 절에서 조건을 결합하고 각 이후 두려워 데카르트 제품을 만드는 경우 2)가 더 분명하게 이동하기 때문에 가입 ... ON ... 구문은 일반적으로 선호된다 절에 적어도 하나의 동반해야합니다 가입하세요. 기준에 참가한 모든 그냥 WHERE 절에 AND로하는 경우 하나 이상이 없을 때, 그것은 분명로하지 않습니다.

    조인 ... ON ... 구문은 SQL에 대한 ANSI 및 ISO 규격에 최근 추가되었습니다. 그것은 1)이 단지 필터링 WHERE 절을 WHERE 절에서 조건을 결합하고 각 이후 두려워 데카르트 제품을 만드는 경우 2)가 더 분명하게 이동하기 때문에 가입 ... ON ... 구문은 일반적으로 선호된다 절에 적어도 하나의 동반해야합니다 가입하세요. 기준에 참가한 모든 그냥 WHERE 절에 AND로하는 경우 하나 이상이 없을 때, 그것은 분명로하지 않습니다.

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

    6.두 쿼리는 내부, 그냥 다른 조인 구문을 수행하고 있습니다.

    두 쿼리는 내부, 그냥 다른 조인 구문을 수행하고 있습니다.

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

    7.내부는 내부의 ON 절에서 사용되는 동일한 조건에 일치하는 절은 쿼리를 가입 WHERE 크로스가 함께 가입으로 문을 다시 작성할 수 있습니다 가입.

    내부는 내부의 ON 절에서 사용되는 동일한 조건에 일치하는 절은 쿼리를 가입 WHERE 크로스가 함께 가입으로 문을 다시 작성할 수 있습니다 가입.

    고려 우리는 다음과 같은 포스트와 post_comment 테이블이 :

    포스트는 다음과 같은 기록이있다 :

    | id | title     |
    |----|-----------|
    | 1  | Java      |
    | 2  | Hibernate |
    | 3  | JPA       |
    

    그리고 post_comment는 다음과 같은 세 가지 행이 있습니다 :

    | id | review    | post_id |
    |----|-----------|---------|
    | 1  | Good      | 1       |
    | 2  | Excellent | 1       |
    | 3  | Awesome   | 2       |
    

    는 SQL 절은 다른 테이블에 속한 동료 행을 수행 할 수 있습니다 가입. 예를 들어, CROSS 두 테이블 조인과 행의 가능한 모든 조합을 포함하는 직교 제품을 만들 것입니다 가입.

    십자가는 특정 시나리오에서 유용 가입하지만, 대부분의 시간, 당신은 특정 조건에 따라 테이블을 조인하고 싶습니다. 그리고, 내부 조인이의 플레이에 온다.

    는 SQL INNER은 우리가 ON 절을 통해 지정된 조건에 따라 두 개의 테이블을 조인의 직교 제품을 필터링 할 수 있습니다 가입.

    당신이 "항상 참"조건을 제공하는 경우, 내부가 결합 된 레코드를 필터링하지 않습니다 가입하고, 결과 집합은 두 테이블 조인의 직교 제품이 포함됩니다.

    우리는 다음과 같은 SQL INNER을 실행할 경우 예를 들어, 쿼리 가입 :

    SELECT
       p.id AS "p.id",
       pc.id AS "pc.id"
    FROM post p
    INNER JOIN post_comment pc ON 1 = 1
    

    우리는 포스트와 post_comment 기록의 모든 조합을 얻을 것이다 :

    | p.id    | pc.id      |
    |---------|------------|
    | 1       | 1          |
    | 1       | 2          |
    | 1       | 3          |
    | 2       | 1          |
    | 2       | 2          |
    | 2       | 3          |
    | 3       | 1          |
    | 3       | 2          |
    | 3       | 3          |
    

    ON 절 조건이 "항상 참"인 경우에 따라서, 내부는 가입 CROSS 쿼리 조인 단순히 동일합니다 :

    SELECT
       p.id AS "p.id",
       pc.id AS "pc.id"
    FROM post p
    CROSS JOIN post_comment
    WHERE 1 = 1
    ORDER BY p.id, pc.id
    

    ON 절 조건이 "항상 false"인 경우 반면에, 모든 결합 된 레코드를 필터링 할 예정 및 결과 집합이 비어 있습니다.

    우리는 다음과 같은 SQL INNER을 실행한다면, 쿼리 가입 :

    SELECT
       p.id AS "p.id",
       pc.id AS "pc.id"
    FROM post p
    INNER JOIN post_comment pc ON 1 = 0
    ORDER BY p.id, pc.id
    

    우리는 어떤 결과 등을받지 않습니다 :

    | p.id    | pc.id      |
    |---------|------------|
    

    쿼리가 위의 다음 CROSS에 해당하기 때문에의 쿼리를 조인 :

    SELECT
       p.id AS "p.id",
       pc.id AS "pc.id"
    FROM post p
    CROSS JOIN post_comment
    WHERE 1 = 0
    ORDER BY p.id, pc.id
    

    절 조건에 가장 일반적으로 다음과 같은 쿼리에 의해 도시 된 바와 같이 부모 테이블의 기본 키 열이 자식 테이블의 외래 키 열을 일치 하나입니다 :

    SELECT
       p.id AS "p.id",
       pc.post_id AS "pc.post_id",
       pc.id AS "pc.id",
       p.title AS "p.title",
       pc.review  AS "pc.review"
    FROM post p
    INNER JOIN post_comment pc ON pc.post_id = p.id
    ORDER BY p.id, pc.id
    

    SQL INNER 위의 쿼리를 가입 실행할 때, 우리는 다음과 같은 결과 집합을 얻을 :

    | p.id    | pc.post_id | pc.id      | p.title    | pc.review |
    |---------|------------|------------|------------|-----------|
    | 1       | 1          | 1          | Java       | Good      |
    | 1       | 1          | 2          | Java       | Excellent |
    | 2       | 2          | 3          | Hibernate  | Awesome   |
    

    그래서 만 ON 절 조건에 일치하는 레코드가 쿼리 결과 집합에 포함됩니다. 우리의 경우, 결과 세트는 post_comment 기록과 함께 모든 게시물을 포함하고 있습니다. 그들은 ON 절 조건을 충족 할 수 없기 때문에 어떤 post_comment을 연결 한 후 행은 제외됩니다.

    다시 말하지만, SQL INNER 위는 다음 CROSS 쿼리 가입에 쿼리가 동일합니다 가입하기 :

    SELECT
       p.id AS "p.id",
       pc.post_id AS "pc.post_id",
       pc.id AS "pc.id",
       p.title AS "p.title",
       pc.review  AS "pc.review"
    FROM post p, post_comment pc
    WHERE pc.post_id = p.id
    

    비 강타 행은 WHERE 절을 만족 만이 기록은 결과 집합에 포함하려고하는 사람입니다. 즉, INNER 절 작동을 가입하는 방법을 시각화하는 가장 좋은 방법입니다.

    | p.id | pc.post_id | pc.id | p.title   | pc.review |
    |------|------------|-------|-----------|-----------|
    | 1    | 1          | 1     | Java      | Good      |
    | 1    | 1          | 2     | Java      | Excellent |
    | 1    | 2          | 3     | Java      | Awesome   |
    | 2    | 1          | 1     | Hibernate | Good      |
    | 2    | 1          | 2     | Hibernate | Excellent |
    | 2    | 2          | 3     | Hibernate | Awesome   |
    | 3    | 1          | 1     | JPA       | Good      |
    | 3    | 1          | 2     | JPA       | Excellent |
    | 3    | 2          | 3     | JPA       | Awesome   |
    
  8. from https://stackoverflow.com/questions/394853/sql-inner-join-syntax by cc-by-sa and MIT license