SQL 함수3

max - 최대값을 출력하는 함수

다음과 같이 해보자.

emp 테이블에서 월급이 제일 큰것을 출력하려면.

select max(sal)
  from emp;

MAX(SAL) 
---------
   5000

자, 다음은 직업이 SALESMAN 인 사원이 받는 월급 중 가장 많은 월급과 함께 직업을 같이 출력하려면..
select job, max(sal)
  from emp
   where job='SALESMAN';

-'단일 그룹의 그룹 함수가 아닙니다' 라는 메시지를 볼수 있다.

여기서 문제가 뭐냐하면, job이 SALESMAN 인 row 는 여러개니까 그것이 다 출력되려고 하고,
max 값은 최대값으로 하나만 나오려고 하니까 둘이 다투다가 문제가 생기는 것이다.
따라서, 여기서 필요한 건 뭐?!

group by 절이 필요하게 된다.

일단 써보면,
select job, max(sal)
   from emp
   where job='SALESMAN'
   group by job;
  
JOB                   MAX(SAL)
----------------------------
SALESMAN            1600


위 쿼리에서 where 절을 빼면 각 직업별로 최대 월급이 출력된다.

JOB                   MAX(SAL)
----------------------------
CLERK                  1300
SALESMAN           1600
PRESIDENT            5000
MANAGER             2975
ANALYST              3000

이처럼 grouping 을 하는 것이 group by 절의 역할이다.

그러면 위 결과에서 최대월급이 3000보다 큰 것만 출력하려면..
 select job, max(sal)
   from emp 
   where max(sal) >= 3000
   group by job;

위 쿼리를 날렸더니~ '그룹 함수는 허가되지 않습니다' 라는 메시지를 볼수 있다. ㅡ,.ㅡ;
여기서 알아볼 것은 위 쿼리에서의 실행 순서이다.
쿼리 실행 순서를 살펴보면...


코딩순서(위->아래), 실행순서(번호순)

      select                        5
      from                           1
      where                        2
      group by                     3
      having                        4
      order by                      6

from -> where -> group by -> having -> select -> order by
이렇게 실행이된다.

이 실행순서를 보고 원하는 결과값을 얻으려면 where 절의 조건을 having 절에다 쓰면된다.
having 절은 뭐냐하면 group by 한 결과의 조건을 줄때 사용하는 절이다.
그래서, 위의 쿼리를 고쳐보면..

 select job, max(sal)
   from emp 
--   where max(sal) >= 3000
   group by job
   having max(sal) >= 3000;

JOB  MAX(SAL)
----------------------------
PRESIDENT 5000
ANALYST  3000


-- 는 주석을 뜻한다.
주석은 쿼리문의 실행에 영향을 미치지 않는다.
-- 는 한줄짜리 주석일때 사용하고
/*  */ 은 여러 줄을 주석으로 처리할때 사용한다.
참고할것!!


최대값을 알아봤으니 이제 최소값을 알아볼건데..

min - 최소값을 출력해주는 함수

이것 역시 쓰임은 max 와 동일하다. 위 쿼리에서 max 부분을 min 으로 하면 최대 결과 값이 아닌
최소값을 얻을 수 있다.

여기서 max 와 min 은 날짜에도 적용할 수있는데
과거날짜와 현재날짜를 비교하면 현재날짜가 더 크다.
그래서 다음과 같이 emp 테이블에서 가장 먼저 입사한 사원의 입사일을 출력하려면..

select min(hiredate) from emp;

MIN(HIREDATE)
--------------
1980-12-17

이렇게 구할 수가 있다.


count
- 카운트 해주는 함수

일단 예를 보면,
각 부서별로 인원수를 알고 싶다면..

select deptno, count(*)
  from emp
  group by deptno;


DEPTNO COUNT(*)
--------------------
30              6
20              5
10              3


위처럼 사용할 수 있다.
뭐.. 더 궁금한게 있으면.. 무엇이든 물어보세요~!!
(어디서 이런 강한 자신감이 나오는지 원.. ㅡ,.ㅡ;)


avg - 평균값을 출력해주는 함수

각 직업별로 월급의 평균값을 알고 싶다면...

select job, avg(sal)
    from emp
    group by job;


JOB                           AVG(SAL)
---------------------------------------
CLERK                      1037.5
SALESMAN               1400
PRESIDENT               5000
MANAGER                 2758.33333333333
ANALYST                  3000


여기까지 했으면 함수는 거의 다 본거 같고..
다음은...

'SQL > 공부' 카테고리의 다른 글

메인쿼리-서브쿼리(Main Query - Sub Query)  (0) 2007.12.07
SQL - 조인  (0) 2007.12.07
SQL 함수2  (0) 2007.11.29
SQL - 함수  (0) 2007.11.26
SQL 2강  (0) 2007.11.23