해결된 질문
작성
·
138
답변 1
0
안녕하세요!
4-5 연습문제 4번에서 서브쿼리에 *을 꼭 써야하는 이유는 서브쿼리 바깥에 있는 FROM 절 입장에선 서브쿼리가 일종의 테이블처럼 인식합니다.
SELECT
day_of_week,
COUNT(DISTINCT id) AS battle_cnt
FROM (
SELECT
*,
EXTRACT(DAYOFWEEK FROM battle_date) AS day_of_week
FROM `basic.battle`
)
GROUP BY
day_of_week
ORDER BY
day_of_week
위 쿼리에 서브 쿼리인
SELECT
*,
EXTRACT(DAYOFWEEK FROM battle_date) AS day_of_week
FROM `basic.battle`
위 쿼리를 실행해보면 다음과 같은 결과가 나타납니다
위에 결과에서 아래 쿼리를 실행하는 것으로 볼 수 있습니다
SELECT
day_of_week,
COUNT(DISTINCT id) AS battle_cnt
FROM 위 결과 테이블
GROUP BY
day_of_week
ORDER BY
day_of_week
만약 서브 쿼리에서 *을 제외했으면 아래와 같은 결과가 나타납니다
SELECT
EXTRACT(DAYOFWEEK FROM battle_date) AS day_of_week
FROM `basic.battle`
즉, day_of_week 밖에 없는 데이터인거죠
그래서 아래 쿼리를 실행할 때, id가 없기 때문에 Unrecognized name(데이터에 해당 컬럼이 없다) 오류가 발생하는 것입니다
SELECT
day_of_week,
COUNT(DISTINCT id) AS battle_cnt
FROM 위 결과 테이블
GROUP BY
day_of_week
ORDER BY
day_of_week
그렇다면 여기서 COUNT(DISTINCT *)도 가능한가? DISTINCT를 할 때는 구체적인 컬럼을 명시해야 하기 때문에 실행이 안됩니다
그럼 COUNT(*)도 가능한가? 실행은 되지만 단순히 Row 수만 COUNT하게 됩니다. 지금 데이터에선 답이 같을 수 있지만, id가 중복으로 존재하는 테이블에서는 COUNT(*)은 의도와 다른 값이 나타날 수 있습니다. 그래서 id를 DISTINCT해서 고유값만 COUNT한 것이에요
정리하면, 서브 쿼리에 있는 컬럼이 있어야 바깥에서 불러올 수 있습니다. 일종의 테이블이라고 생각하시면 이해가 쉬울 것 같네요