인프런 커뮤니티 질문&답변

wjdgml3834님의 프로필 이미지
wjdgml3834

작성한 질문수

초보자를 위한 BigQuery(SQL) 입문

sql 실행순서와 서브쿼리 사용이유

해결된 질문

작성

·

290

·

수정됨

0

SQL 공부하다가 궁금한점이 생겼어요!

실행순서는 group by가 select 보다 먼저 실행되는 것으로 알고 있는데

select절에서 설정한 별칭을 왜 group by절에서 사용해도 되는걸까요?

현업에서는 팀마다 다르겠지만, 보통 어떻게 사용하시나요?

그리고 만약에 안된다면, 서브쿼리를 사용하시나요?

서브 쿼리를 사용하는 이유는 정확히 무엇인가요? 그리고 현업에서도 서브쿼리를 많이 사용하는지 궁금합니다!
(아직 서브쿼리가 정확히 왜 필요한지 모르겠어요. 자바스크립트의 클로저라는 개념과 비슷한 개념일까요?)

마지막으로 아래 쿼리가 결과는 똑같은데 어떤게 더 바람직한 작성 방법일까요?
(해당 강의는 4-6. 조건문(CASE WHEN, IF)입니다)

감사합니다 :)

SELECT
  new_type1,
  COUNT(DISTINCT id) AS cnt
FROM(
  SELECT 
      *,
      CASE 
          WHEN type1 IN ('Rock', 'Ground') OR type2 IN ('Rock', 'Ground') THEN 'Rock&Ground'
          ELSE type1
      END AS new_type1,
  FROM `basic.pokemon` 
)
GROUP BY
  new_type1
SELECT 
    CASE 
        WHEN type1 IN ('Rock', 'Ground') OR type2 IN ('Rock', 'Ground') THEN 'Rock&Ground'
        ELSE type1
    END AS new_type1,
    COUNT(DISTINCT id) AS cnt
FROM `basic.pokemon` 
GROUP BY
  new_type1

답변 1

0

카일스쿨님의 프로필 이미지
카일스쿨
지식공유자

안녕하세요.

우선 쿼리 실행 순서는 FROM - WHERE - GROUP BY - HAVING - SELECT 순서로 진행됩니다. 이런 경우라면 SELECT에서 Alias를 걸었던 컬럼을 GROUP BY에서 사용하지 못하는 것이 일반적입니다.

그러나 BigQuery에선 이런 경우에 SELECT의 Alias를 인식해서 GROUP BY에도 사용할 수 있도록 해주고 있어요. 과거엔 BigQuery도 SELECT Alias가 안되다가 기능이 생겼어요. 그래서 빅쿼리에선 해당 경우에도 실행이 됩니다만 실행 순서는 GROUP BY가 더 빠르다고 알고 계시면 좋을 것 같아요

 

아래 쿼리는 목적에 따라 다를 것 같아요. 1회성으로 new_type1이랑 집계만 하면 후자 쿼리가 더 좋을 수 있는데, 이 쿼리 결과를 가지고 다른 곳에서 많이 사용한다고 하면 전자가 더 좋을 수도 있지요. 사용 목적에 따라 다른 판단을 할 것 같네요.

 

서브 쿼리는 다양한 목적으로 사용하는데, 한번 더 데이터를 전처리해야 하는 경우가 있습니다. 한번 더 데이터를 가공하고 필터링할 때 사용할 수 있습니다. 서브 쿼리를 사용하냐 안하냐는 상황에 따라 다릅니다. 지금 수강하시는 강의는 쿼리가 다 짧고 JOIN이 없어서 서브 쿼리의 필요성을 느끼기 어려울 수 있으나 JOIN을 배우고 현업으로 갈수록 복잡한 구조에서 데이터 필터링을 할 때 서브 쿼리를 사용하기도 합니다(그 외에 가독성 목적도 있고 목적이 다양해요)

wjdgml3834님의 프로필 이미지
wjdgml3834
질문자

답변 감사합니다!
서브쿼리에 대해서 조금 더 이해할 수 있는 것 같아요

그렇다면 상황마다 다르겠지만, 선생님의 경우에는 빅쿼리나 mysql에서 alias를 group by가 인지하는 기능이 지원 된다면 실행순서에 조금 어긋나더라도 사용하시는 편이실까요? (가독성을 위해서?)

카일스쿨님의 프로필 이미지
카일스쿨
지식공유자

BigQuery에서 select alias를 인식하지 않다가 불편하니까 이게 가능하도록 만든 기능이라(GROUP BY ALL도 비슷한 케이스) 안 쓸 이유는 없을 것 같고, select alias를 쓴다고 해서 실행 순서가 달라지진 않습니다. 내부적으로 동작하는 것은 동일할거에요. 우리가 작성한 쿼리가 실행 순서를 바꿀 수는 없어요.

그리고 현업에선 이런 구분에 대해서 엄청 크게 고민하진 않는 것 같네요. 크게 중요하지 않은 문제 같네요(데이터 웨어하우스를 사용하는 입장에선) 가독성 파트를 보시면 더 이해가 되실 것 같습니다!

wjdgml3834님의 프로필 이미지
wjdgml3834
질문자

알겠습니다! 감사합니다

 

wjdgml3834님의 프로필 이미지
wjdgml3834

작성한 질문수

질문하기