본문 바로가기

프로그래밍/네트워크 프로그래밍

네트워크 프로그래밍-DB(집계함수와 group/정렬)


집계함수


집계함수란? 개수를 세거나, 합계를 구하거나, 평균, 최대/최솟값 등을 구하는 함수.


STUDENT_ID     STUDENT_NAME         STUDENT_SCORE

--------------    --------------------        -------------

2017112         홍길순                         350

2017113         김철수                         400

2017114         김지연                         420


netdream 계정에 들어가서 이전에 만든 school table을 다시 불러온다.

school table의 내용은 위와 같다.



count 함수: count 함수는 레코드의 갯수를 세주는 함수이다.




SQL> select count(student_id) from school;

student_id의 레코드가 몇개 있는지를 출력하라는 명령어

COUNT(STUDENT_ID)

-----------------

                3




sum 함수는 합계를 구하는 함수이고, avg 함수는 평균을 구하는 함수이다.


 SQL> select sum(student_score), avg(student_score) from school;

student_score의 합계와 평균을 출력하라는 명령어이다.

SUM(STUDENT_SCORE)     AVG(STUDENT_SCORE)

------------------                ------------------

              1170                                   390


max함수는 최댓값, min 함수는 최솟값을 출력하는 함수이다.


SQL> select max(student_score), min(student_score) from school;

student_score의 최댓값(420)과 최솟값(350)을 출력해준다.

MAX(STUDENT_SCORE)     MIN(STUDENT_SCORE)

------------------             ------------------

               420                            350




그룹

그룹 명령어는 출력결과를 특정 그룹으로 묶어서 출력하고싶을 때 사용한다.


group by 명령어: group by 뒤에 attribute를 사용하여 해당 attribute로 그룹을 묶을 때 사용한다. 해당 명령어는 주로 집계함수와  같이 사용한다.

having 명령어; group by 명령어는 조건을 지정해주는 where과 사용이 불가능하다. 이럴 때는 having 명령어를 사용해서 출력을 해 줄 수 있다.


실습을 위해 이전에 계정을 unlock했던 scott 계정으로 접속한다. 


scott 계정에는 기본으로 emp 테이블이 있으며 해당 테이블의 구조는 다음과 같다.



여기서 각 group by 명령어를 사용해 JOB의 종류를 group 지을 수 있다.



SQL> select job from emp group by job;

JOB을 그룹지어서 출력하라는 명렁이다. 결과로 밑에와 같이 JOB의 종류가 출력된다.

JOB

------------------

CLERK

SALESMAN

PRESIDENT

MANAGER

ANALYST


group by 명령어는 주로 집계함수와 같이 사용한다.



SQL> select job avg(sal) from emp group by job;

SAL attribute는 월급을 나타낸다. 이때 각 직업별 월급을 구하고 싶다면 위와 같이 입력해주면된다.

즉 job별로 묶어서 각 job별 평균 월급을 출력하라는 뜻이다.

JOB                  AVG(SAL)

------------------ ----------

CLERK              1016.66667

SALESMAN        1400

PRESIDENT        5000

MANAGER         2758.33333

ANALYST           3000


having문을 결합해 조건을 부여 하면 이런식으로도 출력이 가능하다.


SQL> select job, avg(sal) from emp group by job having avg(sal) >= 3000;

평균 월급이 3000 이상인 사람의 job과 평균 월급을 직업(job)별로 출력하라는 명령어이다.

JOB                     AVG(SAL)

------------------     ----------

PRESIDENT                5000

ANALYST                  3000



정렬

정렬은 오름차순 혹은 내림차순으로 출력할 때 사용하는 명령어이다.


order by [attribute] asc는 오름차순으로 출력해주고

order by [attribute] desc는 내림차순으로 출력해준다.


SQL> select job, avg(sal) from emp group by job order by avg(sal) desc;

job과 평균 월급을 직업별로 평균 월급이 큰 순서대로(내림차순)으로 출력하라는 명령어이다.

JOB                  AVG(SAL)

------------------ ----------

PRESIDENT        5000

ANALYST           3000

MANAGER         2758.33333

SALESMAN         1400

CLERK               1016.66667



정렬은 때때로 rank over 함수와 같이 쓰이기도한다. rank 함수는 순위를 나타내는 함수이다.



SQL> select job, avg(sal), rank() over(order by avg(sal) desc) from emp group by job;

job과, 평균월급과 그에 따른 순위를 직업별로 출력하라는 명령어. 출력 시 정렬은 물론 순위까지 같이 출력해준다.


JOB                  AVG(SAL)     RANK()OVER(ORDERBYAVG(SAL)DESC)

------------------ ----------       -------------------------------

PRESIDENT                5000                               1

ANALYST                  3000                               2

MANAGER            2758.33333                           3

SALESMAN                 1400                              4

CLERK              1016.66667                               5