2021-11-6 SQL 첫걸음 (9주차)

COUNT로 행 개수 구하기

COUNT(집합)
//인수로 주어진 집합의 개수를 구해 반환한다

SELECT COUNT(*) FROM sample51; //5

SELECT COUNT(name) FROM sample51; //집계함수는 NULL값을 무시한단

image

image

행 개수를 WHERE 구를 지정하여 구하기

SELECT * FROM sample51 WHERE name='A'

SELECT COUNT(*) FROM sample51 WHERE name='A';

DISTINCT로 중복 제거하기

SELECT ALL name FROM sample51;
SELECT DISTINCT name FROM sample51; //중복 제거

SELECT COUNT(ALL name), COUNT(DISTINCT name) FROM sample51;

COUNT 이외의 집계함수

SUM( [ALL|DISTINCT] 집합)
AVG( [ALL|DISTINCT] 집합)
MIN( [ALL|DISTINCT] 집합)
MAX( [ALL|DISTINCT] 집합)

SUM으로 합계

SELECT SUM(quantity) FROM sample51; //16
지정되는 집합은 수치형이여야만 한다, 문자나 날짜형은 구할  없다, NULL 무시

AVG

SELECT AVG(quantity), SUM(quantity)/COUNT(quantity) FROM sample51;

만약 NULL 0으로 간주해 평균을 내고 싶으면 CASE이용해 NULL 0으로 변환  사용
SELECT AVG(CASE WHEN quantity IS NULL THEN 0 ELSE quantity END) AS avgnull0 FROM sample51;

MIN - MAX

  • 문자열형과 날짜시간형에도 사용할 수 있다
SELECT MIN(quantity), MAX(quantity), MIN(name), MAX(name) FROM sample51;

image

그룹화

SELECT * FROM 테이블명 GROUP BY 1, 2
SELECT name FROM sample51 GROUP BY name;
//DISTINCT 지정했을떄와 같은 결과로 나온다
  • GROUP BY 구에 열을 지정해 그룹화 하면 지정된 열의 값이 같은 하나의 그룹으로 묶인다
  • GROUP BY 구로 그룹화된 각각의 그룹이 하나의 집합으로서 집계함수의 인수로 넘길 수 있다.
SELECT name, COUNT(name), SUM(quantity) FROM sample51 GROUP BY name;

image

  • 먼저 4개의 그룹으로 나뉜 후 집계함수로 들어간다
  • 점포별, 상품별, 월별, 일별등 특정 단위로 집계할떄 유용

HAVING 구로 조건 지정

  • 집계함수는 WHERE 구의 조건식에서는 사용할 수 없다

image

  • name 열을 그룹화해 행 개수가 하나만 존재하는 그룹을 검색하고 싶지만 에러 발생
  • GROUP BY와 WHERE 구의 내부처리 순서와 관련있다
  • WHERE 구로 행을 검색하는 처리가 GROUP BY로 그룹화하는 처리보다 앞에 있기 때문

내부처리 순서

  • WHERE → GROUP BY → HAVING → SELECT → ORDER BY

따라서 SELECT 명령어에 HAVING 구를 사용

SELECT name, COUNT(name) FROM sample51 GROUP BY name HAVING COUNT(name) = 1;

그룹화보다 나중에 처리되기떄문에 문제없이 집계함수 사용 가능하다

복수열의 그룹화

  • GROUP BY에 지정한 열 이외의 열은 집계함수를 사용하지 않은 채 SELECT에 기술해서는 안된다.
SELECT no, name, quantity FROM sample51 GROUP BY name;
이때 그룹마다 하나의 값만을 반환해야 하므로 어느것을 반환해야 할지 몰라 에러 발생
SELECT MIN(no), name, SUM(quantity) FROM sample51 GROUP BY name;
집계함수를 사용하면 집합은 하나의 값으로 계산되므로 사용가능

결괏값 정렬

SELECT name, COUNT(name), SUM(quantity) FROM smple51
GROUP BY name ORDER BY SUM(quantity) DESC;
  • ORDER BY 구를 사용해 결과를 정렬할 수 있다
Written on November 6, 2021