DataBase/Oracle
SQL - ORDER BY, GROUP BY, HAVING
jddng
2022. 1. 19. 20:04
728x90
반응형
SQL - ORDER BY, GROUP BY, HAVING
쿼리 실행 순서
FROM -> CONNECT BY -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
FROM절에서 만든 별칭은 모든 곳에서 쓸 수 있다.
SELECT 절에서 만든 별칭은 HAVING과 그 이전 절에서 쓸 수 없다.
ORDER BY 절
- SELECT한 컬럼에 대해 정렬을 할 때 작성하는 구문
- SELECT 구문의 가장 마지막에 실행
GROUP BY 절
- 집계 함수를 이용하기 위해서는 집계함수가 적용될 그룹의 기준을
GROUP BY절에 기술하여 사용해야 한다
실습 예제 - GROUP BY
-- DEPT_CODE 기준으로 그루핑
SELECT
COUNT(*)
, DEPT_CODE
FROM EMPLOYEE
GROUP BY DEPT_CODE;
-- DEPT_CODE, JOB_CODE 기준으로 그루핑
SELECT
DEPT_CODE
, JOB_CODE
, SUM(SALARY)
, COUNT(*)
FROM EMPLOYEE
GROUP BY DEPT_CODE
, JOB_CODE
ORDER BY 1;
-- 직원 테이블에서 부서 코드별 그룹을 지정하여
-- 부서코드, 그룹별 급여의 합계, 그룹별 급여의 평균(정수처리), 인원수
-- 조회하고 부서코드 순으로 오름차순 정렬하세요
SELECT
DEPT_CODE
, SUM(SALARY) 합계
, FLOOR(AVG(SALARY)) 평균
, COUNT(*) 인원수
FROM EMPLOYEE
GROUP BY DEPT_CODE
ORDER BY DEPT_CODE;
-- 직원 테이블에서 직급코드, 보너스를 받는 사원 수를 조회하여
-- 직급코드 순으로 오름차순 정렬하세요.
SELECT
JOB_CODE
, COUNT(BONUS)
FROM EMPLOYEE
GROUP BY JOB_CODE
ORDER BY JOB_CODE;
-- 직원 테이블에서 직급코드, 보너스를 받는 사원 수를 조회하여
-- 직급코드 순으로 오름차순 정렬하세요.
-- 단, 보너스를 받는 사람이 없는 직급코드의 경우 RESULT SET에서 제외한다.
SELECT
JOB_CODE
, COUNT(*)
FROM EMPLOYEE
WHERE BONUS IS NOT NULL
GROUP BY JOB_CODE
ORDER BY JOB_CODE;
-- 직원 테이블에서 주민번호의 8번째 자리를 조회하여
-- 1이면 남, 2이면 여로 결과 조회하고
-- 성별별 급여 평균(정수처리), 급여 합계, 인원수를 조회한 뒤
-- 인원수로 내림차순 정렬하세요.
SELECT
DECODE(SUBSTR(EMP_NO, 8, 1), 1, '남', 2, '여') AS 성별
, FLOOR(AVG(SALARY)) 평균
, SUM(SALARY) 합계
, COUNT(*) 인원수
FROM EMPLOYEE
-- GROUP BY 성별 (GROUP BY절에서는 SELECT절의 별칭 사용 불가)
GROUP BY DECODE(SUBSTR(EMP_NO, 8, 1), 1, '남', 2, '여')
ORDER BY 인원수 DESC;
실습 예제 - HAVING
둘의 차이 잘 이해할 것
-- 300만원 이상의 월급을 받는 사원들을 대상으로
-- 부서별 그룹 월급 평균 계산
SELECT
DEPT_CODE
, FLOOR(AVG(SALARY)) 평균
FROM EMPLOYEE
WHERE SALARY > 3000000
GROUP BY DEPT_CODE
ORDER BY 1;
-- 모든 직원을 대상으로 부서별 월급 평균을 구한 뒤
-- 평균이 300만원 이상인 부서 조회
SELECT
DEPT_CODE
, FLOOR(AVG(SALARY)) 평균
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING FLOOR(AVG(SALARY)) > 3000000
ORDER BY 1;
-- 급여 합계가 가장 많은 부서의 부서코드와 급여 합계를 구하세요
SELECT
DEPT_CODE
, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING SUM(SALARY) = (SELECT MAX(SUM(SALARY))
FROM EMPLOYEE
GROUP BY DEPT_CODE
);
728x90
반응형