inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

해결된 질문

516

wjdgml3834

작성한 질문수 6

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

sql bigquery 데이터-리터러시

답변 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을 배우고 현업으로 갈수록 복잡한 구조에서 데이터 필터링을 할 때 서브 쿼리를 사용하기도 합니다(그 외에 가독성 목적도 있고 목적이 다양해요)

0

wjdgml3834

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

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

1

카일스쿨

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

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

0

wjdgml3834

알겠습니다! 감사합니다

 

vs code

0

51

2

수업자료 다운

0

49

2

쿼리 화면 문의

0

72

2

4-5. 3번 문제 질

0

66

2

JOIN 1번 문제

1

76

2

battle 테이블 생성 시 생성 오류

0

69

1

5-6. 4번 문제 WHERE 조건의 위치 문의

0

65

2

5-6. 연습문제 4번, type2에 대해서는 고려하지 않아도 될까요?

1

71

2

battle table 오류

0

69

2

location IS NOT NULL 을 굳이 안 써도 되지 않나요?

0

62

2

12강 집계 함수

0

49

1

2-6. 연습 문제 1~3번

0

50

1

안녕하세요! 11번 문제 query문에 관해 질문드립니다

0

51

1

2-6 #2 WHERE vs. HAVING절 사용 여부 차이

0

67

1

섹션 별 퀴즈

0

67

1

espanso 설치 완료 후 프로그램 실행 문제

0

104

2

Syntax에러

0

83

2

4-5. 1번 문제 TIMESTAMP 관련 질문

0

89

2

시각화 도구 사용

0

110

2

11번 문제 GROUP BY 사용하는 이유

0

99

1

big query 쿼리 결과 컬럼 폭

0

108

3

battle 스키마 조건 복사 파일이 열리지 않아요.

0

130

1

6-5 데이터 검증 결과 예시문제

0

79

2

battle 스키마 조건 복사붙여넣기용 자료

0

115

2