Group by 란?
Group by: 데이터를 조회할 때 그룹으로 묶어서 조회해주는 쿼리
SELECT [컬럼] FROM [테이블]
GROUP BY [그룹화할 컬럼];
정의만 봐서는 Group by가 무엇인지 이해가 잘 되지 않을 것이다. 예시를 통해서 알아보자.
아래 사진 처럼 구성된 테이블에서 age컬럼의 데이터만 뽑아보자.
이번에는 위에 사용했던 쿼리문에 group by절을 붙여서 사용해보자.
SELECT age FROM user
GROUP BY age;
차이점이 보이는가? 중복 값이 제거되었다. age 값을 기준으로 그룹을 만들어 버렸기 때문에 중복된 데이터가 제거가 된 것이다. 그렇다면 중복을 제거해주는 distinct를 쓴 것과 똑같은 결과 값을 가지게 된다.
그럼 Group by 말고 간단하게 distinct를 쓰면 되는 거 아닌가요??
Group by를 어떻게 활용하냐에 따라서 결과 값을 달리 가질 수 있다. Group by는 집합 연산에 해당하는데, 이때 Group by는 다른 집한 연산과 같이하여 활용할 수 있다.
또 다른 집합 연산
HAVING
Having: 그룹화한 결과에 조건을 걸 수 있다. WHERE과 비슷하다 생각하면 이해가 쉽다.
SELECT [컬럼] FROM [테이블]
GROUP BY [그룹화할 컬럼]
HAVING [조건식];
그룹화 된 컬럼에 나이가 11살 이상일 때만 조건을 걸어 데이터를 뽑아냈다.
COUNT()
Count(): 레코드의 개수를 헤어릴 때 사용한다.
SELECT COUNT(컬럼) FROM [테이블]
(필요에 따라 선택)GROUP BY [그룹화할 컬럼];
위의 사진처럼 Group by를 사용하면 age의 개수를 그룹화하여 데이터를 보여준다. 만약에 Group by를 사용하지 않는다면? 밑의 사진처럼 컬럼의 개수를 세어 데이터를 보여준다. 이 차이점을 통해서 Group by가 왜 필요한 것인지 이해가 될 것이다.
위에서 disinct가 group by를 썼을 때랑 같은 결과 값을 보여준다고 했다. 그렇다면 disinct를 사용하면 Group by와 같은 결과 값을 가질까?
답은 아니다. disinct는 중복 값을 제거할 뿐이다. count함수를 통해 개수를 센다면 그렇게 뽑힌 데이터에 중복값이 있을리가 ..?
Group by는 그룹화를 해줌으로 써 중복값이 제거된 것처럼 보였던 것이지 실제 활용도는 데이터를 그룹화하는 정의에 있다.
age의 개수를 세었을 때 18살과 10살만 존재했으므로 이 두개를 그룹화 하여 개수를 뽑아내 보여준 것!
SUM()
SUM(): 레코드의 합을 구한다.
SELECT SUM(컬럼) FROM [테이블];
AVG()
AVG(): 레코드의 평균값을 계산해준다.
SELECT AVG(컬럼) FROM [테이블];
MAX(),MIN()
MAX(), MIN(): 레코드의 최대값, 최소값을 구한다.
SELECT MAX(컬럼) FROM [테이블];
SELECT MIN(컬럼) FROM [테이블];
GROUP BY 예시
이 글을 포스팅한 이유가 이것 때문이다.
https://school.programmers.co.kr/learn/courses/30/lessons/131118
문제를 풀던 도중, 내 생각으로는 쿼리가 맞는 것 같은데 계속 틀리게 나와서 결국 답지를 봤더니 GROUP BY를 쓰지 않아 틀렸었다.
SELECT REST_INFO.REST_ID, REST_NAME, FOOD_TYPE, FAVORITES, ADDRESS,
ROUND(AVG(REST_REVIEW.REVIEW_SCORE),2) AS SCORE
FROM REST_INFO
JOIN REST_REVIEW
ON REST_INFO.REST_ID=REST_REVIEW.REST_ID
WHERE REST_INFO.ADDRESS LIKE '서울%'
GROUP BY REST_INFO.REST_ID
ORDER BY SCORE DESC, FAVORITES DESC;
Join은 이제 좀 알겠는데, Group by는 확실치 못한 것 같다. ㅠ
'Database > SQL' 카테고리의 다른 글
[SQL] SQL SELECT 실행 순서 (0) | 2023.04.15 |
---|---|
[MySQL] 서브쿼리(SUBQUERY) (0) | 2023.03.31 |