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





