2021-11-6 SQL 첫걸음 (9주차)
COUNT로 행 개수 구하기
COUNT(집합)
//인수로 주어진 집합의 개수를 구해 반환한다
SELECT COUNT(*) FROM sample51; //5
SELECT COUNT(name) FROM sample51; //집계함수는 NULL값을 무시한단
행 개수를 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;
그룹화
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;
- 먼저 4개의 그룹으로 나뉜 후 집계함수로 들어간다
- 점포별, 상품별, 월별, 일별등 특정 단위로 집계할떄 유용
HAVING 구로 조건 지정
- 집계함수는 WHERE 구의 조건식에서는 사용할 수 없다
- 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