MySQL 쿼리에서 어디에 대신 조인을 사용합니까?


108

둘 이상의 테이블을 결합하는 것처럼 보이며 join 또는 where를 사용할 수 있습니다. 다른 것보다 하나의 장점은 무엇입니까?


2
사용법에 따라 동일한 결과를 얻을 수 있지만 JOIN을 사용하면 다른 종류의 연결을 수행 할 수 있습니다.
zneak 2010

이것이 귀하의 질문에 대답합니까? INNER JOIN ON vs WHERE 절
philipxy

답변:


160

둘 이상의 테이블을 포함하는 쿼리는 테이블 "A"의 결과를 "B"테이블에 연결하기 위해 어떤 형태의 연관이 필요합니다. 이를 수행하는 전통적인 (ANSI-89) 방법은 다음과 같습니다.

  1. FROM 절에서 쉼표로 구분 된 목록에 포함 된 테이블 나열
  2. WHERE 절에서 테이블 간의 연결을 작성합니다.

    SELECT *
      FROM TABLE_A a,
           TABLE_B b
     WHERE a.id = b.id

다음은 ANSI-92 JOIN 구문을 사용하여 재 작성된 쿼리입니다.

SELECT *
  FROM TABLE_A a
  JOIN TABLE_B b ON b.id = a.id

성능 관점에서 :


지원되는 경우 (Oracle 9i +, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+) 두 구문 중 하나를 사용하여 성능상의 이점이 없습니다. 옵티마이 저는이를 동일한 쿼리로 간주합니다. 그러나보다 복잡한 쿼리는 ANSI-92 구문을 사용하면 이점을 얻을 수 있습니다.

  • JOIN 순서 제어 기능-테이블이 스캔되는 순서
  • 결합하기 전에 테이블에 필터 기준을 적용하는 기능

유지 관리 관점에서 :


ANSI-89보다 ANSI-92 JOIN 구문을 사용하는 데는 여러 가지 이유가 있습니다.

  • JOIN 기준이 WHERE 절과 별개이므로 더 읽기 쉽습니다.
  • JOIN 기준을 놓칠 가능성이 적음
  • INNER 이외의 JOIN 유형에 대한 일관된 구문 지원으로 다른 데이터베이스에서 쿼리를 쉽게 사용할 수 있습니다.
  • WHERE 절은 조인 된 테이블의 데카르트 곱을 필터링하는 역할 만합니다.

디자인 관점에서 :


ANSI-92 JOIN 구문은 패턴이 아니라 패턴입니다.

  • 쿼리의 목적은 더 분명합니다. 응용 프로그램에서 사용하는 열이 명확합니다.
  • 가능할 때마다 엄격한 타이핑을 사용하는 것에 대한 모듈화 규칙을 따릅니다. Explicit는 거의 보편적으로 더 좋습니다.

결론


익숙하지 않거나 편안함이 부족하여 ANSI-92 JOIN 구문 대신 ANSI-89 WHERE 절을 계속 사용하는 것이 어떤 이점도 보지 못합니다. 어떤 사람들은 ANSI-92 구문이 더 장황하다고 불평 할 수도 있지만 그것이 명시 적으로 만드는 이유입니다. 더 명확할수록 이해하고 유지하기가 더 쉽습니다.


14
"... 두 개 이상의 테이블이 포함 된 쿼리는 'A'테이블의 결과를 'B'테이블에 연결하기 위해 어떤 형태의 연결이 필요합니다 ... 그렇지 않으면 Cartesian Product를 얻게되며 아마도 원하지 않을 것입니다. (Cartesians는 LOUSY 제품을 만듭니다).
Scott Smith

8

대부분의 사람들은 JOIN 구문이 무엇에 조인되는지에 대해 조금 더 명확하게 찾는 경향이 있습니다. 또한 표준이라는 이점이 있습니다.

개인적으로 나는 WHEREs에서 "자랐지 만"JOIN 구문을 더 많이 사용할수록 그것이 어떻게 더 명확 해지는 지 더 많이보기 시작했습니다.


1
@nawfal 이해합니다-이전 스타일 구문에 익숙해 지자 새로운 구문에 익숙해지면 이점이 분명해졌습니다. 예를 들어 실수로 교차 조인을 수행하기가 더 어려워지고 조인이 무엇인지 더 쉽게 알 수 있습니다. 필터 등 ..
Basic

8

다음은 where 구문을 사용할 때의 문제입니다 (또는 암시 적 조인이라고도 함).

첫째, 조인 조건이 테이블 이름 바로 옆에 있지 않기 때문에 실수로 교차 조인을 얻는 것이 너무 쉽습니다. 함께 조인되는 6 개의 테이블이있는 경우 where 절에서 하나를 놓치기 쉽습니다. 구별 키워드를 사용하면이 문제가 너무 자주 수정되는 것을 볼 수 있습니다. 이것은 데이터베이스에 대한 엄청난 성능 저하입니다. 명시 적 조인 구문을 사용하면 구문 검사에 실패하므로 실수로 교차 조인을 얻을 수 없습니다.

오른쪽 및 왼쪽 조인은 일부 데이터베이스의 이전 구문에서 문제가 있습니다 (SQl 서버에서는 올바른 결과를 얻을 수 없음). 또한 내가 아는 SQL Server에서는 더 이상 사용되지 않습니다.

교차 조인을 사용하려는 경우 이전 구문에서 명확하지 않습니다. 현재 ANSII 표준을 사용하는 것은 분명합니다.

유지 관리자가 어떤 필드가 조인의 일부인지 또는 암시 적 구문을 사용하여 어떤 순서로 어떤 테이블이 함께 조인되는지 정확히 확인하는 것이 훨씬 더 어렵습니다. 즉, 쿼리를 수정하는 데 더 많은 시간이 걸릴 수 있습니다. 한 번 명시적인 조인 구문에 익숙해지면서 이전 방식으로 돌아간 사람은 거의 없습니다.

또한 이러한 암시 적 조인을 사용하는 일부 사람들은 실제로 조인이 작동하는 방식을 이해하지 못하여 쿼리에서 잘못된 결과를 얻고 있음을 알게되었습니다.

솔직히 18 년 전에 더 나은 방법으로 대체 된 다른 종류의 코드를 사용 하시겠습니까?


6

명시 적 조인은 의도를 전달하고 where 절은 필터링을 수행합니다. 깔끔하고 표준 적이며 어디에서만하기 힘든 왼쪽 아우터 나 오른쪽 아우터 등을 할 수 있습니다.


3

WHERE를 사용하여 두 테이블을 결합 할 수 없습니다. 하지만 할 수있는 일은 다음과 같이 작성하는 것입니다.

SELECT * FROM A, B
WHERE ...

여기서 쉼표는 다음과 같이 쓰는 것과 같습니다.

SELECT *
FROM A
CROSS JOIN B
WHERE ...

당신은 그것을 쓰겠습니까? 아니요-당신이 의미하는 바가 아니기 때문입니다. 크로스 조인을 원하지 않고 INNER JOIN을 원합니다. 그러나 쉼표를 쓸 때 CROSS JOIN을 말하는 것입니다.


0

실제로 "WHERE"와 "JOIN"이 모두 필요합니다.

"JOIN"은 공통 열의 값을 기반으로 두 테이블에서 데이터를 검색하는 데 사용됩니다. 이 결과를 추가로 필터링하려면 WHERE 절을 사용하십시오.

예를 들어 "LEFT JOIN"은 왼쪽 테이블에서 모든 행과 오른쪽 테이블에서 일치하는 행을 검색합니다. 그러나 이것은 특정 값이나 JOIN의 일부가 아닌 다른 열에 대한 레코드를 필터링하지 않습니다. 따라서이 결과를 추가로 필터링하려면 WHERE 절에 추가 필터를 지정하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.