티스토리 뷰

DB/SQL

[MySQL] DISTINCT/ COUNT/ GROUP BY / HAVING

SdardewValley 2021. 9. 1. 16:50
반응형

DISTINCT

데이터가 중복되는 것을 막을 때 사용

 

학생들의 고향을 출력하고 싶을 때

SELECT
	DISTINCT hometown
FROM
	student;

중복을 제거하고 싶은 칼럼의 이름 앞에 DISTINCT 키워드를 붙이면 된다.

 

SELECT
	DISTINCT hometown, grade -- grade: 학년
FROM
	student;

위의 출력값은 어떻게 될까?

hometown은 중복제거를 하지만, age는 중복제거를 하지 않는다.

대전 20
대전 20
대전 21
대전 20
대전 21

위의 테이블이 있다면 아래 처럼 출력된다.

 

COUNT

레코드를 수를 셀 때 사용하는 함수

 

student 테이블에서 전체 데이터 수를 셀 때 사용하는 함수

SELECT
	COUNT(*)
FROM
	student;

 

이런 COUNT는 집약 함수라고 불리기도 한다.

 

집약 함수의 종류

함수 사용
COUNT(*)
COUNT(COLUMN 이름)
레코드의 수를 계산
SUM(COLUMN 이름) COLUMN의 합계를 계산
MAX(COLUMN 이름) COLUMN의 최댓값
MIN(COLUMN 이름) COLUMN의 최솟값
AVG(COLUMN 이름) COLUMN의 평균
💡 집약 함수의 결과는 1행으로 출력된다

 

student 테이블에서 2학년의 평균키를 계산하는 쿼리

SELECT
	AVG(height) AS 키 -- height를 키로 표시
FROM
	student
WHERE
	grade = 2; -- 2학년

 

집약 함수를 사용할 때 주의점

  • 집약 함수는 SELECT, HAVING, ORDER BY 뒤에만 사용할 수 있다
  • 여러 개의 값을 반환하는 것과는 함께 사용될 수 없다
  • COUNT 이외에 SUM, MAX, MIN, AVG는 NULL 값을 반영하지 않는다
    • SUM을 계산할 때 NULL 값은 더해지지 않는다. 하지만 COUNT에는 NULL 값이 계산된다. 따라서 AVG는 총 합을 계산할 때 NULL 값이 무시되지만, 나눌 때는 NULL 값이 무시되지 않아 값이 예상과는 달라질 수 있다.

 

각 학년마다 평균 키를 출력하고 싶을 때

SELECT
	grade, AVG(height) AS 키 -- height를 키로 표시
FROM
	student
GROUP BY
	grade; -- 학년을 기준으로 그룹화
💡 NULL 값도 그룹화가 된다. 위의 예제에서 grade에 NULL이 있었다면 grade가 NULL인 그룹으로 묶이게 된다

 

GROUP BY가 사용될 때 SELECT 뒤에 올 수 있는 값

  • 상수
  • 집약 함수
  • GROUP BY의 기준이 되는 COLUMN

 

GROUPBY 뒤에 여러개의 COLUMN 이름이 올 때

⇒ 순차적으로 GOUPBY를 실행한다

 

WHERE과 함께 GROUP BY가 사용될 때

⇒ WHERE을 먼저 적용하고 GROUP BY를 적용한다.

 

 

 

HAVING

그룹에 조건을 줄 때 사용

⇒ 그룹에 조건을 줘야 하기 때문에 HAVING을 사용한다

 

HAVING 뒤에 올 수 있는 값

  • 상수
  • 집약 함수
  • HAVING의 기준이 되는 COLUMN

HAVING VS WHERE

💡 WHERE은 레코드에 대해 조건을 걸 때 사용하고, HAVING은 그룹에 대해 조건을 걸 때 사용한다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함