해결된 질문
작성
·
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을 배우고 현업으로 갈수록 복잡한 구조에서 데이터 필터링을 할 때 서브 쿼리를 사용하기도 합니다(그 외에 가독성 목적도 있고 목적이 다양해요)
BigQuery에서 select alias를 인식하지 않다가 불편하니까 이게 가능하도록 만든 기능이라(GROUP BY ALL도 비슷한 케이스) 안 쓸 이유는 없을 것 같고, select alias를 쓴다고 해서 실행 순서가 달라지진 않습니다. 내부적으로 동작하는 것은 동일할거에요. 우리가 작성한 쿼리가 실행 순서를 바꿀 수는 없어요.
그리고 현업에선 이런 구분에 대해서 엄청 크게 고민하진 않는 것 같네요. 크게 중요하지 않은 문제 같네요(데이터 웨어하우스를 사용하는 입장에선) 가독성 파트를 보시면 더 이해가 되실 것 같습니다!
답변 감사합니다!
서브쿼리에 대해서 조금 더 이해할 수 있는 것 같아요
그렇다면 상황마다 다르겠지만, 선생님의 경우에는 빅쿼리나 mysql에서 alias를 group by가 인지하는 기능이 지원 된다면 실행순서에 조금 어긋나더라도 사용하시는 편이실까요? (가독성을 위해서?)