무료 동영상 강의 https://youtu.be/GLPAVcYwD7c

GROUP BY 사용 규칙


GROUP BY 사용 규칙

반드시 외우고, GROUP BY를 사용할 때는 위 내용을 항상 떠올리기 바란다.

MySQL은 버젼이나 SQL_MODE에 따라 GROUP BY에 사용하지 않은 컬럼을 집계함수 없이 사용 가능한 경우가 있다. 이러한 처리는 데이터 정확성에 문제가 발생할 수 있으므로 주의해야 한다.

-- [SQL-5-3-1]
-- GROUP BY를 잘 못 사용한 SQL
-- GROUP BY에는 ShopId만 정의함
-- OrdAmt를 SELECT절에서 집계함수 없이 사용
-- 하지만 MySQL은 SQL_MODE 설정에 따라 아래와 같은 SQL의 실행을 허용한다.
-- 대부분의 다른 DBMS는 허용하지 않는다.
SELECT  T1.ShopId
        ,T1.OrdAmt -- > GROUP BY에 없는 컬럼이므로 사용할 수 없다.
FROM    startdb.Ord T1
WHERE   T1.OrdDtm >= STR_TO_DATE('20220101','%Y%m%d')
AND     T1.OrdDtm <  STR_TO_DATE('20220103','%Y%m%d')
AND     T1.ShopId IN ('S012','S212')
GROUP BY T1.ShopId;

위 SQL에서 OrdAmt는 반드시 아래와 같이 SUM과 같은 집계함수로 처리해야 한다.

	-- [SQL-5-3-2]
	SELECT  T1.ShopId
	        ,SUM(T1.OrdAmt) OrdAmt -- > GROUP BY에 없는 컬럼은 반드시 집계함수 처리
	FROM    startdb.Ord T1
	WHERE   T1.OrdDtm >= STR_TO_DATE('20220101','%Y%m%d')
	AND     T1.OrdDtm <  STR_TO_DATE('20220103','%Y%m%d')
	AND     T1.ShopId IN ('S012','S212')
	GROUP BY T1.ShopId;
	
	ShopId  OrdAmt     
------  ---------  
S012    16500.000  
S212    8500.000 

Tip. MySQL의 SQL_MODE MySQL의 SQL_MODE에 ONLY_FULL_GROUP_BY를 추가하면 GROUP BY를 제외한 항목을 집계함수 없이 SELECT 절에 사용하는 실수를 막을 수 있다.

-- 참고만 하고, 필요한 경우만 변경합니다.
SELECT @@SQL_MODE;
-- ONLY_FULL_GROUP_BY추가:
SET SESSION SQL_MODE = CONCAT('ONLY_FULL_GROUP_BY,',@@SQL_MODE);
-- 원상복구:
SET SESSION SQL_MODE = REPLACE(@@SQL_MODE,'ONLY_FULL_GROUP_BY,','');

BOOSTER QUIZ