출처: Data Camp(https://www.datacamp.com/)
저작물의 모든 것을 공개하지 않았으며
저작권 문제 시 댓글을 달아주시면 조치를 취하겠습니다.
바로가기 링크:
INNER JOIN과 LEFT JOIN의 비교 INNER JOIN: id가 일치하는 행만 반환한다. LEFT JOIN: id가 일치하는 행은 left, right table L_val, R_val을 모두 넣은 후 left_table에만 있는 id옆에 L_val을 넣고 R_val은 모두 Null 처리한다. |
LEFT JOIN의 구조(아래 코드 분석) SELECT col1, col2 ... FROM 테이블1 as t1 LEFT JOIN 테이블2 as t2 ON t1.col1 = t2.col1'(두 테이블을 엮을 수 있는 칼럼들) |
해석: cities 테이블과 countries 테이블을 left join한다. on으로 country code를 맞춰준다.
내가 했던 실수는 이름이 겹치지 않는 칼럼명에도 c1.name, c2.name처럼 테이블 구분을 하려했던 것이다.
위 SQL 쿼리의 결과 중 일부를 가져왔다.
c1.name인 city칼럼에는 모든 값이 채워져있지만
c2.name인 country칼럼에는 null값이 보인다.
(잘 이해가 안되면 위쪽 Inner Join과 Left Join의 차이를 나타낸 그림을 보면된다.)
RIGHT JOIN의 구조 SELECT col1, col2 ... FROM 테이블1 as t1 RIGHT JOIN 테이블2 as t2 ON t1.col1 = t2.col1'(두 테이블을 엮을 수 있는 칼럼들)
*원리 자체는 아래 그림을 참고한다. |
id가 일치하는 행은 left, right table의 L_val, R_val을 모두 넣은 후
right_table에만 있는 id옆에 R_val을 넣고 L_val은 모두 Null 처리한다.
해석: 위쪽 그림의 id의 역할은 칼럼명.code가 모두 맡고 있다.
languages 테이블과 countries 테이블과 right join을 한다. 이후 이 결과값과 cities테이블을 right join한다.
빨간 밑줄을 친 이유는 right join을 여러 번 할 때 .code로 어떻게 테이블을 엮어가는 지 맥을 잡고 싶었기 때문이다.
FULL JOIN의 구조
SELECT col1, col2 ... FROM 테이블1 as t1 FULL JOIN 테이블2 as t2 USING (col1)
*col1는 두 테이블을 엮을 수 있는 칼럼이며, 두 테이블에서 이름이 동일하다. *원리 자체는 아래 그림을 참고한다. |
id가 일치하는 행은 L_id, R_id, L_val, R_val가 모두 들어간다.
left table에만 있다면 R_id, R_val은 Null이고
right table에만 있다면 L_id, L_val은 Null이다.
*Left, Right Join과 다르게 id칼럼이 구분되어 그려졌다.(실제로는 합쳐져서 나온다.)
(중요하지 않음)이 예시에서 주의해야 할 점은, FULL JOIN과 WHERE문의 실행순서가 다른 게 아니라는 것이다.
stack overflow에 알아보니, join은 from문에 속하기 때문에 가장 먼저 실행된다고 한다.
해석ex) 둘째 행은 code가 countries테이블에는 있지만 currencies테이블에는 없어서 화폐단위가 null이다.
null의 갯수에 따라 left, right테이블 중 정보가 많은 테이블이 무엇인 지 알 수 있다.
CROSS JOIN의 구조와 특징 SELECT col1, col2 ... FROM 테이블1 as t1 CROSS JOIN 테이블2 as t2
*카르테시안 곱이 이뤄진다(아래 설명 참조) |
모든 id를 조합해서 만든 행이 만들어진다.
카르테시안 곱이 이루어진다.
ex) table1에 n행, table2에 m행이 있다면
두 테이블을 cross join했을 때 n x m행이 나온다.
+추가자료(잠시 실수한 내용 복습)
WHERE문 칼럼명 LIKE '와일드카드':
-와일드카드(%, _ )는 LIKE와 같이 쓰인다.
- LIKE는 WHER문 칼럼뒤에 온다.
+심화예제 : LEFT JOIN을 이용한 예제인데 주의할 점을 몇 가지 짚고자 한다.
1) p.year : 다른 테이블에도 year가 있었기 때문에 헷갈렸다. LEFT JOIN을 한 테이블의 year를 사용하였다.(가장 관련성이 있어서)
2) ORDER BY life_Exp LIMIT 5: 행의 갯수를 life_exp 하위 5개만 출력한다. (order by가 없다면 그냥 행 갯수 5개반 반환하는게 limit 5이다.)
'SQL' 카테고리의 다른 글
[SQL, 데이터 캠프] CASE문과 데이터 캠프 예제쿼리 풀이 -1편 (0) | 2020.07.04 |
---|---|
[SQL, 데이터캠프] 서브쿼리 오답노트 2편 (0) | 2020.06.27 |
[SQL, 데이터캠프] 서브쿼리 오답노트 1편 (0) | 2020.06.27 |
[SQL] 오랫만에 SQL을 봤을 때 보면 좋을 것들 (0) | 2020.06.27 |
[SQL, 데이터 캠프] Intersect, Except, Semi Join, Anti Join (0) | 2020.03.08 |
댓글