SELECT
SELECT문은 다음과 같은 구조를 가지고 있다.
SELECT 컬럼명
FROM 테이블명
WHERE 조건식
GROUP BY 그룹으로 묶을 컬럼명
HAVING 그룹함수 비교연산자 비교값
ORDER BY 정렬방식
📁 GROUP BY
그룹 함수가 적용될 그룹의 기준을 기술하는 절
그룹 함수는 한개의 결과값만 산출하기 때문에 Result Set에서 그룹이 여러개일 경우 오류가 발생한다.
따라서 그룹 함수를 사용할 때에는 GROUP BY절을 통해 그룹 개수와 일치하는 결과값을 만들어야 한다.
SELECT AVG(SCORE) FROM STUDENT
GROUP BY MAJOR; -- 전공별 점수 평균 출력
그룹 함수 외에 조회하는 모든 컬럼을 반드시 GROUP BY절에 추가해야 한다.
다음의 경우 MAJOR과 GENDER을 조회하지만 그룹으로 묶을 컬럼에는 MAJOR만 넣었기 때문에 에러가 발생한다.
SELECT MAJOR, GENDER, AVG(SCORE))
FROM STUDENT
GROUP BY MAJOR; -- 에러
ROLLUP
인자로 지정한 그룹에 대해 가장 먼저 지정한 그룹별로 추가적인 집계 결과를 반환한다.
인자를 오른쪽부터 하나씩 빼서 그룹핑하고, 그 소계를 반환한다.
SELECT GENDER, MAJOR, COUNT(*) FROM STUDENT
GROUP BY ROLLUP(GENDER, MAJOR);
GENDER의 소계, GENDER과 MAJOR을 합한 전체 그룹의 총계를 반환한다.
SELECT GENDER, MAJOR, COUNT(*) FROM STUDENT
GROUP BY GENDER, MAJOR;
SELECT GENDER, COUNT(*) FROM STUDENT
GROUP BY GENDER;
SELECT COUNT(*) FROM STUDENT;
세 구문을 합친것과 동일한 결과를 반환한다.
ROLLUP 내에서도 여러 개의 컬럼을 ()로 묶어 하나의 그룹으로 취급할 수 있다.
-- GENDER의 소계, 전체 그룹의 총계 반환
SELECT GENDER, MAJOR, GRADE, COUNT(*) FROM STUDENT
GROUP BY ROLLUP(GENDER, (MAJOR, GRADE))
-- 전체 그룹의 총계 반환
SELECT GENDER, MAJOR, GRADE, COUNT(*) FROM STUDENT
GROUP BY ROLLUP((GENDER, MAJOR, GRADE))
CUBE
인자로 저장한 그룹들 간에 가능한 모든 조합으로 집계 결과 반환한다.
SELECT GENDER, MAJOR, COUNT(*) FROM STUDENT
GROUP BY CUBE(GENDER, MAJOR);
-- GENDER 소계, MAJOR 소계, 전체 총계 반환
ROLLUP으로 작성된 GROUP BY절은 CUBE로도 표현할 수 있다.
SELECT DATA1, DATA2, DATA3, COUNT(*) FROM MY_TABLE
GROUP BY CUBE(DATA1, DATA2, DATA3);
SELECT DATA1, DATA2, DATA3, COUNT(*) FROM MY_TABLE
GROUP BY ROLLUP(DATA1, DATA2, DATA3)
UNION
SELECT '', DATA2, DATA3, COUNT(*) FROM MY_TABLE
GROUP BY ROLLUP(DATA2, DATA3)
UNION
SELECT '', '', DATA3, COUNT(*) FROM MY_TABLE
GROUP BY ROLLUP(DATA3);
GROUPING SETS
그룹 별로 처리된 여러개의 SELECT문을 하나로 합친 결과를 반환한다.
인자에는 SELECT절에 있는 모든 컬럼(그룹함수 제외)이 포함되어야 한다.
SELECT GENDER, MAJOR, AVG(GRADE) FROM STUDENT
GROUP BY GROUPING SETS(
(GENDER),
(MAJOR),
(GENDER, MAJOR)
);
집합 연산자와 동일한 기능을 수행할 수 있다.
SELECT GENDER, '', AVG(GRADE) FROM STUDENT
GROUP BY GENDER
UNION
SELECT '', MAJOR, AVG(GRADE) FROM STUDENT
GROUP BY MAJOR
UNION
SELECT GENDER, MAJOR, AVG(GRADE) FROM STUDENT
GROUP BY GENDER, MAJOR;
📁 HAVING
GROUP BY절에서 그룹 함수로 값을 구해올 그룹에 대해 조건을 설정
SELECT절의 컬럼에 대한 조건이 들어가는 WHERE절과는 구분된다.
SELECT MAJOR, AVG(GRADE) FROM STUDENT
GROUP BY MAJOR
HAVING AVG(GRADE)>=4;
📁 ORDER BY
선택한 컬럼에 대해 정렬할 때 작성하는 구문
ASC
오름차순 정렬
SELECT NAME FROM STUDENT
ORDER BY NAME ASC;
DESC
내림차순 정렬
SELECT NAME FROM STUDENT
ORDER BY NAME DESC;
순번에 의한 정렬
SELECT절에 적힌 컬럼의 순서대로 숫자가 부여되어 정렬기준으로 선택 가능
새로운 컬럼이 SELECT절에 추가될 시 ORDER BY절도 수정해야 하기 때문에 되도록 추천하지 않음
SELECT NAME, SCORE FROM STUDENT
ORDER BY 1; -- NAME에 의한 정렬
SELECT NAME, SCORE FROM STUDENT
ORDER BY 2; -- SCORE에 의한 정렬
별칭에 의한 정렬
ORDER BY절은 SELECT절보다 늦게 작동하기 때문에 별칭을 통해 정렬기준을 선택할 수 있음
SELECT NAME AS 이름, SCORE AS 점수 FROM STUDENT
ORDER BY 이름;
NULL FIRST, NULL LAST
NULL값을 보여줄 순서를 정함
SELECT NAME, SCORE FROM STUDENT
ORDER BY SCORE NULLS FIRST, NAME NULLS LAST;