[Oracle] 그룹 함수 ( GROUP BY / ORDER BY / HAVING )

라라·2023년 4월 4일
0

Oracle

목록 보기
11/16

📍 특정 기준으로 컬럼값을 묶어서 처리하기 ( GROUP BY )

👉 그룹 하나의 결과만 출력된다.
👉 SELECT 컬럼
  FROM 테이블명
  [ WHERE 조건식 ]
  [ GROUP BY 컬럼명 [ , 컬럼명, 컬럼명, .....] ]
  [ HAVING 조건식 ]
  [ ORDER BY [ 컬럼명 ] ]

✏️ 부서별 급여 합계 구하기

SELECT DEPT_CODE, SUM (SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE;

✏️ 직책별 급여의 합계, 평균 구하기

SELECT JOB_CODE, SUM (SALARY), AVG (SALARY)
FROM EMPLOYEE
GROUP BY JOB_CODE;

✏️ 부서별 사원 수 구하기

SELECT DEPT_CODE, COUNT (*)
FROM EMPLOYEE
GROUP BY DEPT_CODE;

❗ GROUP BY 절에는 다수의 컬럼을 넣을 수 있다.

SELECT DEPT_CODE, JOB_CODE, COUNT (*)
FROM EMPLOYEE
GROUP BY DEPT_CODE, JOB_CODE; -- D9면서 J2인 사원

❗ GROUP BY 를 사용한 절에서 WHERE 도 사용이 가능하다.

SELECT DEPT_CODE, SUM (SALARY), COUNT (*)
FROM EMPLOYEE
WHERE BONUS IS NOT NULL
GROUP BY DEPT_CODE;



📍 특정 기준으로 컬럼값을 묶어서 처리하기 ( HAVING )

👉 일반 조건은 WHERE 절에 기술하지만 그룹 함수를 포함한 조건은 HAVING 절에 기술한다.

✏️ 부서별 인원이 3명 이상인 부서만 출력하기
SELECT DEPT_CODE, COUNT (*)
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING COUNT (*) >= 3;

✏️ 평균 급여가 300만원 이상인 부서 출력하기
SELECT DEPT_CODE, AVG (SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING AVG (SALARY) >= 3000000 AND COUNT (*) >= 4;

✏️ 매니저가 관리하는 사원이 2명 이상인 매니저 아이디 출력하기
SELECT MANAGER_ID, COUNT (*)
FROM EMPLOYEE
WHERE MANAGER_ID IS NOT NULL
GROUP BY MANAGER_ID
HAVING COUNT (*) >= 2;

✏️ 남자, 여자의 급여 평균을 구하고 인원 수를 구하기
SELECT DECODE (SUBSTR (EMP_NO,8,1), '1', '남', '3', '남', '2', '여', '4', '여'),
AVG (SALARY), COUNT (*)
FROM EMPLOYEE
GROUP BY (SUBSTR (EMP_NO,8,1), '1', '남', '3', '남', '2', '여', '4', '여');



📍 컬럼값을 기준으로 정렬하기 ( ORDER BY )

👉 [ORDER BY 컬럼명 정렬방식( DESC (내림차순), ASC (오름차순, DEFAULT) ]
👉 ASC 오름차순 (DEFAULT 값, 생략 가능) : NULL 인 값을 나중에 출력한다.
👉 DESC 내림차순 : NULL인 값을 먼저 출력한다.

✏️ 이름을 기준으로 오름차순 정렬하기

SELECT *
FROM EMPLOYEE
ORDER BY EMP_NAME; -- ASC 생략

✏️ 월급이 높은 사람부터 낮은 사람으로 정렬 / 이름, 급여, 보너스 조회

SELECT EMP_NAME, SALARY, BONUS
FROM EMPLOYEE
ORDER BY SALARY DESC;

✏️ 부서코드를 기준으로 오름차순 정렬
✏️ 값이 같으면 월급은 내림차순
✏️ 월급이 같으면 이름은 오름차순

SELECT *
FROM EMPLOYEE
ORDER BY DEPT_CODE ASC, SALARY DESC, EMP_NAME ASC;



📍 ORDER BY 절에서 별칭 사용하기 ( AS )

SELECT EMP_NAME, SALARY AS 월급, BONUS -- 2번
FROM EMPLOYEE -- 1번
ORDER BY 월급; - -- 3번
-- 실행순서



📍 정렬했을 때 NULL 값에 대한 처리 ( NULLS FIRST / NULLS LAST )

👉 옵션을 설정해서 NULL 값 출력 위치를 변경할 수 있다.

ORDER BY BONUS DESC NULLS FIRST; -- NULL 값이 앞에 옴
ORDER BY BONUS DESC NULLS LAST; -- NULL 값이 뒤에 옴



📍 숫자로 컬럼 정렬하기 ( ORDER BY 1, 2, 3... )

👉 SELECT문을 이용해서 데이터를 조회하면 RESULT SET 이 출력되는데
RESULT SET에 출력되는 컬럼에는 자동으로 INDEX 번호가 1부터 부여가 된다.

SELECT *
FROM EMPLOYEE
ORDER BY 1; -- 첫번째 컬럼 ( EMP_ID ) 오름차순 정렬

profile
코딩하는 라라 :)

0개의 댓글