22일차//[Oracle] ORDER BY, GROUP BY (+ 년 월 일)
GROUP BY절 사용법
GROUP는 특정 컬럼을 기준으로 집계를 내는데 사용된다.
일단 예를 들어 보도록 하겠습니다.
아래와 같이 학급 전체의 성적을 나타내는 테이블이 있습니다.
class는 반 명이며 name 학생 이름 score는 해당 학생의 성적 점수 입니다.
이제 이런 학급 전체 성적을 학급 별로 총합 집계를 내고 싶으면 group by를 이용합니다.
SELECT CLASS, SUM(SCORE) FROM TBL_REPORT_CARD GROUP BY CLASS; |
그럼 다음과 같이 학급별로 점수 총합의 결과가 출력 됩니다.
Group by를 사용 하는 방법은 아래와 같습니다.
SELECT [GROUP BY 절에 지정된 컬럼1] [GROUP BY별로 집계할 값] FROM [테이블 명] GROUP BY [ 그룹으로 묶을 컬럼 값 ] |
Having절 사용법
Having 절은 Group by로 집계된 값 중 where 절 처럼 특정 조건을 추가한다고 생각 하시면 됩니다.
예를 들어 학급별 총합 결과 중에 150점 이상인 것만 출력 하고 싶으면 다음과 같이 예제를 작성하면 됩니다.
SELECT CLASS, SUM(SCORE) FROM TBL_REPORT_CARD GROUP BY CLASS HAVING SUM(SCORE) > 150 ; |
결과 값은 아래와 같습니다.
Having 절을 사용 하는 방법은 아래와 같습니다.
SELECT [GROUP BY 절에 지정된 컬럼1] [GROUP BY별로 집계할 값] FROM [테이블 명] GROUP BY [ 그룹으로 묶을 컬럼 값 ] HAVING [조건 추가] ; |
/*
ORDER BY == SORTING
SELECT COLUM VALUE SUB QUERY
FROM TABLE SUB QUERY
WHERE IF
ORDER BY COLUMN ASC DESC
*/
DESC EMP;
SELECT ename,sal
FROM emp
ORDER BY sal ASC;--오름차순
SELECT ename,sal
FROM emp
ORDER BY sal DESC;
--alias
SELECT empno, ename, sal*12 AS annsal
FROM emp
ORDER BY annsal DESC;
--보너스 없는 사람 순으로
SELECT ename, comm
FROM emp
ORDER BY comm NULLS FIRST;
SELECT employee_id,job_id, salary
FROM employees
ORDER BY job_id ASC, salary DESC;
--months_between :
SELECT sysdate
FROM DUAL;
SELECT MONTHS_BETWEEN('2021-06-23', '2021-02-09')
FROM dual;
--add_months : 특정 날짜 월에 정수를 더한 다음 해당 날짜를 반환한다.
SELECT ADD_MONTHS('2021-02-09', 4)
FROM DUAL;
-- 년 월 일
SELECT EXTRACT(year from TO_DATE('210623','YYMMDD')) AS 연도,
EXTRACT(month from TO_DATE('210623','YYMMDD')) AS 월,
EXTRACT(day from TO_DATE('210623','YYMMDD')) AS 일
FROM DUAL;
-- 시 분 초
SELECT EXTRACT(hour from CAST(SYSDATE AS TIMESTAMP)) AS 시,
EXTRACT(MINUTE from CAST(SYSDATE AS TIMESTAMP)) AS 분,
EXTRACT(SECOND from CAST(SYSDATE AS TIMESTAMP)) AS 초
FROM DUAL;
SELECT EXTRACT(hour from CAST(TO_DATE('2021-06-23 09:42:02','YYYY-MM-DD HH24:MI:SS') AS TIMESTAMP)) AS 시,
EXTRACT(MINUTE from CAST(SYSDATE AS TIMESTAMP)) AS 분,
EXTRACT(SECOND from CAST(SYSDATE AS TIMESTAMP)) AS 초
FROM DUAL;
/*
GROUP BY : 그룹으로 묶는 기능
*/
SELECT DISTINCT job_id
FROM employees;
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY department_id ASC;
/*
통계 - GROUP FUNCTION
count
sum
avg
max
min
*/
--
SELECT COUNT(salary), count(*), sum(salary), avg(salary), max(salary), min(salary)
FROM employees
WHERE job_id = 'IT_PROG';
SELECT job_id, count(*), sum(salary), avg(salary) --count 업무별로 몇명이냐, 합계는 몇이냐, 평균은 몇이냐
FROM employees
GROUP BY job_id
ORDER BY job_id;
SELECT job_id, sum(SALARY)
FROM employees
GROUP BY job_id
HAVING SUM(salary) >=100000; --having절은 그룹하고 사용
급여가 5000이상 받는 사원만으로 합계를 내서 업무(JOB_ID)로 그룹화하여
급여의 합꼐가 20000을 초과하는 업무명을 구하라
SELECT job_id, sum(salary)
FROM employees
WHERE salary >=5000
GROUP BY job_id
HAVING SUM(salary) > 20000;