본문 바로가기
데이터베이스/Oracle

[Oracle] Select절 - group by, having

by BGwon_C 2023. 8. 7.

select (해석 순서 1 2 3 4 5)

 

select [distinct] [컬럼1, 컬럼2,.....][as 별명][ || 연산자][*] --- 6

from 테이블명 --- 1

[where 조건절] --- 2

[group by 컬럼명] --- 3

[having 조건절] --- 4

[order by 컬럼명 asc|desc ] --- 5

 

group by : 그룹함수(max, min, sum, avg, count..)와 같이 사용

having : 묶어놓은 그룹의 조건절

 

ex1) 사원테이블에서 급여의 평균을 구하시오

조건) 소수 이하는 절삭, 세자리 마다 콤마(,) 표시

사원급여평균

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

6,461

 

select to_char(trunc(avg(salary), 0), '99,999') as 사원급여평균 from employees;

 

ex2) 부서별 급여평균을 구하시오

조건1) 소수 이하는 반올림

조건2) 세자리 마다 콤마, 화폐 단위()로 표시

조건3) 부서별로 오름차순 정렬하시오

조건4) 평균급여가 5000이상인 부서만 표시하시오

부서코드 평균급여

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

10 8,600

 

select department_id as 부서코드,

to_char(round(avg(salary), 0), 'L99,999,999') as 평균급여

from employees

group by department_id

having avg(salary) >= 5000

order by department_id asc;

 

ex3) 부서별 급여평균을 구해서 사원명(last_name), 부서별 급여평균을 출력하시오 X

(에러 메시지 : group by 표현식이 아닙니다. -> 그룹으로 묶은 애들만 select로 올 수 있다. but, 여기서는 그루핑 시킨적이 없는 last_name이 왔기 때문에 에러가 뜬 것

so, group by를 쓰면 select에는 그루핑을 시켰거나, 그룹함수를 쓴 애들만 올 수 있다.)

select last_name, avg(salary)

from employees

group by department_id;

 

last_name 때문에 error - group by절에 없는 것을 select에 조회하면 error

 

[문제1] job_id별 급여의 합계를 구해서 job_id, 급여합계를 출력하시오

 

ex4) 비효율적인 having

1020부서에서 최대급여를 받는 사람의 최대급여를 구하여 정렬하시오

 

department_id max_salary

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

10 4400

20 13000

 

select department_id, max(salary) as max_salary

from employees

group by department_id

having department_id in(10, 20)

order by department_id;

전체 부서에 대해 그룹을 잡아서 최대급여를 구한 후에 부서가 1020인 것을 추려내기 때문인 것

 

select department_id, max(salary) as max_salary

from employees

where department_id in(10, 20)

group by department_id

order by department_id;

부서번호가 1020인 것만 골라내서 그룹잡기 때문에 속도가 좀 빠르다

 
 
 
 

 

문제답 :
더보기
--문제1
select job_id, to_char(sum(salary), '999,999') as 급여합계 from employees group by job_id;

'데이터베이스 > Oracle' 카테고리의 다른 글

[Oracle] 서브쿼리  (0) 2023.08.07
[Oracle] UNION, UNION ALL, INTERSECT, MINUS  (0) 2023.08.07
[Oracle] Join(조인)  (0) 2023.08.02
[Oracle] DDL / DML / DCL  (0) 2023.08.02
[JDBC] 웹과 오라클DB 연동하기  (0) 2023.08.01

댓글