[MySQL] != 처럼 JOIN 하기
2021. 12. 29. 18:31ㆍ개인 공부 공간/SQL
최근 두 테이블 JOIN 시 아래 벤다이어그램과 같은 결과가 나오도록 쿼리문을 작성할 일이 있었다.
원래 어떻게 작성하면 위와 같은 결과가 나오는지 알고 있었는데.. 멍청하게도 JOIN ON 조건에 != 를 사용했다.
부끄럽지만 실수로 작성한 쿼리문을 공개하면 다음과 같다.
SELECT a.*, b.*
FROM table_a a
LEFT JOIN table_b b
ON a.key != b.key;
쿼리문 실행 후 아무리 기다려도 결과가 나오지 않아 이상함을 느낀 후 생각해보니 아주 잘못된 방식으로 쿼리문을 작성했음을 깨달았다.
위 쿼리문이 안되는 정확한 이유를 알기 위해 구글링 해보니 다음과 같은 이유로 위 쿼리문은 엄청난 연산 과정을 거친다고 한다.
LEFT JOIN이 table a의 1,000,000개 행 중 75%를 반환한다고 가정하고 일치 하지 않는 250,000개의 다른 행을 사용자의 의도대로 반환하지 않는다. 대신 곱 집합(Cartesian product 을 만들고 750,000개의 일치하는 행을 제거하려고 합니다. 따라서 6,000,000×1,000,000-750,000개의 행을 연산 하여 반환하려고 합니다.
쉽게 얘기하면 엄청나게 불필요한 연산 과정이다.
위 벤다이어그램과 같은 결과를 얻기 위해서는 아래와 같이 쿼리문을 작성해야 한다.
SELECT a.*, b.*
FROM table_a a
LEFT JOIN table_b b
ON a.key = b.key
WHERE b.key IS NULL;
References
'개인 공부 공간 > SQL' 카테고리의 다른 글
[MySQL] GROUP_CONCAT (0) | 2022.01.24 |
---|---|
[MySQL] WITH AS (0) | 2022.01.10 |
[MySQL] 6자리 생년월일을 나이로 변환하기 (0) | 2021.12.13 |
[MySQL] type 변환 함수(CAST & CONVERT)와 type의 종류 (0) | 2021.12.12 |
[MySQL] LIKE와 REGEXP (0) | 2021.12.10 |