*데이터 캠프의 컨텐츠 내용을 일부만 담았습니다.
*저작권 문제 시 댓글을 남겨주시길 바랍니다.
서브쿼리란?
SELECT, FROM, WHERE 등등에 또 다른 (SELECT ~ FROM ~)의 구조가 들어가는 것
* WHERE의 서브쿼리는 조건이라 생각하니 잘 푼 듯 하다. 생략!
오답노트1: GROUP BY를 SELECT의 서브쿼리로 표현하기
GROUP BY를 사용하는 방식 - country를 GROUP BY로 묶기 위해 cities 테이블 기준으로(FROM) INNER JOIN을 사용했다.
이후 GROUP BY로 country를 묶고 SELECT에서 COUNT를 사용하여 country안의 cities 테이블의 cities의 수를 계산한다.
마지막으로 정렬을 해서 9줄 만 나오게 설정했다.
*ORDER BY는 SELECT보다 마지막이다.
서브쿼리를 사용하는 방식 - countries 테이블 기준으로(FROM) 바로 SELECT로 넘어간다.
countries.name과 country에 있는 cities수를 구해야 하는데
cities가 기준인 서브쿼리에서 COUNT를 구하면 된다. 같은 서브쿼리에서 조건으로 code를 맞춰준다.
ORDER BY 이후는 같다.
*이 상황에서 서브쿼리를 쓰는 게 더 효율적이어서 이 예제를 준 것 같다.
좀 더 생각을 해봤을 때도 처음 쿼리에서 결과물이 countries 기준인데
cities 테이블에서 INNER JOIN을 먼저하고 countries로 GROUP BY를 쓰는 건 다소 비효율적이다.
오답노트2: FROM의 서브쿼리 진행과정 생각하기
FROM에서 countries 테이블과 서브쿼리를 부른다.
이때 서브쿼리는 country code별 language의 수를 정리한 테이블,subquery이다.
country 테이블과 서브쿼리의 code를 맞춰준 후
이후 countries의 local_name과 subquery의 lang_num을 부른다.(이 부분이 좀 헷갈렸다. 그냥 불러오는 것 뿐인데...)
이때 local_name을 그대로 쓴 이유는 메인쿼리(서브쿼리가 아닌 구조)에서 FROM에 country 테이블을 썼기 때문이다.
FROM에서 여러 테이블을 불러올 땐 그저 ','를 사용하면 된다.
오답노트 3: INNER JOIN 후 ALIAS
FROM에 있는 서브쿼리에서 INNER JOIN 후 SELECT에 필드명을 쓸 때 ALIAS를 헷갈렸다.
원래 name, continent 는 countries 테이블에, inflation_rate는 economies에 있는 필드명인데
INNER JOIN을 거치고 나서는 따로 ALIAS를 하지 않는다.
이미 INNER JOIN으로 합쳐졌기 때문이다.
'SQL' 카테고리의 다른 글
[SQL, 데이터 캠프] CASE문과 데이터 캠프 예제쿼리 풀이 -1편 (0) | 2020.07.04 |
---|---|
[SQL, 데이터캠프] 서브쿼리 오답노트 2편 (0) | 2020.06.27 |
[SQL] 오랫만에 SQL을 봤을 때 보면 좋을 것들 (0) | 2020.06.27 |
[SQL, 데이터 캠프]Left Join, Right Join, Full Join, Cross Join (0) | 2020.03.10 |
[SQL, 데이터 캠프] Intersect, Except, Semi Join, Anti Join (0) | 2020.03.08 |
댓글