복붙노트

[SQL] (가) SQL 또는 MySQL의에서 키워드 조인을 사용하지 않는 조인이 뭔가 잘못인가?

SQL

(가) SQL 또는 MySQL의에서 키워드 조인을 사용하지 않는 조인이 뭔가 잘못인가?

나는 데이터베이스 쿼리를 작성하기 시작했을 때 나는 아직 키워드 가입 자연스럽게 난 그냥 내가 이미 알고이 같은 쿼리를 쓴 확장 몰랐습니다 :

SELECT a.someRow, b.someRow 
FROM tableA AS a, tableB AS b 
WHERE a.ID=b.ID AND b.ID= $someVar

지금 나는이 내 코드에서 모든 쿼리를 발견하고 내가 그들을 다시 작성해야하는 경우 자신에게 물어 조인 INNER과 동일 함을 알 수있다. 거기에 뭔가 냄새 나는 그들에 대해인가, 아니면 그들이 잘입니까?

편집하다:

내 대답 요약 :이이 쿼리에 아무것도 잘못입니다하지만 키워드를 사용하는 대부분의 아마 코드가 더 읽기 쉽고 / 유지 보수 할 것입니다.

내 결론 : 내 오래된 쿼리를 변경하지 않습니다하지만 난 내 문체를 해결하고 미래의 키워드를 사용합니다.

귀하의 답변을 주셔서 감사합니다!

해결법

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

    1.몇 가지 일반적인 시나리오에서 매우 비효율적 일 수있다 WHERE 필터링은 단독으로 사용하여 조인. 예를 들면 :

    몇 가지 일반적인 시나리오에서 매우 비효율적 일 수있다 WHERE 필터링은 단독으로 사용하여 조인. 예를 들면 :

    SELECT * FROM people p, companies c 
        WHERE p.companyID = c.id AND p.firstName = 'Daniel'
    

    대부분의 데이터베이스는 먼저 사람과 회사 테이블의 직교 제품을 복용 한 후 회사 ID와 ID 필드와 일치 한 것들에 의해 필터링, 말 그대로이 쿼리를 실행합니다. 완전 구속 제품은 어디서나 그러나 메모리와 만 잠시 존재하지 않지만, 그 계산에는 시간이 좀 걸립니다.

    더 좋은 방법은 적절한 경우 조인과 그룹에 제약이다. 이뿐만 아니라 주관적으로 쉽게 읽기가 아니라 훨씬 더 효율적이다. thusly 히 :

    SELECT * FROM people p JOIN companies c ON p.companyID = c.id
        WHERE p.firstName = 'Daniel'
    

    그것은 조금 더, 그러나 데이터베이스는 ON 절을 보면 완전히 구속 오히려 모든 것을 시작하고 아래로 제한하는 것보다, 직접 가입 계산하는 데 사용할 수 있습니다. 이 계산에 (특히 대용량 데이터 세트 및 / 또는 여러 테이블 조인에) 더 빠르고 적은 메모리를 필요로한다.

    나는 "가입 쉼표"구문을 사용 내가 볼 때마다 쿼리를 변경합니다. 제 생각에는, 그 존재의 유일한 목적은 간결하다. 성능에 미치는 영향을 고려할 때, 나는이 매력적인 이유는 생각하지 않습니다.

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

    2.더 INNER 자세한 FULL OUTER 합류에 대한 ANSI SQL 출신 / 92 JOIN 구문을, 오른쪽 외부 조인, 왼쪽 외부 조인, 가입. 나를 위해,이 상세이 (가) 의도가 가입과 무엇의 개발자 / DBA에 더 명확 참여한다.

    더 INNER 자세한 FULL OUTER 합류에 대한 ANSI SQL 출신 / 92 JOIN 구문을, 오른쪽 외부 조인, 왼쪽 외부 조인, 가입. 나를 위해,이 상세이 (가) 의도가 가입과 무엇의 개발자 / DBA에 더 명확 참여한다.

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

    3.SQL 서버에서 다음과 같은 텍스트 출력 할 수 확인하기 위해 항상 쿼리 계획이있다 :

    SQL 서버에서 다음과 같은 텍스트 출력 할 수 확인하기 위해 항상 쿼리 계획이있다 :

    SET SHOWPLAN_ALL ON
    GO
    
    DECLARE @TABLE_A TABLE
    (
        ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
        Data VARCHAR(10) NOT NULL
    )
    INSERT INTO @TABLE_A
    SELECT 'ABC' UNION 
    SELECT 'DEF' UNION
    SELECT 'GHI' UNION
    SELECT 'JKL' 
    
    DECLARE @TABLE_B TABLE
    (
        ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
        Data VARCHAR(10) NOT NULL
    )
    INSERT INTO @TABLE_B
    SELECT 'ABC' UNION 
    SELECT 'DEF' UNION
    SELECT 'GHI' UNION
    SELECT 'JKL' 
    
    SELECT A.Data, B.Data
    FROM
        @TABLE_A AS A, @TABLE_B AS B
    WHERE
        A.ID = B.ID
    
    SELECT A.Data, B.Data
    FROM
        @TABLE_A AS A
        INNER JOIN @TABLE_B AS B ON A.ID = B.ID
    

    지금은 변수가 작성하는 테이블에 대한 계획을 생략 할 수 있습니다, 두 쿼리에 대한 계획은 비록 동일합니다 :

     SELECT A.Data, B.Data  FROM   @TABLE_A AS A, @TABLE_B AS B  WHERE   A.ID = B.ID
      |--Nested Loops(Inner Join, OUTER REFERENCES:([A].[ID]))
           |--Clustered Index Scan(OBJECT:(@TABLE_A AS [A]))
           |--Clustered Index Seek(OBJECT:(@TABLE_B AS [B]), SEEK:([B].[ID]=@TABLE_A.[ID] as [A].[ID]) ORDERED FORWARD)
     SELECT A.Data, B.Data  FROM   @TABLE_A AS A   INNER JOIN @TABLE_B AS B ON A.ID = B.ID
      |--Nested Loops(Inner Join, OUTER REFERENCES:([A].[ID]))
           |--Clustered Index Scan(OBJECT:(@TABLE_A AS [A]))
           |--Clustered Index Seek(OBJECT:(@TABLE_B AS [B]), SEEK:([B].[ID]=@TABLE_A.[ID] as [A].[ID]) ORDERED FORWARD)
    

    그래서 짧은 대답 - 당신이 그들에게 당신이 그들을 유지 때마다 읽으려고 긴 시간을 할애하지 않는 한 필요는 재 작성?

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

    4.이 구문 선택의 더. 나는 그러므로 나는 INNER JOIN 구문을 사용, 내 내 조인과 조인 조건을 그룹화 선호

    이 구문 선택의 더. 나는 그러므로 나는 INNER JOIN 구문을 사용, 내 내 조인과 조인 조건을 그룹화 선호

    SELECT a.someRow, b.someRow
    FROM tableA AS a
    INNER JOIN tableB AS b
      ON a.ID = b.ID
    WHERE b.ID = ?
    

    (?되는 자리)

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

    5.아무것도 귀하의 예제에서 문법 문제입니다. '내부 조인'구문은 일반적으로 불리는 'ANSI'구문이며, 귀하의 예에 도시 스타일 후에왔다. 그것은 조인의 종류 / 방향 / 구성 요소를 명확히하기 위해 존재하지만, 일반적으로 당신이 가진 것보다 기능적으로 다르지 않다.

    아무것도 귀하의 예제에서 문법 문제입니다. '내부 조인'구문은 일반적으로 불리는 'ANSI'구문이며, 귀하의 예에 도시 스타일 후에왔다. 그것은 조인의 종류 / 방향 / 구성 요소를 명확히하기 위해 존재하지만, 일반적으로 당신이 가진 것보다 기능적으로 다르지 않다.

    조인 'ANSI'에 대한 지원은 당 데이터베이스 플랫폼이지만, 요즘 다소 보편적이다.

    보조 노트, 부가 하나로서 'ANSI'구문이었다 'FULL OUTER 조인'또는 'FULL 조인'.

    도움이 되었기를 바랍니다.

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

    6.일반적으로 :

    일반적으로 :

    링크에 키워드 가입 (예. "가입") 기본 키와 외래 키를 사용합니다.

    관심있는 레코드 만에 결과 집합을 제한하기 위해 WHERE 절을 사용합니다.

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

    7.발생할 수있는 하나의 문제는 당신이 오래된 "쉼표 스타일"을 혼합 할 때와 조인 SQL-92은 내부 사람이 가입해야 할 또 다른 외부 조인 경우, 예를 들어, 동일한 쿼리에 조인입니다.

    발생할 수있는 하나의 문제는 당신이 오래된 "쉼표 스타일"을 혼합 할 때와 조인 SQL-92은 내부 사람이 가입해야 할 또 다른 외부 조인 경우, 예를 들어, 동일한 쿼리에 조인입니다.

    SELECT *
    FROM table1 AS a, table2 AS b
     LEFT OUTER JOIN table3 AS c ON a.column1 = c.column1
    WHERE a.column2 = b.column2;
    

    문제는 최근의 SQL 표준은 쉼표 조인하기 전에이 평가 가입 말할 것입니다. 에 대한 참조 그래서 "A"ON 절이 평가되는 것과 상관 이름이 아직 정의되지 않았기 때문에 ON 절은 오류를 제공합니다. 이 얻을 수있는 매우 혼란 오류입니다.

    이 솔루션의 조인 두 가지 스타일을 혼합하지 않는 것입니다. 당신은 이전 코드에서 쉼표 스타일을 계속 사용할 수 있지만 새 쿼리를 작성하는 경우, 모든이 SQL-92 스타일에 조인 변환 할 수 있습니다.

    SELECT *
    FROM table1 AS a
     INNER JOIN table2 AS b ON a.column2 = b.column2
     LEFT OUTER JOIN table3 AS c ON a.column1 = c.column1;
    
  8. ==============================

    8.이전에 고려해야 할 또 다른 점은 구문이 절에는이 때문에 cartesion 실수로 참여하지 얻을 매우 쉽습니다입니다 가입 할 수 있습니다. DISTINCT 키워드 쿼리에 그것은 오래된 스타일의 조인을 사용하는 경우, 조인 ANSI 표준으로 변환하고 여전히 별개 필요한 경우를 참조하십시오. 실수로 cartesion를 고정하는 것은이 방법을 조인하는 경우, 당신은이 가입하고이 분야에 참여 지정할 다시 작성하여 엄청난 성능을 향상시킬 수 있습니다.

    이전에 고려해야 할 또 다른 점은 구문이 절에는이 때문에 cartesion 실수로 참여하지 얻을 매우 쉽습니다입니다 가입 할 수 있습니다. DISTINCT 키워드 쿼리에 그것은 오래된 스타일의 조인을 사용하는 경우, 조인 ANSI 표준으로 변환하고 여전히 별개 필요한 경우를 참조하십시오. 실수로 cartesion를 고정하는 것은이 방법을 조인하는 경우, 당신은이 가입하고이 분야에 참여 지정할 다시 작성하여 엄청난 성능을 향상시킬 수 있습니다.

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

    9.나는 암시 적 조인을 피하기; 쿼리가 정말 큰 경우, 그들은 해독 하드 코드를 만들

    나는 암시 적 조인을 피하기; 쿼리가 정말 큰 경우, 그들은 해독 하드 코드를 만들

    명시 적 조인하고, 좋은 서식, 코드는 코멘트를위한 필요없이 더 읽고 이해할 수있다.

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

    10.그것은 또한 당신이 단지 내부 일을하는 것은이 방법을 조인 또는 외부뿐만 아니라 조인 여부에 따라 달라집니다. 예를 들어, 외부의 MS SQL 서버 구문 (= * 및 * =)가 외부 http://msdn.microsoft.com/en-us (JOIN 구문을 더 이상 지원과 다른 결과를 줄 수있는 WHERE 절에 조인 SQL Server 2005의 /library/ms178653(SQL.90).aspx).

    그것은 또한 당신이 단지 내부 일을하는 것은이 방법을 조인 또는 외부뿐만 아니라 조인 여부에 따라 달라집니다. 예를 들어, 외부의 MS SQL 서버 구문 (= * 및 * =)가 외부 http://msdn.microsoft.com/en-us (JOIN 구문을 더 이상 지원과 다른 결과를 줄 수있는 WHERE 절에 조인 SQL Server 2005의 /library/ms178653(SQL.90).aspx).

  11. from https://stackoverflow.com/questions/128965/is-there-something-wrong-with-joins-that-dont-use-the-join-keyword-in-sql-or-my by cc-by-sa and MIT license