둘 이상의 테이블을 결합하는 것처럼 보이며 join 또는 where를 사용할 수 있습니다. 다른 것보다 하나의 장점은 무엇입니까?
둘 이상의 테이블을 결합하는 것처럼 보이며 join 또는 where를 사용할 수 있습니다. 다른 것보다 하나의 장점은 무엇입니까?
답변:
둘 이상의 테이블을 포함하는 쿼리는 테이블 "A"의 결과를 "B"테이블에 연결하기 위해 어떤 형태의 연관이 필요합니다. 이를 수행하는 전통적인 (ANSI-89) 방법은 다음과 같습니다.
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 구문을 사용하면 이점을 얻을 수 있습니다.
ANSI-89보다 ANSI-92 JOIN 구문을 사용하는 데는 여러 가지 이유가 있습니다.
ANSI-92 JOIN 구문은 패턴이 아니라 패턴입니다.
익숙하지 않거나 편안함이 부족하여 ANSI-92 JOIN 구문 대신 ANSI-89 WHERE 절을 계속 사용하는 것이 어떤 이점도 보지 못합니다. 어떤 사람들은 ANSI-92 구문이 더 장황하다고 불평 할 수도 있지만 그것이 명시 적으로 만드는 이유입니다. 더 명확할수록 이해하고 유지하기가 더 쉽습니다.
다음은 where 구문을 사용할 때의 문제입니다 (또는 암시 적 조인이라고도 함).
첫째, 조인 조건이 테이블 이름 바로 옆에 있지 않기 때문에 실수로 교차 조인을 얻는 것이 너무 쉽습니다. 함께 조인되는 6 개의 테이블이있는 경우 where 절에서 하나를 놓치기 쉽습니다. 구별 키워드를 사용하면이 문제가 너무 자주 수정되는 것을 볼 수 있습니다. 이것은 데이터베이스에 대한 엄청난 성능 저하입니다. 명시 적 조인 구문을 사용하면 구문 검사에 실패하므로 실수로 교차 조인을 얻을 수 없습니다.
오른쪽 및 왼쪽 조인은 일부 데이터베이스의 이전 구문에서 문제가 있습니다 (SQl 서버에서는 올바른 결과를 얻을 수 없음). 또한 내가 아는 SQL Server에서는 더 이상 사용되지 않습니다.
교차 조인을 사용하려는 경우 이전 구문에서 명확하지 않습니다. 현재 ANSII 표준을 사용하는 것은 분명합니다.
유지 관리자가 어떤 필드가 조인의 일부인지 또는 암시 적 구문을 사용하여 어떤 순서로 어떤 테이블이 함께 조인되는지 정확히 확인하는 것이 훨씬 더 어렵습니다. 즉, 쿼리를 수정하는 데 더 많은 시간이 걸릴 수 있습니다. 한 번 명시적인 조인 구문에 익숙해지면서 이전 방식으로 돌아간 사람은 거의 없습니다.
또한 이러한 암시 적 조인을 사용하는 일부 사람들은 실제로 조인이 작동하는 방식을 이해하지 못하여 쿼리에서 잘못된 결과를 얻고 있음을 알게되었습니다.
솔직히 18 년 전에 더 나은 방법으로 대체 된 다른 종류의 코드를 사용 하시겠습니까?
실제로 "WHERE"와 "JOIN"이 모두 필요합니다.
"JOIN"은 공통 열의 값을 기반으로 두 테이블에서 데이터를 검색하는 데 사용됩니다. 이 결과를 추가로 필터링하려면 WHERE 절을 사용하십시오.
예를 들어 "LEFT JOIN"은 왼쪽 테이블에서 모든 행과 오른쪽 테이블에서 일치하는 행을 검색합니다. 그러나 이것은 특정 값이나 JOIN의 일부가 아닌 다른 열에 대한 레코드를 필터링하지 않습니다. 따라서이 결과를 추가로 필터링하려면 WHERE 절에 추가 필터를 지정하십시오.