복붙노트

[SQL] MySQL의 쿼리에서, 왜 사용하는 대신 어디 조인?

SQL

MySQL의 쿼리에서, 왜 사용하는 대신 어디 조인?

두 개 이상의 테이블을 결합하는 것 같다, 우리는 중 하나에 가입하거나 위치를 사용할 수 있습니다. 다른 통해 하나의 장점은 무엇입니까?

해결법

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

    1.둘 이상의 테이블을 포함하는 모든 쿼리는 테이블 "B"에 테이블 "A"에서 결과를 연결하는 연결의 형태를 필요로한다. 이렇게 전통적인 (ANSI-89) 수단이다 :

    둘 이상의 테이블을 포함하는 모든 쿼리는 테이블 "B"에 테이블 "A"에서 결과를 연결하는 연결의 형태를 필요로한다. 이렇게 전통적인 (ANSI-89) 수단이다 :

    여기에 ANSI-92 JOIN 구문을 사용하여 재 작성된 쿼리는 다음과 같습니다

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

    지원되는 경우 (오라클 9i의 +, PostgreSQL을 7.2+, MySQL은 3.23 이상의, SQL 서버 2000 +), 다른 이상 중 하나 구문을 사용하여 성능에 이점이 없다. 옵티마이 저는 같은 쿼리로 본다. 그러나 더 복잡한 쿼리는 ANSI-92 구문을 사용하여 혜택을 누릴 수 있습니다 :

    ANSI-92은 ANSI-89을 통해 JOIN 구문을 사용하는 많은 이유가있다 :

    ANSI-92 구문 패턴이 아니라 안티 패턴 가입 :

    친숙 및 / 또는 편안함의 짧은, 내가 대신 ANSI-92의 ANSI-89 WHERE 절을 사용 JOIN 구문을 계속 어떤 혜택을 볼 수 없습니다. 일부는 ANSI-92 구문은 더 자세한 것을 불평 만의 것을하는 것은 명시 적으로 만드는 것 수 있습니다. 더 명시 적으로는 더 쉽게 이해하고 유지하는 것입니다.

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

    2.대부분의 사람들은 무엇에 결합되는 것과 같은 구문을 좀 더 명확 가입 찾는 경향이있다. 또한, 표준되는 이점이있다.

    대부분의 사람들은 무엇에 결합되는 것과 같은 구문을 좀 더 명확 가입 찾는 경향이있다. 또한, 표준되는 이점이있다.

    개인적으로, 나는 알의에서 "성장",하지만 더 나는 더 내가 더 분명 방법을보기 시작하고있어이 구문 가입 사용합니다.

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

    3.이들은 (다른 현명 내재적으로 조인 알려짐)를 사용하여 위치를 구의 문제이다 :

    이들은 (다른 현명 내재적으로 조인 알려짐)를 사용하여 위치를 구의 문제이다 :

    첫째, 너무 쉽게 조건이 바로 옆 테이블 이름에하지에 참여하기 때문에 실수로 크로스 조인을 얻는 것입니다. 당신이 6 개 테이블이 함께 결합되어있는 경우, WHERE 절에 하나를 놓치지 쉽습니다. 당신은 별개의 키워드를 사용하여이 너무 자주 모든 고정 볼 수 있습니다. 이 데이터베이스에 대한 공격 ahuge 성능이다. 당신은 실수로 십자가는 문법 체크를 실패로 명시 적 조인 구문을 사용하여 가입 얻을 수 없습니다.

    오른쪽과 왼쪽 조인은 어떤 데이터베이스의 이전 구문 (SQL Server의 올바른 결과를 얻을 수 보장 할 수 없습니다) 문제가있다. 또한 그들은 SQL 서버 I의 노하우에 사용되지 않습니다.

    당신이 사용하려는 경우 크로스는 이전 구문에서 명확하지 않은 경우, 가입 할 수 있습니다. 그것은 현재 ANSII 표준을 사용하여 분명하다.

    그것은 메인테이너이 필드는 가입의 일부 또는있는 정확하게 볼 수 있도록 더 힘들어에도 테이블이 함께 암시 적 구문을 사용하여 주문 것에 참여한다. 이것은 쿼리를 수정하는 데 시간이 더 걸릴 수 있습니다 의미합니다. 나는 다시는 옛날 방식에 갔다, 그들은 명시 적으로 편안하게 느낄 수있는 시간이 걸렸하면, 아주 소수의 사람들이 조인 구문을 알고있다.

    나는 이러한 암시 적 조인을 사용하는 일부 사람들이 실제로 작업에 참여함으로써 자신의 쿼리에서 잘못된 결과를 얻는 방법을 이해하지 못하는 것으로 나타났습니다.

    솔직히, 당신이 18 년 전에 더 나은 방법으로 대체 된 코드의 다른 어떤 종류를 사용해야합니까?

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

    4.명시는 필터링을 할 수있는 곳에 절을 떠나, 의도 전달 합류했다. 그것은 청소기이며 표준이며, 당신이 그런 경우에만 함께 할 수 어렵 왼쪽 외부 또는 오른쪽 외부로 일을 할 수있다.

    명시는 필터링을 할 수있는 곳에 절을 떠나, 의도 전달 합류했다. 그것은 청소기이며 표준이며, 당신이 그런 경우에만 함께 할 수 어렵 왼쪽 외부 또는 오른쪽 외부로 일을 할 수있다.

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

    5.당신은 WHERE 두 개의 테이블을 결합하는 방법 사용할 수 없습니다. 당신이 생각 할 수있는 일은 작성하는 것입니다 :

    당신은 WHERE 두 개의 테이블을 결합하는 방법 사용할 수 없습니다. 당신이 생각 할 수있는 일은 작성하는 것입니다 :

    SELECT * FROM A, B
    WHERE ...
    

    여기에서 쉼표 작성하는 것과 같습니다

    SELECT *
    FROM A
    CROSS JOIN B
    WHERE ...
    

    당신은 쓰기시겠습니까? 아니오 -이 아니기 때문에 당신이 전혀 무엇을 의미. 당신은 십자가는 내부 조인하려면, 가입 싶지 않아요. 당신이 쉼표를 쓸 때, 당신은 CROSS이 가입 말을하는지 그의는 혼란.

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

    6.사실 당신은 종종 모두 "WHERE"와 "가입"해야합니다.

    사실 당신은 종종 모두 "WHERE"와 "가입"해야합니다.

    두 테이블로부터 데이터를 검색하는 데 사용되는 "JOIN"- 공통 칼럼의 값에 기초하여. 그런 다음 추가 필터에이 결과를 원하는 경우, WHERE 절을 사용합니다.

    예를 들어, 검색하는 왼쪽 테이블의 모든 행, 플러스 오른쪽 테이블에서 일치하는 행을 "왼쪽 가입". 하지만 그 특정 값 또는 가입의 일부가 아닌 다른 컬럼에서 레코드를 필터링하지 않습니다. 당신이 더 필터에이 결과를 원하는 경우에 따라서는 WHERE 절에 추가 필터를 지정합니다.

  7. from https://stackoverflow.com/questions/2241991/in-mysql-queries-why-use-join-instead-of-where by cc-by-sa and MIT license