[DB] SQL 기본 : 데이터 조회(2)

나무나무·2025년 1월 4일

DB

목록 보기
4/9

GROUP BY

  • 여러 값들을 하나의 그룹으로 묶어서 처리하기 위한 구문으로 집계 함수를 GROUP BY 절과 함께 사용하기도 한다.
    SUM, AVG, MIN, MAX, COUNT
  • 중복된 값을 전부 제거하는 DISTINCT와 달리 GROUP BY는기준이 되는 값으로 하나로 묶어두기 때문에 값이 제거되지 않는다.
  • COUNT 함수는 값이 NULL인 경우 출력하지 않는다.

예제 코드▼

-- GROUP BY 실습
SELECT addr AS '주소', COUNT(*)
FROM usertbl
GROUP BY addr;

-- DISTINCT를 쓰면 위의 결과와 유사하지만 내부적으론 다름
SELECT DISTINCT addr AS '주소', COUNT(*)
FROM usertbl;
-- 얘는 서울 10 이렇게만 나옴
-- 위의 결과 이유는 DISTINCT는 중복된 애들을 제거하지만,
-- GROUP BY의 경우 addr를 기준으로 하나로 묶어뒀기 때문에 값들이 제거되지는 않음. 

-- 전체 사원 급여 합계
SELECT SUM(salary) AS '급여합계'
FROM employee;
-- 사원 급여 평균
SELECT AVG(salary) AS '급여합계'
FROM employee;
-- 사원 급여 최대값
SELECT MAX(salary) AS '급여합계'
FROM employee;
-- 사원 급여 최솟값
SELECT MIN(salary) AS '급여합계'
FROM employee;

-- 부서별 급여 합계
SELECT dept_code AS '부서코드', 
		 SUM(salary) AS '급여합계',
		 AVG(salary) AS '급여평균'
FROM employee
GROUP BY dept_code
ORDER BY '급여평균';

-- 회원 아이디, 구매 개수 조회
SELECT userID AS '아이디',
		 SUM(amount) AS ' 구매개수'
FROM buytbl
GROUP BY userID;
ORDER BY '구매개수' DESC;

-- 사용자별 구매 금액의 총 합
SELECT userID AS '아이디',
		 SUM(price * amount) AS '결제총액'
FROM buytbl
GROUP BY userID;

-- 전체 구매자가 구매한 물품 개수의 평균
SELECT SUM(amount) AS '전체물품개수',
		 AVG(amount) AS '평균'
FROM buytbl;

-- 사용자 별 평균 구매 개수
SELECT userID AS '아이디', 
		 AVG(amount) AS '평균구매개수'
FROM buytbl
GROUP BY userID;

-- 휴대폰이 있는 사원의 총원 수
SELECT COUNT(*)
FROM usertbl
WHERE mobile1 IS NOT NULL;

-- COUNT 함수는 mobile1에 있는 값 중 값이 있는 행들만 계산함
-- NULL인 애들은 출력되지 않음
SELECT COUNT(mobile1)
FROM usertbl;

-- 참고
-- NULL 제외, 중복된 값은 한 번만 COUNT 함
SELECT COUNT(DISTINCT mobile1)
FROM usertbl;

HAVING 절

위에서 본 집계 함수에 대한 조건을 제한할 때 사용하는 구문이다. 집계 함수 조건 제한에 WHERE은 사용할 수 없기 때문이다.

예제 코드▼

-- 총 구매액이 1000만원 이상인 회원 ID 조회
SELECT userID AS '고객 아이디' ,
		SUM(price * amount) AS '총 구매 금액'
FROM buytbl
GROUP BY userID
HAVING SUM(price * amount) >= 1000;

-- 사용자 별 구매 평균 개수가 3개 이상인 아이디, 평균 구매 개수 조회 
SELECT userID AS '아이디',
		AVG(amount) AS '평균 구매 개수'
FROM buytbl
GROUP BY userID
HAVING AVG(amount) >= 3;

profile
백엔드 개발자 나무입니다

0개의 댓글