데이터베이스/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에서 인식하지 못하고 오류가 발생할 수 있습니다. 그래서 보통은 💡원래 식을 한 번 더 쓰는 방식이 가장 안전합니다:
반응형