✏️ SQLD

[SQLD] GROUP BY절, 집계함수, 제약사항

haeriyouu 2025. 3. 1. 16:54

📌 GROUP BY

-- 집계함수와 GROUP BY 
SELECT GROUP_NAME FROM artist GROUP BY GROUP_NAME;
SELECT GROUP_NAME, 
	COUNT(*),
	ROUND(AVG(HEIGHT),2),
	MAX(HEIGHT),
	MIN(HEIGHT),
	SUM(HEIGHT)
FROM artist GROUP BY GROUP_NAME;

SELECT GROUP_NAME, BIRTH_YEAR,
	COUNT(*),
	ROUND(AVG(HEIGHT),2),
	MAX(HEIGHT),
	MIN(HEIGHT),
	SUM(HEIGHT)
FROM artist GROUP BY GROUP_NAME, BIRTH_YEAR;

-- GROUP BY는 DISTINCT와 같은 결과를 낸다
SELECT GROUP_NAME, BIRTH_YEAR FROM artist GROUP BY GROUP_NAME, BIRTH_YEAR;
SELECT DISTINCT GROUP_NAME, BIRTH_YEAR FROM artist;

 

📌 집계함수

SELECT COUNT(*),
SUM(HEIGHT),
AVG(HEIGHT),
MAX(HEIGHT),
MIN(HEIGHT) FROM artist;

-- 집계함수는 함수 내부에 DISTINCT 사용 가능
SELECT COUNT(*), COUNT(GROUP_NAME),COUNT(DISTINCT GROUP_NAME) FROM artist;
SELECT DISTINCT GROUP_NAME FROM artist;

-- 집계함수의 NULL처리. 공집합일 때
 SELECT FOOT_SIZE FROM artist WHERE FOOT_SIZE IS NOT NULL;

SELECT COUNT(*) AS 전체행수
, COUNT(FOOT_SIZE) AS NULL제외행수
FROM artist;

-- NULL만 있을 때
SELECT FOOT_SIZE FROM artist WHERE FOOT_SIZE IS NULL;

SELECT COUNT(*) AS 전체행수,
	COUNT(FOOT_SIZE) AS NULL제외행수,
	SUM(FOOT_SIZE),
	AVG(FOOT_SIZE),
	MAX(FOOT_SIZE),
	MIN(FOOT_SIZE)
	FROM artist WHERE FOOT_SIZE IS NULL;

-- 공집합일때
SELECT * FROM artist WHERE 1=2; /* 1은 2가 아니므로 FALSE */

 

📌 제약사항

-- GROUP BY 제약사항
-- 그룹화하지도 집계하지도 않은 컬럼은 조회할 수 없음
SELECT NAME, GROUP_NAME, AVG(FOOT_SIZE) FROM artist GROUP BY GROUP_NAME; 
-- DBeaver 에서 빨간불이 뜬다.

🔎 문제 분석

- NAME: 일반 컬럼 (그룹화❌, 집계❌)

- GROUP_NAME: 그룹화된 컬럼

- AVG(FOOT_SIZE): 집계 함수 사용

🧐 NAME 컬럼이 문제가 되는 이유

🚨 GROUP BY의 제약사항 때문!

📌 규칙: SELECT 절에 포함된 컬럼은 1️⃣ 그룹화(Grouped)되었거나, 2️⃣ 집계(Aggregated)된 값이어야 한다!

  - GROUP_NAME ➡️ GROUP BY GROUP_NAME에서 그룹화 됨 ➡️ 가능 ✅

  - AVG(FOOT_SIZE) ➡️ AVG() 함수로 집계 됨 ➡️ 가능 ✅

  - NAME ➡️ 그룹화도 안 되고, 집계도 안됨 ➡️ 오류 발생 🚨

 

💡 예시

- 각 그룹(GROUP_NAME)에는 여러 명(NAME)이 존재할 수 있다. 그러면 한개의 그룹에 여러 개의 NAME이 존재하는데, 이 중 어떤 NAME을 출력해야 할지 MySQL이 결정할 수 없다!