메인 콘텐츠로 건너뛰기

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
COUNT(*)는 행이 몇 개인지 답합니다. COUNT(DISTINCT column)은 서로 다른 값이 몇 개인지 답하는데, 처음 만나는 열에 대해서는 보통 이쪽이 더 흥미로운 질문입니다. 시작하기 전에 mysql -u root -p sakila로 클라이언트를 여세요.

COUNT DISTINCT의 동작 방식

COLUMN_NAME을 서로 다른 값을 세고 싶은 열로, TABLE_NAME을 테이블로 바꾸세요. 서버는 모든 행을 읽고, 반복되는 것을 버리고, 남은 것을 셉니다. 이것은 SELECT DISTINCT가 반환할 것의 개수이며, 그것을 반환하지는 않습니다.

예제

  1. 서로 다른 값이 몇 개인가

5개의 등급에서 나온 1,000편의 영화입니다.

  1. 서로 다른 조합

여러 열을 지정하면 조합 하나가 한 번 세어지며, GROUP BY가 그것들을 다루는 방식과 같습니다.
5개의 등급 곱하기 3개의 요금이고, 모든 조합이 나타납니다. 지정한 열 중 어느 하나라도 NULL인 행은 전혀 세어지지 않습니다.

NULL을 건너뛰므로, 답이 잘못된 것처럼 보일 수 있습니다

address2는 4개 행에서 NULL이고 나머지 599개 행에서 빈 문자열입니다.
답은 1입니다. 빈 문자열은 1개의 서로 다른 값이고, NULL은 자체의 값으로 세어지는 대신 건너뛰어집니다. 그래서 일부 행이 비어 있을 때 이 함수가 답하는 것은 “이 열에 서로 다른 것이 몇 개 있는가”가 아닙니다: 이 함수는 “서로 다른 값이 몇 개인가”에 답하고, NULL은 값의 부재입니다. 두 숫자가 모두 필요하면, 두 번째 쿼리로 빠진 행을 세세요: SELECT COUNT(*) FROM address WHERE address2 IS NULL.

요약

  • 행이 아니라 서로 다른 값을 세려면 COUNT(DISTINCT column)을 사용하세요.
  • 서로 다른 조합을 세려면 여러 열을 지정하세요.
  • NULL은 값으로 세어지지 않고 건너뛰어진다고 예상하세요.
  • 두 숫자가 모두 필요하면 빠진 행을 따로 세세요.

함께 보기