본문 바로가기
SQL

[SQL, 데이터캠프] 서브쿼리 오답노트 1편

by 다랭킴 2020. 6. 27.

 

*데이터 캠프의 컨텐츠 내용을 일부만 담았습니다.

*저작권 문제 시 댓글을 남겨주시길 바랍니다.

 

서브쿼리란?

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으로 합쳐졌기 때문이다.

 

 

댓글