📌 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이 결정할 수 없다!
'✏️ SQLD' 카테고리의 다른 글
[SQLD] WHERE절과 HAVING절의 차이 (0) | 2025.03.01 |
---|---|
[SQLD] HAVING절 (0) | 2025.03.01 |
[SQLD] WHERE 절: IN, BETWEEN, LIKE, IS NULL (0) | 2025.03.01 |
[SQLD] WHERE 절: 논리 연산자, 연산자 우선순위 (0) | 2025.02.28 |
[SQLD] 합성 연산자 (0) | 2025.02.28 |