Group By Having

gotcha!!·2023년 1월 12일
0

DB

목록 보기
4/9

/* SELECT문 해석 순서

  • 5: SELECT 컬럼명 AS 별칭, 계산식, 함수식
  • 1: FROM 참조할 테이블명
  • 2: WHERE 컬럼명 | 함수식 비교연산자 비교값
  • 3: GROUP BY 그룹을 묶을 컬럼명
  • 4: HAVING 그룹함수식 비교연산자 비교값
  • 6: ORDER BY 컬럼명 | 별칭 | 컬럼순번 정렬방식[ NULLS FIRST / LAST ]
  • */

-- GROUP BY절 : 같은 값들이 여러개 기록된 컬럼을 가지고 같은 값들을 하나의 그룹으로 묶음
-- GROUP BY 컬럼명 | 함수식,...
-- 여러개의 값을 묶어서 하나로 처리할 목적으로 사용함.
-- 그룹으로 묶은 값에 대해서 SELECT절에서 그룹함수를 사용함.

-- EMPLOYEE 테이블에서 부서코드, 부서별 급여 합 조회

-- 1) 부서코드만 조회

SELECT DEPT_CODE FROM EMPLOYEE; -- 23행

-- 2) 전체 급여 합 조회

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

-- DEPT_CODE가 같은 행 끼리 하나의 그룹이 됨

-- EMPLOYEE 테이블에서
-- 직급코드가 같은 사람의 직급코드, 급여 평균, 인원 수를
-- 직급코드 오름차순으로 조회

SELECT JOB_CODE, ROUND(AVG(SALARY)), COUNT(*)  
FROM EMPLOYEE
GROUP BY JOB_CODE
ORDER BY JOB_CODE;

-- EMPLOYEE 테이블에서
-- 성별(남/여)과 각 성별 별 인원 수, 급여 합을
-- 인원 수 오름 차순으로 조회

SELECT DECODE(SUBSTR(EMP_NO , 8, 1), '1', '남', '2', '여') 성별, 
	COUNT(*) "인원 수", 
	SUM(SALARY)  
FROM EMPLOYEE
GROUP BY DECODE(SUBSTR(EMP_NO , 8, 1), '1', '남', '2', '여') -- 별칭 사용이 X (SELECT절 해석 X)
ORDER BY "인원 수"; -- 별칭 사용이 O (SELECT절 해석 완료)

-- EMPLOYEE 테이블에서 부서코드가 D5, D6인 부서의 평균급여, 인원 수 조회

SELECT DEPT_CODE, ROUND(AVG(SALARY)), COUNT(*) 
FROM EMPLOYEE
WHERE DEPT_CODE IN('D5', 'D6')
GROUP BY DEPT_CODE;

-- EMPLOYEE 테이블에서 직급별 2000년도 이후 (2000년도 포함) 입사자들의 급여 합을 조회
-- 직급코드 오름차순

SELECT JOB_CODE, SUM(SALARY) 
FROM EMPLOYEE
WHERE EXTRACT(YEAR FROM HIRE_DATE) >= 2000
GROUP BY JOB_CODE
ORDER BY 1;

-- EMPLOYEE 테이블에서 부서별로 같은 직급인 사원의 수를 조회
-- 부서코드는 오름차순, 직급 코드는 내림차순

SELECT DEPT_CODE, JOB_CODE , COUNT(*) 인원수
FROM EMPLOYEE 
GROUP BY DEPT_CODE, JOB_CODE  -- DEPT_CODE로 그룹을 나누고, 나눠진 그룹 내에서 JOB_CODE 로 또 그룹 분류
ORDER BY DEPT_CODE, JOB_CODE DESC;

-- GROUP BY 사용 시 주의사항

--> SELECT문에 GROUP BY 절을 사용할 경우
--> SELECT절에 명시한 조회하려는 컬럼 중
--> 그룹 함수가 적용되지 않은 칼럼을
--> 모두 GROUP BY절에 작성

profile
ha lee :)

0개의 댓글