DB/Oracle

Oracle DB5_ 그룹함수, 서브쿼리

Codezoy 2019. 9. 20. 09:00



Goals
  • 그룹 함수 : AVG, COUNT, MAX, MINN, STDDEV, SUM, VARIANCE, ORDER BY, GROUP BY, HAVING
  • Sub Query, 다중행 Sub Query, 다중 컬럼 Sub Query
  • ANY, ALL, IN



Notes

다중행 함수(multi-row function, group function)

여러개의 행이 함수로 argument로 전달돼서 하나의 결과값이 출력되는 함수

AVG : 데이터의 평균
COUNT : 데이터의 갯수를 리턴 : Null 이 아닌 값이 몇 개가 있는지 알아낼 때 유용하게 사용
MAX : 데이터의 최고값
MIN  : 데이터의 최소값
STDDEV : 데이터의 표준편차
SUM : 데이터의 총합
VARIANCE : 데이터의 분산

> count(distinct deptno) from emp; 중복되지 않는 값들의 갯수를 리턴한다.

> select empno, count(empno) from emp; -- 행의 개수가 다르기 때문에 에러가 발생.
>(주의) 여러 행이 결과로 출력되는 변수와 그룹함수는 함께  select 할 수 없다.

> Max(), Min() 함수는 Date 타입에도 사용할 수 있다.
> select max(hiredate), min(hiredate) from emp; -- 옛날이 더 적은 것, 미래가 더 큰 것.


ORDER BY

select column from table ORDER BY 칼럼 asc/desc ;
디폴트 값이 오름차순(asc) 생략 가능.
SELECT * FROM emp order by ename;

select * from emp order by deptno asc, empno desc; -- 먼저 나오는 컬럼 기준으로 정렬 후, 두 번째 기준으로 다시 정렬







GROUP BY

그룹 함수를 사용할 때  GROUP BY




HAVING
<순서 기억>

SELECT    
FROM    

WHERE : SELECT에 대한 조건

GROUP BY  그루핑할 컬럼명  
HAVING : GROUP BY에 대한 조건    
ORDER BY ~~~가장 마지막에!


※ 모든 그룹 함수들은 NULL 을 제외하고 연산한다.

> NULL을 0으로 대체한 뒤에 연산하자

SELECT SUM(comm), AVG(comm), AVG(NVL(comm, 0))     from emp;

> Group by에서 사용되지 않은 변수(컬럼)은 select할 수 없음

※ SELECT에서 만든 컬럼의 별명(alias)HAVING절에서는 사용할 수  없음.





  • Sub Query :
-- SELECT 문장 안에 새로운 SELECT 문장이 있는 것.

-- 단행 Sub Query : Sub Query의 한 컬럼의 값을 비교, SubQuery에서 단일 컬럼을 리턴

select empno, ename
  from emp
  where empno = (select mgr  from emp
                            where empno = 7369);





  • 다중행 Sub Query : ALL (AND), ANY (OR과 유사)
-- Sub Query의 여러 값과 비교
-- Sub Query가 여러 컬럼을 리턴한다.

select ENAME, JOB, SAL from emp
where sal < ANY ( select sal from emp
                        where job = 'ANALYST');


  • 다중 컬럼 Sub Query
--서브쿼리에 Select 대상을 2개 이상 반환한다.

select * from emp
where (deptno, sal) in (
    select deptno, min(sal) from emp group by deptno
);

-- (deptno, sal)(deptno, min(sal)) 의 쌍이 일치해야 한다.



ANY : 여기있는 값들 가운데 하나
ALL : 여기있는 값들 모두와
IN : ANY + =
(ALL, ANY는 부등호 비교 가능)