ㅁ GROUP BY & HAVING
- 같은 값을 가진 데이터들을 하나의 그룹으로 묶어서 처리
- 주로 그룹 함수와 함께 사용함
- SELECT 컬럼, 산술식, 함수식 , ... AS "별칭"
FROM 테이블명
WHERE 조건식
GROUP BY 그룹기준의 컬럼 | 함수식, ...
ㅁ 유의사항. GROUP BY절에 명시한 컬럼만 SELECT절에 작성이 가능하다.
- 그룹함수에 인자로 주는 컬럼값 말고, 그냥 조회할 때 GROUP BY절에 명시한 컬럼만 SELECT에 작성 가능하다는 것.
SELECT *
FROM EMPLOYEE
GROUP BY DEPT_CODE;
- 오류
- GROUP BY에 DEPT_CODE(컬럼)를 제시하면 DEPT_CODE(컬럼)값이 '일치하는' 데이터끼리 묶인다.
ㅁ GROUP BY절은 GROUP 함수와 함께 쓸 수 있다.
- 그룹함수는 그룹당 1개의 결과를 반환.
7개의 그룹이니까 7개의 결과를 반환.
ㅁ 그룹함수는 그룹별로 실행된다.
- GROUP BY를 쓰면 보통 그룹함수를 쓴다. 안쓰는 경우가 없다.
SELECT JOB_CODE
, COUNT(*)
, SUM(SALARY)
, TO_CHAR(AVG(SALARY), 'L9,999,999')
FROM EMPLOYEE
GROUP BY JOB_CODE;
- TO_CHAR에 작은 따옴표 써야지, 큰 따옴표 쓰면 오류남.
- 급여여서 몇백만 단위라서, 'L999,999'쓰면 오류남.
ㅁ GROUP BY절에 함수식도 기술 가능하다
- GROUP BY에 SUBSTR(EMP_NO, 8, 1)를 쓰면, SUBSTR(EMP_NO, 8, 1)이 일치하는 데이터끼리 묶인다.
- GROUP BY절에 컬럼을 주면, 그 컬럼의 값이 일치하는 데이터끼리 묶이고,
GROUP BY절에 함수식을 주면, 그 함수식의 값이 일치하는 데이터끼리 묶인다.
- 예를 들어, GROUP BY TO_CHAR(HIRE_DATE, 'YYYY')와 같이 사용하면, 입사 년도의 연도 부분을 추출하여 그 값이 동일한 행들이 하나의 그룹을 형성합니다.
- DECODE 함수 사용.
ㅁ 예제 (입사년도별 사원수)
- 입사년도별 사원수 어느 년도에 사원이 많이 입사했는지.
ㅁ GROUP BY 절에 컬럼 여러개 작성 가능
- 두개가 쌍으로 묶여서 일치하는 데이터끼리 묶임.
- 부서와 직급이 일치하는 사원들을 그룹으로 묶음.
ㅁ < HAVING 절 >
- 필수는 아니고 선택적으로 GROUP BY절과 함께 사용된다.
- 그룹함수에 대한 조건을 제시할 때 주로 사용된다.
- SELECT 컬럼, 산술식, 함수식 , ... AS "별칭"
FROM 테이블명
WHERE 조건식
GROUP BY 그룹기준의 컬럼 | 함수식, ...
HAVING 그룹함수식을통한조건 | 그룹칼럼을통한조건
ㅁ 예제 (각 부서별 평균 급여 조회)
SELECT DEPT_CODE, AVG(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE;
- 참고로 (null)을 포함한 7개의 행이 나옴.
ㅁ 예제 (부서별 평균급여가 300만원 이상인 부서만을 조회)
SELECT DEPT_CODE, AVG(SALARY)
FROM EMPLOYEE
WHERE AVG(SALARY) = 3000000 // 오류
GROUP BY DEPT_CODE;
- FROM절 뒤에 WHERE 절로 AVG(SALARY) = 3000000 가능? 노노. 실행순서상.
- 그룹함수식을 가지고 WHERE절에 조건작성 불가
ㅁ 예제 (직급별 급여합이 1000만원 이상인 직급만을 조회)
ㅁ 예제 (부서별 보너스를 받는 사원이 없는 부서만을 조회)
ㅁ < SELECT 실행순서 >
(5) SELECT 조회하고자하는 컬럼 AS 별칭 | 산술식 "별칭" | 함수식 AS "별칭"
(1) FROM 조회하고자하는 테이블명
(2) WHERE 조건식 (연산자를 가지고 기술)
(3) GROUP BY 그룹기준으로 삼을 컬럼 | 함수식
(4) HAVING 조건식 (그룹함수를 가지고 기술)
(6) ORDER BY 컬럼 | 별칭 | 순번 [ ASC | DESC ] [ NULLS FIRST|NULLS LAST ]
- ORDER BY절이 유일하게 SELECT절 다음으로 와서 별칭을 쓸 수 있다.
ㅁ 예제
ㅁ 예제
- 데이터베이스에서 GROUP BY 절은 기본적으로 NULL 값을 하나의 그룹으로 취급합니다.
ㅁ 예제
ㅁ 예제
ㅁ 예제
- 둘 다 같다.
- HAVING에 그룹함수 외의 일반 조건도 올 수 있다.
- WHERE 절이 행 단위의 조건을 필터링하는 반면에, HAVING 절은 그룹 단위의 조건을 필터링한다.
ㅁ 예제
- 이걸 집합연산자를 사용해서 똑같이 작성 가능.
SELECT문 3개를 기술하고 합침.
[고급 등급 사원수]
SELECT '고급', COUNT(*)
FROM EMPLOYEE
WHERE SALARY >= 5000000;
[중급 등급 사원수]
SELECT '중급', COUNT(*)
FROM EMPLOYEE
WHERE SALARY < 5000000 AND SALARY >= 3500000;
[초급 등급 사원수]
SELECT '초급', COUNT(*)
FROM EMPLOYEE
WHERE SALARY < 3500000;
- 첫번째, 두번째 쿼리의 세미콜론을 지우고, UNION을 작성한다. (하나의 쿼리로 묶는다)
ㅁ < 집합 연산자 SET OPERATION >
- 여러 개의 쿼리문을 가지고 하나의 결과물로 조회하는 연산자
- UNION 합집합
- INTERSECT 교집합
- UNION ALL 합집합+교집합
- MINUS 차집합
ㅁ 집합 연산자 유의사항
- 각 쿼리문의 SELECT절에 작성되는 컬럼 갯수 동일
- 각 쿼리문의 SELECT절에 작성되는 컬럼 타입 동일 (EMP_ID와 EMP_NAME 간의 연산 불가)
- ORDER BY절은 마지막 쿼리에 작성해야 한다.
ㅁ 예제
SELECT *
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
UNION
SELECT *
FROM EMPLOYEE
WHERE SALARY > 3000000
ORDER BY EMP_ID // 오류
;
- ORDER BY절은 마지막 쿼리에 작성해야 하는건 맞는데, 이렇게는 안 됨.
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
UNION
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000
ORDER BY EMP_ID
;
- 이거는 가능.
'클라우드 활용 자바개발자 양성과정 > 02. 데이터베이스 활용' 카테고리의 다른 글
05. SUBQUERY (0) | 2024.07.19 |
---|---|
04. JOIN (조인문) (0) | 2024.07.18 |
02. SELECT (함수) (0) | 2024.07.17 |
01. SELECT (기본 문법) (0) | 2024.07.16 |
0. 오라클 설치 (0) | 2024.07.15 |