[Oracle] GROUP BY / HAVING

Dawon Ruby Choi·2023년 9월 19일
0

(1) ORDER BY

기본 구조

-- ORDER BY 컬럼명 OR 컬럼별칭 OR 컬럼나열순번 OR [ASC 생략가능] OR DESC
-- ORDER BY 컬럼명 정렬방식, 컬럼명 정렬방식, 컬럼명 정렬방식...

ORDER BY 종류

ORDER BY 컬럼명 [ASC]; --오름차순 정렬
ORDER BY 컬럼명 DESC; --내림차순 정렬
ORDER BY 컬럼명 DESC; -- NULL이 있다면 먼저 나옴
ORDER BY 컬럼명 NULLS FIRST; -- 오름차순으로 정렬하되 NULL을 가장 먼저
ORDER BY 컬럼명 NULLS LAST; -- 내림차순일 때 NULL을 아래로 보내고 싶을 때 사용
ORDER BY 2; -- SELECT 2번째의 오름차순 정렬

SELECT EMP_ID, EMP_NAME, SALARY 급여, DEPT_CODE
FROM EMPLOYEE
ORDER BY 2;

⭐흐름 순서 아주 중요⭐

⑤. SELECT 컬럼명 AS 별칭, 계산식, 함수식
①. FROM 참조할 테이블 명
②. WHERE 컬럼명 OR 함수식 비교연산자 비교값
③. GROUP BY 그룹을 묶을 컬럼명
④. HAVING 그룹함수식 비교연산자 비교값
⑥. ORDER BY 컬럼명 OR 별칭 OR 컬럼순번 정렬방식 [NULLS FIRST OR LAST]

💡그래서 ORDER BY 에 별칭이나 컬럼 순번을 적어도 되는 것임!
위에서 이미 정의 되었기 때문에!
EX) ORDER BY 2;


(2) GROUP BY / HAVING

2-1) GROUP BY

  • GROUP BY 절은 데이터들을 원하는 그룹으로 나눌 수 있다.
  • GROUP BY 절은 동일한 값을 가진 컬럼을 기준으로 그룹별 연산을 적용한다.
  • 길이가 다른 컬럼을 넣고자 한다면 SELECT의 컬럼을 GROUP BY에 넣어주면 된다

예제

그룹 별 급여 합계 조회

SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE; --DEPT 코드별 그룹 합계

SELECT SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE;  -- ONLY 그룹 합계만 보여짐
--EMPLOYEE 테이블에서 부서코드별 그룹을 지정하여
--부서코드, 그룹별 급여 합계, 그룹별 급여 평균(정수처리), 인원수 조회하고
--부서코드 순으로 정렬

SELECT DEPT_CODE, SUM(SALARY), ROUND(AVG (SALARY)), COUNT(*)
FROM EMPLOYEE
GROUP BY DEPT_CODE
ORDER BY 1;

-- EMPLOYEE 테이블에서 부서코드와 보너스 받는 사원 수 조회하고 부서코드 순으로 정렬

SELECT DEPT_CODE, COUNT(BONUS)
FROM EMPLOYEE
GROUP BY DEPT_CODE
ORDER BY 1;

-- EMPLOYEE 테이블에서 직급코드, 보너스를 받는 사원수를 조회하여 직급코드 순으로 정렬

SELECT JOB_CODE, COUNT(BONUS)
FROM EMPLOYEE
WHERE BONUS IS NOT NULL -- 보너스가 0인 직급 제외
GROUP BY JOB_CODE
ORDER BY 1 ;

-- EMPLOYEE 테이블에서 성별과 성별 별 급여 평균 (정수처리), 급여 합계, 인원수 조회하고
-- 인원수로 내림차순 정렬

SELECT DECODE(SUBSTR(EMP_NO, INSTR(EMP_NO, '-')+1, 1), 1, '남' , '여') 성별 , FLOOR (AVG(SALARY)), SUM(SALARY), COUNT(*) 인원수
FROM EMPLOYEE
GROUP BY DECODE(SUBSTR(EMP_NO, INSTR(EMP_NO, '-')+1, 1), 1, '남' , '여')
ORDER BY 인원수 DESC;

-- EMPLOYEE 테이블에서 부서 코드 별로 같은 직급인 사원의 급여 합계 조회(부서코드 순 정렬)

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

2-2) HAVING

  • HAVING 절은 집계함수(COUNT, MAX, MIN, SUM, AVG)를 가지고 조건을 설정할 때 사용한다.
  • HAVING절은 GROUP BY절과 함께 사용이 된다.

예제

-- 부서코드와 급여 펴균이 3000000이상인 그룹 조회

SELECT DEPT_CODE, AVG(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING AVG(SALARY) >= 3000000;

-- 부서별 그룹의 급여 합계 중 9백만을 초과하는 부서코드와 급여 합계

SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING SUM(SALARY) >= 9000000;

(3) SET OPERATION

SET OPERATION 종류

  • UNION : 합집합, OR의 개념
  • INTERSECT : 교집합
  • UNION ALL : 합집합 + 교집합 (중복 2번 나옴)
  • MINUS : 차집합 (공통된 부분 빼고 나만 가지고 있는 부분)
--UNION
--컬럼명 다른 것들 끼리 합치기 (열의 개수만 맞으면 됨) 

SELECT EMP_NAME
FROM EMPLOYEE
WHERE EMP_ID = 200
UNION -- 위 컬럼명 EMP_NAME 기준
SELECT DEPT_TITLE
FROM DEPARTMENT
WHERE DEPT_ID = 'D9';

--UNION ALL

SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
UNION ALL
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;

--INTERSECT

SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
INTERSECT
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;

--MINUS

SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
MINUS
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
profile
나의 코딩 다이어리🖥️👾✨

0개의 댓글