안녕하세요.
테이블 조회시 조회된 row가 없으면 0을 표기하기 위해
아래와 같이 max 함수를 사용해서 처리하고자 하였습니다.
SELECT IFNULL(MAX(mail_sn),0)
FROM user_mail
WHERE account_id = 13
AND end_dt > NOW();
그런데
아래와 같이 group by 절을 추가하니 그대로 조회된 값이 보이지 않는데
왜 그런지 알 수 있을까요?
SELECT IFNULL(MAX(mail_sn),0)
FROM user_mail
WHERE account_id = 13
AND end_dt > NOW()
GROUP BY account_id;
GROUP BY 가 생략되면 전체에 대해 집계합니다.
전체 평균, 전체합계, 전체갯수 등
전체라는 기준으로 집계되며, 기준이 명확하고
조건을 만족하는 자료가 있건,없건 무조건 1행을 반환합니다.
GROUP BY 가 사용되면 그룹별 집계합니다.
조건을 만족하는 자료가 있으면 해당 자료기준으로 집계를 하지만
조건을 만족하는 자료가 없으면 집계 기준자료 자체가 없는거죠
따라서 자료가 없으면 결과도 없습니다. (0행)
여기서 1행이 나오는 것과 0행인것도 구별해야 합니다.
빈값이 나왔다고 표현하셨지만?
빈값(null, 1행)이 나온게 아니죠.
아무것도 안나온 것입니다.(無, 0행)
아무것도 안나오는 경우엔 ifnull 를 수행할 대상 조차 없는 것입니다.
위 쿼리에서는 이미 id 조건을 주셨으므로 Group By id 는 의미 없어 보입니다.