데이터베이스/SQL

[SQL] 데이터 집계하기(COUNT, SUM, AS(별칭), AVG, MAX, MIN), GROUP BY, HAVING

jpocket 2025. 4. 4. 14:46
반응형

📑학습 내용


  • 집계함수(COUNT, SUM, AVG, MAX, MIN)
    • COUNT
    • SUM, AVG, MAX, MIN
    • 집계함수의 특징
  • 데이터 그룹화하기(GROUP BY)
  • 그룹화한 데이터 조건주기(HAVING)

 

 

 


🛠집계함수(COUNT, SUM, AVG, MAX, MIN)


🛠COUNT

🛠COUNT(*)

  • 모든 행의 개수를 카운트
  • NULL을 포함
  • 컬럼의 NULL값 유무를 체크할 수 없다.
mysql("""

SELECT *
FROM bike
WHERE weathersit IS NULL

""")

 

 

🛠COUNT(컬럼명)

  • NULL 값을 제외한 컬럼명의 행의 개수를 카운트
mysql("""
 
SELECT COUNT(*) AS cnt
    , COUNT(weathersit) AS weather_cnt
FROM bike

""")

 

 

 


🛠SUM, AVG, MAX, MIN


🛠SUM(컬럼명)

  • 지정한 컬럼명 값의 합계AVG(컬럼명)
  • 지정한 컬럼명 값의 평균MAX(컬럼명)
  • 지정한 컬럼명 값 중 가장 큰 값MIN(컬럼명)
  • 지정한 컬럼명 값 중 가장 작은 값MAX(컬럼명)과 MIN(컬럼명)는 높고 낮은 순(날짜순, 알파벳 순(Z-A)등)으로 연산하여 결과를 출력
mysql(""" 

SELECT SUM(casual) AS casual_sum
    , SUM(registered) AS registered_sum
FROM bike
WHERE yr = 2011
AND mnth = 'Mar'

""")

 

 

 

 

 


AS

🔎  as 할때 꼭 따옴표 해줘야 할까❓

👉

공백이 없고, 예약어도 아니면 따옴표 안 써도 OK
공백, 대소문자 구분, 특수문자 필요할 땐 써주기!

✅ 숫자로 시작하는 변수명은 써주기! 🚀

 

 

select orderId, orderDate, c.customerId, country, city
from orders as o
inner join customers as c
on orders.customerId = c.customerId

🔥💡하지만 섞어 쓰는 건 안 된다.❌

 

orders 테이블 별칭을 o 라고 했는데 On조건절에서 orders로 사용하면

👉 혼동이 생기거나 오류가 날 수 있다. 🚀

 

select orderId, orderDate, c.customerId, country, city
from orders as o
inner join customers as c
on o.customerId = c.customerId

같은 별칭으로 사용하거나

select orderId, orderDate, c.customerId, country, city
from orders
inner join customers as c
on orders.customerId = c.customerId

별칭 없이 사용해야 한다.

 

 

🛠 AVG(컬럼명)

지정한 컬럼명 값의 평균

 

🛠 MAX(컬럼명)

지정한 컬럼명 값 중 가장 큰 값 

 

🛠 MIN(컬럼명)

지정한 컬럼명 값 중 가장 작은 값

 

MAX(컬럼명)**과 MIN(컬럼명)는 높고 낮은 순(날짜순, 알파벳 순(Z-A)등)으로 연산하여 결과를 출력

 

 

 

 

 


🛠 GROUP BY

  • select절에 count(weather) 이런 식으로 컬럼명과 집계함수가 같이 기술되어있으면, 컬럼명은 group by 절에 기술되어야 한다.
  • 결과값은 group by 절에 기술된 컬럼 항목들의 행의 개수에 의해 결정된다.

 

📌형태

SELECT
FROM
WHERE
GROUP BY
ORDER BY
LIMIT

 

 

mysql("""

SELECT season AS "계절", AVG(temp) AS "평균온도"
FROM bike
GROUP BY season

""")

계절별 평균 온도를 나타내는 코드다.

 

 

 

🛠 HAVING


그룹함수를 적용해서 나온 결과 중, 원하는 조건에 부합하는 것만 필터링할 수 있다.

 

 

📌 형태

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT

 

 

mysql("""

SELECT weathersit AS "날씨", SUM(cnt) AS "이용건수합계" 
FROM bike
GROUP BY 1
HAVING SUM(cnt) >= 100000

""")

날씨별 이용건수의 합계 중 10만건 이상의 데이터만 확인한다.

 

 

 

Q. 그렇다면 필터링 역할을 해주는 where, having 의 차이는 무엇일까?

🛠 WHERE

  • 💡집계함수를 사용할 수 없다.
  • GROUP BY 전에 사용한다.
mysql("""

SELECT season AS "계절", temp AS "온도"
FROM bike
WHERE temp >= 0.3

""")

 

🛠 HAVING

  • 그룹에 적용한다.
  • 💡GROUP BY 후에 사용한다.
mysql("""

SELECT season AS "계절", AVG(temp) AS "평균온도"
FROM bike
GROUP BY season
HAVING AVG(temp) >= 0.3

""")

 

Q. having절에서는 별칭 사용하면 안 되나

⇒ MySQL에서는 HAVING 절에서 별칭(alias) 를 사용할 수 있습니다, 다만 버전이나 SQL 처리 순서에 따라 예외가 있을 수 있습니다. 일부 구버전이나 특정 SQL 모드에서는 별칭을 HAVING에서 인식하지 못하고 오류가 발생할 수 있습니다. 그래서 보통은 💡원래 식을 한 번 더 쓰는 방식이 가장 안전합니다:

반응형