반응형
코드잇 SQL 강의 Topic 1-6. 09 FROM 절에 있는 서브쿼리 中
# 1
SELECT
SUBSTRING(address, 1, 2)
FROM review AS r LEFT OUTER JOIN `member` AS m
ON r.mem_id = m.id
GROUP BY SUBSTRING(address, 1, 2)
HAVING SUBSTRING(address, 1, 2) IS NOT NULL
AND SUBSTRING(address, 1, 2) != '안드';
# 2
SELECT
SUBSTRING(address, 1, 2) AS region
FROM review AS r LEFT OUTER JOIN `member` AS m
ON r.mem_id = m.id
GROUP BY SUBSTRING(address, 1, 2)
HAVING region IS NOT NULL
AND region != '안드';
# 3
SELECT
SUBSTRING(address, 1, 2) as region,
COUNT(*) AS review_count
FROM review AS r LEFT OUTER JOIN `member` AS m
ON r.mem_id = m.id
GROUP BY SUBSTRING(address, 1, 2)
HAVING SUBSTRING(region, 1, 2) IS NOT NULL
AND SUBSTRING(region, 1, 2) != '안드';
2, 3번은 정상적으로 실행 됨.
1번처럼 HAVING 절에서 alias인 region을 쓰지 않고 원래 구문인 SUBSTRING(address, 1, 2) IS NOT NULL 이라고 쓰니 오류가 난다.
이유가 무엇일까?
구글에 관련 질문을 검색해보니
There is no need to use HAVING. Try WHERE instead
라고 나온다.
그래서 HAVING 대신 WHERE로 작성을 해 보았다.
# 4
SELECT
SUBSTRING(address, 1, 2) as region,
COUNT(*) AS review_count
FROM review AS r LEFT OUTER JOIN `member` AS m
ON r.mem_id = m.id
WHERE SUBSTRING(address, 1, 2) IS NOT NULL
AND SUBSTRING(address, 1, 2) != '안드'
GROUP BY SUBSTRING(address, 1, 2);
결과는 2, 3번과 마찬가지로 정상적으로 실행된다.
그렇다면 왜 1번처럼 HAVING절에 AS(alias)를 안쓰고 쿼리를 작성하면 실행 오류가 나는가??
그런데. 강좌중에서 alias를 붙이고 SELECT 문에서 바로 쓸 수 없는 이유를 알아봤는데,
그 때의 정답은 WHERE 문에서 AS를 쓰고 싶으면 서브쿼리문을 하나 더 생성해야 하는 것이었다.
위 문장으로 생각해보면,
AS 없이 식으로 직접 쓸 때에는 WHERE 문에서 조건 그대로 가져다 쓰면 되기 때문에 HAVING이 필요없고,
반면 HAVING은 서브쿼리 없이 AS를 쓰면서 그룹 조건식을 표현하는 용도로 만들어진 것이기에,
용도에 맞게 AS를 사용해야 하는 것인가??
그렇다면 HAVING절을 사용할 때 조회하는 컬럼 중 컬럼 식이 존재한다면
무조건 AS를 정의하고 사용해야 하는 것인가??
아직 답은 잘 모르겠다.
반응형
'기타' 카테고리의 다른 글
개발 블로그 선택하기: Tistory vs GitHub Blog vs Velog (0) | 2023.06.08 |
---|---|
git bash에서 git push -u origin main 입력 후 멈춤 현상 해결법 (0) | 2021.08.25 |
git 로컬 저장소(working directory) 완전 제거하는법 (0) | 2021.08.24 |
SQL 코딩 테스트 사이트 (0) | 2021.08.10 |
코딩 관련 유용한 사이트 모음 (0) | 2021.08.01 |