-
Oracle - ORDER BY / GROUP BY / HAVING데이터베이스/Oracle 2020. 11. 11. 17:05728x90반응형
ORDER BY
ORDER BY란 SELECT한 컬럼에 대해 정렬을 할 때 작성하는 구문으로
SELECT 구문의 가장 마지막에 작성하며 실행 순서 역시 가장 마지막에 수행된다.
[ 표현식 ]
정렬 방식은 ASC는 오름차순이고 DESC은 내림차순이다.
또는, 컬럼명이 아닌 컬럼의 순서를 숫자로 표기할 수 있다.
[ ORDER BY 예시 ]
- EMPLOYEE 테이블에서 부서별 코드, 부서별 급여합, 부서별 급여 평균, 부서별 인원 수를 부서코드 순으로 조회
SELECT DEPT_CODE, SUM(SALARY) "급여 합",FLOOR(AVG(SALARY)) "급여 평균", COUNT(*) "인원 수" FROM EMPLOYEE GROUP BY DEPT_CODE ORDER BY DEPT_CODE;
GROUP BY
GROUP BY란 그룹 함수는 단 한 개의 결과 값만 산출하기 때문에그룹이 여러 개일 경우 오류 발생한다. 그래서
여러 개의 결과 값을 산출하기 위해 그룹 함수가 적용될 그룹의 기준을 GROUP BY절에 기술하여 사용한다.
즉, 코드를 이렇게 작성하면
SELECT DEPT_CODE, SUM(SALARY) FROM EMPLOYEE; -- 에러가 난다. -- ORA-00937: not a single-group group function
DEPT_CODE는 여러개의 값을 불러오는데 SUM값이 1개만 나오기 때문에 에러가 나타난다.
그래서 DEPT_CODE 그룹별로 합을 구하려면 GROUP BY절을 써야한다.
코드를 이렇게 작성하면
SELECT DEPT_CODE, SUM(SALARY) FROM EMPLOYEE GROUP BY DEPT_CODE;
DEPT_CODE별로 그룹을 묶어서 결과가 이렇게 나온다.
[ GROUB BY 예시 ]
- EMPLOYEE테이블에서 부서코드, 그룹 별 급여의 합계, 그룹 별 급여의 평균(정수처리), 인원 수를 조회하고 부서 코드 순으로 정렬
SELECT DEPT_CODE 부서코드, SUM(SALARY) 합계, FLOOR(AVG(SALARY)) 평균, COUNT(*) 인원수 FROM EMPLOYEE GROUP BY DEPT_CODE ORDER BY DEPT_CODE ASC;
- EMPLOYEE테이블에서 부서코드와 보너스 받는 사원 수 조회하고 부서코드 순으로 정렬
SELECT DEPT_CODE 부서코드, COUNT(BONUS) 인원수 FROM EMPLOYEE GROUP BY DEPT_CODE ORDER BY DEPT_CODE ASC;
GROUP BY에 함수를 입력하여 그룹으로 묶을 수 있다.
- EMPLOYEE테이블에서 성별과 성별 별 급여 평균(정수처리), 급여 합계, 인원 수 조회하고 인원수로 내림차순 정렬
SELECT DECODE(SUBSTR(EMP_NO, 8, 1), 1, '남', 2, '여') 성별, FLOOR(AVG(SALARY)) 평균, SUM(SALARY) 합계, COUNT(*) 인원수 FROM EMPLOYEE GROUP BY DECODE(SUBSTR(EMP_NO, 8, 1), 1, '남', 2, '여') ORDER BY 인원수 DESC;
여러 컬럼을 그룹으로 묶을 수 있다
- EMPLOYEE테이블에서 부서 코드 별로 같은 직급인 사원의 급여 합계를 조회하고 부서 코드 순으로 정렬
SELECT DEPT_CODE, JOB_CODE, SUM(SALARY) FROM EMPLOYEE GROUP BY DEPT_CODE, JOB_CODE ORDER BY DEPT_CODE;
HAVING
HAVING이란 그룹 함수로 값을 구해올 그룹에 대해 조건을 설정할 때 HAVING절에 기술한다.
WHERE절은 각 컬럼 값에 대한 조건을 설정할 수 있지만 HAVING절은 그룹에 대해 조건을 설정한다.
[ HAVING 예시 ]
그룹별 조회
- 부서 코드와 급여 3000000 이상인 직원의 그룹별 평균 조회
SELECT DEPT_CODE, FLOOR(AVG(SALARY)) 평균 FROM EMPLOYEE WHERE SALARY >= 3000000 GROUP BY DEPT_CODE ORDER BY 1;
그룹을 조회
- 부서 코드와 급여 평균이 3000000 이상인 그룹 조회
SELECT DEPT_CODE, FLOOR(AVG(SALARY)) 평균 FROM EMPLOYEE GROUP BY DEPT_CODE HAVING FLOOR(AVG(SALARY)) >= 3000000 ORDER BY DEPT_CODE
728x90반응형'데이터베이스 > Oracle' 카테고리의 다른 글
Oracle - JOIN (0) 2020.11.12 Oracle - GROUP BY 의 ROLLUP과 CUBE (0) 2020.11.11 Oracle 함수(Function) - 그룹 함수 (0) 2020.11.11 Oracle 함수(Function) - NULL 처리 함수와 선택 함수 (0) 2020.11.11 Oracle 함수(Function) - 형 변환 함수 (0) 2020.11.11