2011-03-14 4 views
13

두 테이블, UsersPosts이 있다고 가정 해보십시오. user_idPosts 테이블의 외래 키이며 Users 테이블의 기본 키입니다.이러한 두 개의 결합 테이블 접근법의 차이점은 무엇입니까?

두 SQL 쿼리의 차이점은 무엇입니까?

select user.name, post.title 
    from users as user, posts as post 
where post.user_id = user.user_id; 

대 MySQL을 JOIN syntax, CROSS JOIN, INNER JOIN에서

select user.name, post.title 
    from users as user join posts as post using user_id; 

답변

11

작은 스 니펫의 경우 구문 외에도 완전히 동일하게 작동합니다. 그러나 가능하다면 항상 ANSI-JOIN을 사용하여 새로운 쿼리를 작성하십시오.

의미 상으로 쉼표 표기법은 두 테이블 사이에 CARTESIAN 제품을 생성하는 데 사용됩니다. 즉, 테이블 B의 모든 레코드와 함께 테이블 A의 모든 레코드 행렬을 생성하므로 4와 6 레코드가있는 두 개의 테이블이 각각 24 기록. WHERE 절을 사용하면이 직교 좌표계에서 실제로 원하는 행을 선택할 수 있습니다. 그러나 MySQL은 실제로이 큰 행렬을 따르지 않고 의미 론적으로 이것이 의미하는 바입니다.

JOIN 구문은 테이블 상호 작용 방식을보다 명확하게 정의하는 ANSI 표준입니다. ON 절을 JOIN 옆에두면 두 테이블을 함께 연결하는 것이 명확 해집니다.

기능적으로 두 쿼리에 대해 동일한 기능을 수행합니다. 다른 [OUTER] JOIN 유형을 사용하면 차이가 발생합니다.

MySQL의 경우 특히, 쉼표로 표기 does have one difference

STRAIGHT_JOIN은 왼쪽 테이블이 항상 옳은 테이블 전에 읽을 것을 제외하고, 가입과 유사하다. 이는 조인 옵티 마이저가 테이블을 잘못된 순서로 놓는 경우 (소수의 경우)에 사용할 수 있습니다.

그러나이 차이는 은행에 not be wise입니다. 당신은 당신이 마지막에 외래 키

을 사용하여 두 테이블을 조인하는 다음

from users as user join posts as post using user_id 

조건문을 만들고 여기에

+0

MySQL에서는','(=='STRAIGHT_JOIN')과'JOIN' 사이에 미묘한 차이가 있습니다. –

+0

그래서 쉼표 표기법은 내부 조인과 동일합니까? 그리고 데카르트 제품이 더 많은 자원을 사용하게 될 것인가 ?? –

+0

@jason [cartesian product] (http://en.wikipedia.org/wiki/Cartesian_product)는 SQL에서 SET 기반 연산을 설명하는 데 사용되는 두 세트 간의 수학 연산입니다.두 개의 쿼리는 모든 집중적 인 목적을 위해 동일하므로 더 많은 리소스를 필요로하지 않습니다. – RichardTheKiwi

2

JOIN은 모두 동일합니다. 쉼표로 구분 된 표 목록은 STRAIGHT_JOIN이며 왼쪽 표가 항상 먼저 읽혀 지므로 JOIN과 거의 동일합니다. 매뉴얼에 따르면, 이것은 join optimizer가 테이블을 잘못된 순서로 놓는 경우에 유용합니다. "

4
where post.user_id = user.user_id 

은 동일하지만 가입은 고급 더 나은 사용 쿼리 ...

관련 문제