해결된 질문
24.05.22 23:16 작성
·
152
·
수정됨
0
안녕하세요.
as로 명명하는 것에 관해 질문드립니다.
"2-5. 집계(GROUP BY + HAVING + SUM/COUNT)"에서 선생님께선 다음과 같이 쿼리를 작성해주셨는데요.
select
type1,
count(id) as cnt
from `basic.pokemon`
group by
type1
having
cnt >= 10
order by
cnt desc
count(id)를 cnt로 명명한 후, having과 order by에서 그 별명을 이용하여 간단히 입력하신 걸 이해했습니다.
여기서 sql에 익숙해지고자, 여러 시험을 해보았는데, 다음과 같은 쿼리도 같은 결과를 출력할 수 있었습니다.
select
type1,
count(type1) as cnt
from `basic.pokemon`
group by
type1
having
count(id) >= 10
order by
count(kor_name) desc
select 내의 count 괄호 내에는 type1 열을 불러 읽고,
having 내의 count 괄호 내에는 id 열을 불러 읽고,
order by 내의 count 괄호 내에는 kor_name 열을 불러 읽고,
as로 select 내의 count 함수를 따로 명명해주었지만 그 별명을 사용하지는 않았습니다.
즉, 각 count 함수의 변수를 모두 전혀 다른 것들을 불러 읽는 엉망진창(...)으로 만들어 보았는데요. 그럼에도 불구하고, 문제 없이 같은 결과가 출력된다는 것은, as는 입력 간편화를 위해 이용하는 것이니, 명명을 하더라도 이용하지 않아도 출력상 문제는 없다고 이해해도 될까요?
그리고 count 내 변수를 랜덤하게 지정해도 같은 결과가 나옴에도 불구하고, id 열을 변수로 쓰는 이유는, 실무에서는 값이 누락되어 있을 가능성이 있을 열이 아닌, 하나의 row마다 반드시 값이 주어지는 열(=id 열)을 쓰는 것이 잘못된 집계를 피하기 위함이라고 이해해도 될까요?
글이 길어졌지만, 답변을 기다립니다.
미리 감사합니다.
답변 2
0
0
2024. 05. 23. 00:05
안녕하세요! 좋은 질문 주셔서 감사합니다.
as를 이용한 별칭 사용 관련 내용
as를 이용해 별칭을 지정하는 것은 주로 가독성을 높이고 코드를 간결하게 만들기 위해 사용했어요. 별칭을 지정했다고 반드시 써야하는 것은 아닙니다
다만, 일관성 있게 코드를 작성하는 것이 좋은 습관이며, 다른 사람이 코드를 볼 때 혼란을 줄일 수 있습니다.
지금 쿼리는 단순하지만 나중에 쿼리가 엄청 길어진다면 HAVING에 같은 값을 COUNT()로 쓴다면 변경해야 하는 부분이 여러개가 생길거에요. 변경할 포인트를 최소화하는 것이 쿼리를 잘 작성하는 것이라 생각해
SQL 실행 순서에서 HAVING, ORDER BY는 꽤 후순위입니다. 그래서 SELECT의 집계 함수를 한 후의 별칭을 알고 있어서 이 때는 별칭을 사용하는 편입니다
count 함수 내 변수 선택에 대해:
count 함수는 선택한 열의 값이 NULL이 아닌 레코드 수를 반환하고, 특정 열에 NULL 값이 있으면 레코드의 수를 반환하지 않습니다
따라서 보통 기본 키(Primary Key)나 NOT NULL 제약 조건이 있는 열을 사용하여 count를 합니다. 많은 경우 id 열이 이에 해당되고, 저도 그래서 id를 사용했습니다. 현재 사용하는 데이터엔 NULL 값이 있는 컬럼이 많이 없어서 같은 결과가 나올 가능성이 큽니다.
그래서 지금 count(type1), count(id), count(kor_name)을 해도 동일한 결과가 나옵니다. 실무에서 쿼리를 이렇게 작성하면 1에 말씀드린 것처럼 추후에 쿼리를 수정할 때 변경할 포인트가 많고 헷갈릴거라서 일관되게 쿼리를 작성하도록 가이드할 것 같네요
추가 질문이 있으시면 언제든 말씀해 주세요!