5 SELECT : 검색 대상 컬럼(표현식)
1 FROM : 검색 대상 집합
2 WHERE : 행 제한을 위한 조건식
3 GROUP BY : 그룹 생성
4 HAVING : 그룹 제한을 위한 조건식
6 ORDER BY : 정렬
FROM
-> WHERE
-> GROUP BY
-> HAVING
-> SELECT
-> ORDER BY
AVG
COUNT
MAX
MIN
SUM
LISTAGG
STDDEV
VARIANCE
NVL함수
사용distinct
함수 사용SELECT SUM(order_total), AVG(order_total), MAX(order_total), MIN(order_total)
FROM orders ;
SELECT COUNT(*)
FROM employees
WHERE department_id = 50;
SELECT COUNT(commission_pct)
FROM employees
WHERE department_id = 50;
SELECT COUNT(DISTINCT department_id)
FROM employees;
SELECT SUM(commission_pct)/COUNT(*)
,AVG(NVL(commission_pct,0))
,AVG(commission_pct)
,SUM(commission_pct)/COUNT(commission_pct)
FROM employees ;
SELECT ...
FROM ...
[WHERE ...][GROUP BY ...]
[ORDER BY ...]
SELECT department_id, SUM(salary)
FROM employees
GROUP BY department_id ;
-- 예를들어, 여기서 GROUP BY절에 job_id가 없으면 오류남
SELECT department_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id ;
-- 오류 발생 (GROUP BY절에 department_id 써줘야됨)
SELECT department_id, SUM(salary)
FROM employees ;
SELECT AVG(salary)
FROM employees
GROUP BY department_id;
-- 오류발생
-- group by절을 추가해줘야 함
select department_id, count(last_name)
from employees;
-- 오류발생
-- group by에서 job_id를 추가하거나, select list에서 job_id를 제거해야함
select department_id, job_id, count(last_name)
from employees
group by department_id;
HAVING절
사용WHERE절
에서 그룹함수 사용 할 수 X-- 오류 발생 (WHERE절에서 그룹함수 사용 할 수 X)
-- (해결법: HAVING절 사용해주기)
SELECT department_id, AVG(salary)
FROM employees
WHERE AVG(salary) > 8000
GROUP BY department_id;
HAVING절을 사용할 경우, Oracle 서버는 다음과 같이 그룹을 제한함
1. 행이 그룹화 됨
2. 그룹함수가 적용됨
3. HAVING절과 일치하는 그룹이 표시됨
SELECT ...
FROM ...
[WHERE ...][GROUP BY ...]
[HAVING ...][ORDER BY ...]
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000 ;
SELECT job_id, SUM(salary) PAYROLL
FROM employees
WHERE job_id NOT LIKE '%REP%'
GROUP BY job_id
HAVING SUM(salary) > 13000
ORDER BY SUM(salary);
SELECT MAX(AVG(salary))
FROM employees
GROUP BY department_id;
-- 오류발생
SELECT SUM(MAX(AVG(salary)))
FROM employees
GROUP BY department_id;
-- 이런 식으로 단일행 함수 중첩은 상관 없음
SELECT ROUND(MAX(AVG(salary)))
FROM employees
GROUP BY department_id;