-
[SW 정글 111일차] 나만의 무기 19일차 (쌓아 놓은 궁금증 해결)기타/SW 사관학교 정글 2021. 11. 22. 00:55
<2021. 11. 17 멘토링 질문 해결>
Q. 1) SELECT * FROM Challenge, Alien_graduated WHERE Challenge.id = Alien_graduated.Challenge_id;
2) SELECT * FROM Challenge JOIN Alien_graduated ON Challenge.id = Alien_graduated.Challenge_id;
2개 테이블을 합치는 것은 JOIN을 사용하는 것으로만 알고 있었는데 1번 쿼리문으로도 가능한 것을 11월 16일(화)에확인했다. 위 2개의 쿼리문이 차이가 있을까? (성능, 혹은 내가 모르는 무언가?)
A. 멘토링 당시 했던 질문으로 mysql documentation에서 select와 join에 대해서 알아보라고 해주셨다.
FROM 뒤에 오는 것은 table references라고하는 clause이다.
- INNER JOIN and , (comma) are semantically equivalent in the absence of a join condition: both produce a Cartesian product between the specified tables (that is, each and every row in the first table is joined to each and every row in the second table).
- However, the precedence of the comma operator is less than that of INNER JOIN, CROSS JOIN, LEFT JOIN, and so on. If you mix comma joins with the other join types when there is a join condition, an error of the form Unknown column 'col_name' in 'on clause' may occur.
- JOIN has higher precedence than the comma operator (,)
즉, 위 2개의 쿼리문은 차이는 없고 동등한 형식이지만 comma operator보다는 join을 써주는 것을 권장하는 것 같다.
[참고: https://dev.mysql.com/doc/refman/8.0/en/join.html]
<SELECT문의 처리순서는?>
<JOIN의 종류>
JOIN의 종류에는 크게 INNER JOIN과 OUTER JOIN이 있다.
흔히 말하는 JOIN이라고 하는 것은 INNER JOIN을 의미한다.
먼저, INNER JOIN은 ON에 쓰인 조건에 성립한 2개의 테이블 row를 합친 것이다.
SELECT <열 목록> FROM <첫 번째 테이블> INNER JOIN <두 번째 테이블> ON <조인될 조건>
위 형식에서 INNER JOIN을 그냥 JOIN이라고만 써도 INNER JOIN으로 인식한다.
밴 다이어그램으로 표현하면 ON으로 맺어진 교집합 부분을 구하는 것으로 생각했다.
다음으로 OUTER JOIN이다.
OUTER JOIN은 조인의 조건(ON 절)에 만족되지 않는 행까지도 포함시키는 것이다.
OUTER JOIN에는 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN이 있다.
SELECT <열 목록> FROM <첫 번째 테이블(LEFT 테이블)> <LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블 (RIGHT 테이블)> ON <조인될 조건>
OUTER JOIN과 함께 WHERE 절을 사용하면 여집합도 구할 수 있다.
예를 들어, 유저정보 테이블과 구매내역 테이블을 LEFT OUTER JOIN하면 구매한 유저 뿐만 아니라 한 번도 구매하지 않은 유저도 view로 나타낼 수 있다.
여기서, where 절로 '구매물품 IS NULL'을 쓰면 한 번도 구매하지 않은 유저 정보를 view로 볼 수 있다.
이외에도 한쪽 테이블의 모든 행들과 다른 쪽 테이블의 모든 행들을 조인시키는 CROSS JOIN (카티션곱과 같은 동작을 한다고 생각하면 편할 듯, ON절은 사용불가)이 있다.
<SELECT 문을 빠르게 해주는 INDEX?!>
<DB Lock이란?>
<Trigger(트리거) 사용기>
'기타 > SW 사관학교 정글' 카테고리의 다른 글
[SW 정글 113일차] 나만의 무기 21일차 (기획 고민=∞) (0) 2021.11.24 [SW 정글 112일차] 나만의 무기 20일차 (프론트엔드 맛보다) (0) 2021.11.23 [SW 정글 110일차] 나만의 무기 18일차 (Pooling connection) (0) 2021.11.21 [SW 정글 109일차] 나만의 무기 17일차 (큰 변화를 가졌다) (0) 2021.11.20 [SW 정글 108일차] 나만의 무기 16일차 (Error: read ECONNRESET) (0) 2021.11.19