Tagged: 마리아 디비

MySQL joins: ON vs. USING vs. Theta-style

Mariadb 이 글은 다음에 글을 ‘내 마음대로’ 번역한 것 입니다.

http://code.openark.org/blog/mysql/mysql-joins-on-vs-using-vs-theta-style

다음 3개의 문법에 차이는 무엇인가?

차이점이라면 외형적으로 문법적인 것 외에 없는데, 여기에 흥미로운점이 있다.

이름을 붙이자면, 위에 두개는 “ANSI-style” 마지막 세번째는 “Theta-style” 이라고 한다.

Theta style (세타 스타일)

FROM 구문에, Cartesian 연산을 할 경우에 테이블 리스트, 그리고 WHER 구문에는 어떻게 join 할지를 정의하는 것을 놓는다.

이것은 “old” 스타일로 여겨진다. 이것은 다소 읽기에 혼란스럽다. 다음과 같은 쿼리를 생각해보자.

위 쿼리는 배우 아이디 17이고 필름길이(아마 상영시간인듯) 120분 이상인 필름들을 리스트 한다. 결과에 신경쓰지 말고, 위 쿼리는 무엇인가? WHERE 구문 부분에 존재하는 하나인, AND 표현식에 3개의 엘레멘트중 하나,   조인식은 제외된다. 조인식을 찾기도 힘들도 레코드를 필터하는 문장과 대조적으로 테이블 조인을하는 문장을 구분해 내기도 힘들다. 위 예제에서는 그래도 포인트를 찾기가 쉽다. 5개의 테이블, 20개의  문장을 가진 WHERE 구분 쿼리는 어떻게 할거냐?

ANSI style: ON

JOIN .. ON 에서, 필터링 문장(아마 WHERE 구문을 말하는듯.) 으로부터 조인문장을 분리한다. 앞에 예제를 다시 작성하면 다음과 같다.

이제 무엇을 조인하는지 명확해 졌다.

Note: the parenthesis are not strictly required in the ON clause. 개인적으로 나는 이것을 사용하는것을 좋아한다. 이것은 쿼리 파트사이에서도 아주 큰 차이를 만든다. SQL 문법은 지저분하다.

ANSI style: USING

특별한 경우로 테이블을 조인할 때에 각 테이블에 같은 이름의 컬럼이 존재하면 우리는 USING 을 사용해서 다음과 같이 짧게 작성할 수 있다.

This time the parenthesis are required (I’m not sure why the difference on that part).

이것의 세세한 차이점이라고는 단어를 적게 치거나 결과적으로 아름다운 쿼리정도다. But also note a couple differences:

USING vs. ON

다음은 유효한 구문이다.

하지만 다음은 유효하지 않다.

USING은 양쪽 테이블에서 film_id 가 공유되어진다는 사실을 알고 있는거라면, 우리는 정밀한 테이블의 정의를 물어볼 필요가 없다. 이것은 항상 같은 값이 존재한다.

ON 스마트 하지 않고 좀더 명확한 것을 필요로 한다: 당신이 원하는 것이 정확하게 어느테이블에 있는냐?

위의 실질적으로 흥미로운 현상의 결과는 다음과 같다.: USING을 사용할때에 결과에서 컬럼은 한번 나타난다.

그런데, ON  조인에서는 컬럼이 두번 나타난다.

Behind the scenes

MySQL은 모두 같은 방법으로 모든 쿼리를 다룬다. EXPAIN EXTENDED 의 도움을 받아서 그것을 볼수 있다.

모든 쿼리는 내부적으로 theta-style 로 변환된다.

이 포스트는 inner joins 만 다룬다. outer joins 상황에서는 다소 차이가 있을 수 있다.

Creative Commons License
MySQL joins: ON vs. USING vs. Theta-style by Voyager of Linux is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.