[MySQL] DML(3) SELECT ②

Hunie_07·2026년 2월 5일

SQL

목록 보기
9/18
post-thumbnail

📌 SELECT

5️⃣ 집계 함수

데이터 집계함수

  • 합계, 평균, 개수, 최대값, 최소값 등의 계산을 위한 기능
  • 집계함수를 사용 가능한 위치
    - SELECT구, HAVING구, ORDER BY
  • 집계함수는 1개의 값을 반환하는 것만 함께 사용 가능
    - 상수, 집계함수, DISTINCT, 연산자 등

1) count()

  • 조회된 행의 개수 출력
SELECT count(*) FROM book;

# NULL값은 제외
SELECT clientHobby FROM bookClient;
SELECT count(clientHobby) FROM bookClient;

- 출력

2) sum()

  • 합계
# 도서 테이블의 총 재고수량을 출력
SELECT sum(bookStock) FROM book;
SELECT sum(bookStock) AS 'sum of bookStock' FROM book;
SELECT sum(bookStock) AS '총재고량' FROM book;

# 도서 판매 테이블에서 총 주문수량을 출력
SELECT sum(bsQty) FROM bookSale;

# 고객번호 2인 고객이 주문한 도서의 총 주문수량 출력
SELECT sum(bsQty) AS '총주문수량'
	FROM bookSale WHERE clientNo = '2';
    
SELECT clientNo, sum(bsQty) AS '총주문수량'
	FROM bookSale WHERE clientNo = '2';

- 출력

3) max(), min()

  • 최대, 최소값
# 최소주문량 출력
SELECT min(bsQty) AS '최소주문수량' FROM bookSale;
SELECT * FROM bookSale WHERE bsQty=1;
    
# 최대주문량 출력
SELECT max(bsQty) AS '최소주문수량' FROM bookSale;
SELECT * FROM bookSale WHERE bsQty=9;

# 최소/최대 주문량 함께 출력
SELECT min(bsQty), max(bsQty), sum(bsQty) FROM bookSale;

- 출력

4) avg()

  • 평균
SELECT min(bsQty) AS '최저주문량',
	   max(bsQty) AS '최고주문량',
       sum(bsQty) AS '총주문량',
       avg(bsQty) AS '평균주문량'
       FROM bookSale;

# 한글별칭으로 사용시 따옴표 없이 사용가능(공백허용불가)
SELECT min(bsQty) AS 최저주문량,
	   max(bsQty) AS 최고주문량,
       sum(bsQty) AS 총주문량,
       avg(bsQty) AS 평균주문량
       FROM bookSale;

- 출력

5) round()

  • 수치형 반올림
SELECT min(bsQty) AS 최저주문량,
	   max(bsQty) AS 최고주문량,
       sum(bsQty) AS 총주문량,
       avg(bsQty) AS 평균주문량
       round(avg(bsQty)) as 평균주문량
       FROM bookSale;

- 출력


6️⃣ GROUP BY

  • 그룹별 질의에 대한 결과 생성
SELECT 집약키, 집계함수(컬럼), ...
FROM 테이블명
GROUP BY 집약키컬럼
[HAVING 검색조건(필터링)조건]
  • 집약키 : GROUP BY 에서 사용하는 컬럼

  • 집약키에 따라 그룹화한 후 그룹별로 집계함수나 조건에 따른 질의결과 생성

  • 주의: SELECT 구에는 1개의 값을 반환하는 상수, GROUP BY에서 사용한 집약키 컬럼, 집계함수만 나올 수 있음

  • HAVING 검색(필터링)조건은 반드시 GROUP BY 뒤에 위치, ORDER BY 뒤에 X

  • 그룹별 연산 단계:
    그룹별 데이터 분리 (split)
    → 집계함수나 그룹별 연산을 적용 (apply)
    → 그룹별 연산 결과를 통합 (merge)


-- 도서별 주문량 합계 출력
SELECT bookNo, sum(bsQty) AS '주문량합계'
	FROM bookSale
    GROUP BY bookNo;

- 출력


  • ORDER BY 기준을 열 번호로 지정 가능하다.
    - 첫번째 열부터 1, 2, 3, ...
-- 도서별 주문량 합계 합계순 정렬
SELECT bookNo, sum(bsQty) AS '주문량합계'
	FROM bookSale
    GROUP BY bookNo
    ORDER BY 2;	 		# 두번째 열(sum(bsQty) 순)

- 출력


  • ORDER BY 기준을 AS(Alias) 설정한 별칭으로도 사용 가능하다.
SELECT bookNo, sum(bsQty) AS '주문량합계'
	FROM bookSale
    GROUP BY bookNo
    ORDER BY 주문량합계 DESC;	# 주문량합계(sum(bsQty)) 순 

- 출력


  • 단, ORDER BY 컬럼 에 따옴표(' ') 포함시 정렬이 적용되지 않는다.
SELECT bookNo, sum(bsQty) AS '주문량합계'
	FROM bookSale
    GROUP BY bookNo
    ORDER BY '주문량합계' DESC;

- 출력


WITH ROLLUP

  • 그룹별 집계 뒤에 전체 요약정보 함께 제시
  • GROUP BY 절 뒤에 사용
SELECT bookNo, sum(bsQty) AS '주문량합계'
	FROM bookSale
    GROUP BY bookNo
    WITH ROLLUP;		# 맨 뒤에 총계 출력

- 출력

SELECT bookNo, sum(bsQty) AS '주문량합계'
	FROM bookSale
    GROUP BY bookNo 
    WITH ROLLUP
    ORDER BY 주문량합계;

7️⃣ HAVING

  • HAVING 검색조건(필터링)
  • GROUP BY 절에 의해 구성된 그룹들에 대해 적용할 조건 기술
  • 검색조건(필터링): 집계함수, 비교연산 주로 사용
  • GROUP BY 없이 단독사용 불가
  • WHERE 절보다 뒤에 위치
  • WHERE절: 개별 행 필터링
  • HAVING절: 그룹(집계결과)별 필터링

-- 출판사별 가격이 25000원 이상인 도서 권수가 3 초과인 경우만 출력
SELECT pubNo, count(*) AS '도서수합계'
	FROM book
    WHERE bookPrice >= 25000
    GROUP BY pubNo
    HAVING count(*) > 3;

- 출력


  • group_concat() : 데이터 조회 결과를 한 줄로 결합 (구분자 기본값 콤마)
# GROUP BY절에 대한 결과를 group_concat()을 사용
SELECT clientNo, group_concat(bookNo) AS 'bookID'
	FROM bookSale
    GROUP BY clientNo;

- 출력


  • 구분자 설정도 가능하다. group_concat(컬럼명 separator 구분자)
SELECT clientNo, group_concat(bookNo separator ' ') AS 'bookID'	
# , 대신 ' '(공백) 으로 구분자가 설정된 모습
	FROM bookSale
    GROUP BY clientNo;

- 출력

0개의 댓글