COUNT 기준 비교
같은 LEFT JOIN 결과라도 COUNT 기준이 다르면 주문 수가 달라집니다

LEFT JOIN은 주문이 없는 사용자도 결과 행에 남깁니다. 그래서 COUNT(*)는 그 행을 세서 1이 되고, COUNT(o.order_id)NULL을 제외해 0이 됩니다.

공통 전제: LEFT JOIN 결과
행은 유지되지만 주문 쪽 값은 비어 있을 수 있음
username | order_id
---------|---------
김철수   | 101
김철수   | 102
이영희   | 103
박민수   | NULL
왜 헷갈리나?

박민수 행은 살아 있습니다. 그래서 행 수를 세면 1로 보이지만, 주문 ID 값 자체는 없어서 값 개수는 0입니다.

여기서 갈리는 기준

*는 결과 행을 세고, o.order_id는 채워진 주문 ID만 셉니다.

행 수 기준
COUNT(*)
LEFT JOIN 뒤에 남은 결과 행을 그대로 집계합니다.
박민수도 1행이므로 주문이 없는 사용자까지 1로 잡힙니다.
username | order_count
---------|------------
김철수   | 2
이영희   | 1
박민수   | 1
채워진 값 기준
COUNT(o.order_id)
NULL이 아닌 주문 ID만 세므로 실제 주문 수가 남습니다.
박민수의 order_id는 NULL이므로 집계에서 빠져서 0이 됩니다.
username | order_count
---------|------------
김철수   | 2
이영희   | 1
박민수   | 0