< 문제 모음 >
-- 고객 중에서 '차일호'와 나이가 같은 고객자료 출력
select * from gogek where substr(gogek_jumin,1,2) = (select substr(gogek_jumin,1,2) from gogek where gogek_name='차일호');
-- 인천에서 근무하는 직원 출력
select * from sawon where buser_num = (select buser_no from buser where buser_loc='인천');
-- where 조건이 복수
-- 2번 직원과 직급이 같고, 직급이 사원인 직원의 평균 연봉보다 급여가 많은 직원 출력
select sawon_no, sawon_name, sawon_pay from sawon where sawon_jik=(select sawon_jik from sawon where sawon_no=7) and sawon_pay >= (Select avg(sawon_pay)
from sawon where sawon_jik='사원');
--SAWON, BUSER, GOGEK 테이블을 사용한다.
--문1) 2000년 이후에 입사한 남자 중 급여를 가장 많이 받는 직원은?
select * from sawon
where sawon_pay = (select max(sawon_pay) from sawon where sawon_gen = '남' and sawon_ibsail > '2000-1-1' );
--문2) 평균급여보다 급여를 많이 받는 직원은?
select * from sawon
where sawon_pay >= (select avg(sawon_pay) from sawon);
--문3) '한국남' 직원의 입사 이후에 입사한 직원은?
select * from sawon
where sawon_ibsail >= (select sawon_ibsail from sawon where sawon_name = '한국남');
--문4) 2000 ~ 2005 사이에 입사한 총무부,영업부,전산부 직원 중 급여가 가장 적은 사람은?
-- (직급이 NULL인 자료는 작업에서 제외)
select * from sawon where sawon_pay = (select min(sawon_pay) from sawon
where sawon_ibsail >='2000-1-1' and
sawon_ibsail <'2006-1-1' and
buser_num in(select buser_no from buser where buser_name in('총무부','영업부','전산부')) and sawon_jik is not null);
--문5) 이순라, 이순신과 직급이 같은 사람은 누구인가?
select * from sawon
where sawon_jik in(select sawon_jik from sawon where sawon_name = '이순신' or sawon_name = '이순라');
--문6) 과장 중에서 최대급여, 최소급여를 받는 사람은?
select * from sawon
where sawon_jik = '과장' and
sawon_pay in((select min(sawon_pay) from sawon where sawon_jik = '과장'),(select max(sawon_pay) from sawon where sawon_jik = '과장'));
--문7) 20번 부서의 최소급여보다 많은 사람은?
select * from sawon
where sawon_pay > (select min(sawon_pay) from sawon where buser_num = 20);
--문8) 30번 부서의 평균급여보다 급여가 많은 '대리' 는 몇명인가?
select count(sawon_jik) 인원수 from sawon
where sawon_jik = '대리' and
sawon_pay > (select avg(sawon_pay) from sawon where buser_num = 30) group by sawon_jik;
--문9) 고객을 확보하고 있는 직원들의 이름, 직급, 부서명을 입사일 별로 출력하라.
select sawon_name, sawon_jik,buser_name from sawon
left outer join buser on buser_num=buser_no
where sawon_no in(select distinct gogek_damsano from gogek)
order by sawon_ibsail;
--문10) 이순신과 같은 부서에 근무하는 직원과 해당 직원이 관리하는 고객 출력
--(고객은 나이가 30 이하면 '청년', 40 이하면 '중년', 그 외는 '노년'으로 표시하고, 고객 연장자 부터 출력)
--출력 ==> 직원명 부서명 부서전화 직급 고객명 고객전화 고객구분
-- 한송이 총무부 123-1111 사원 백송이 333-3333 청년
select sawon_name 직원명, buser_name 부서명, buser_tel 부서전화, sawon_jik 직급, gogek_name 고객명, gogek_tel 고객전화,
case when (100 + to_char(sysdate,'YY') - substr(gogek_jumin,1,2)) <= 30 then '청년'
when (100 + to_char(sysdate,'YY') - substr(gogek_jumin,1,2)) <=40 then '중년' else '노년' end 고객구분 from sawon
inner join gogek on sawon_no = gogek_damsano
inner join buser on buser_num = buser_no
where buser_num = (select buser_num from sawon where sawon_name = '이순신')
order by 고객구분;
< subquery 추가 연습 >
-- subquery 추가 연습 : any와 all 연산자
-- < any : subquery의 반환값 중 최대값보다 작은 ~
-- > any : subquery의 반환값 중 최대값보다 큰 ~
-- < all : subquery의 반환값 중 최소값보다 작은 ~
-- < all : subquery의 반환값 중 최대값보다 작은 ~
-- 대리의 연봉이 최대값보다 작은 자료 출력
select * from sawon
where sawon_pay < any (select sawon_pay from sawon
where sawon_jik='대리');
-- 30번 부서의 최대 급여자 보다 급여를 많이 받는 사람은?
select * from sawon
where sawon_pay > all (select sawon_pay from sawon
where buser_num=30);
-- 총무부에 근무하는 직원들이 관리하는 고객 출력
-- 방법1 : subquery
select gogek_no, gogek_name, gogek_jumin from gogek
where gogek_damsano in(select sawon_no from sawon where
buser_num=(select buser_no from buser where buser_name='총무부'));
-- 방법2 : join
select gogek_no, gogek_name, gogek_jumin from gogek
inner join sawon on sawon_no=gogek_damsano
inner join buser on buser_num=buser_no
where buser_name='총무부';
-- exists 연산자 사용 - subquery의 결과
-- 직원이 있는 부서 출력
select buser_name, buser_loc from buser bu
where not exists (select 'imsi' from sawon
where buser_num=bu.buser_no);
-- from 절에 subquery 사용 : inline view
-- 직원 전체 평균 급여와 최대 급여 사이의 급여를 받는 직원 출력
select sawon_no, sawon_name, sawon_pay
from sawon a, (select avg(sawon_pay) avgs, max(sawon_pay) maxs from sawon) b
where a.sawon_pay between b.avgs and b.maxs;
-- group by의 having 절 안에 subquery 사용
-- 부서별 평균급여중 20번 부서의 평균 급여보다 큰 자료만 출력
select buser_num, avg(sawon_pay) from sawon
group by buser_num
having avg(sawon_pay) > (select avg(sawon_pay) from sawon
where buser_num=20);
< 상관 서브쿼리 : 안쪽 질의의 결과를 바깥쪽에서 참조하고, 다시 안쪽에 결과를 바깥쪽 질의에서 참조하는 형태 >
-- 각 부서의 최대 급여치는?
select * from sawon a
where a.sawon_pay = (select max(sawon_pay) from sawon b
where a.buser_num=b.buser_num);
-- 급여순위 3위 이내의 자료 출력(desc)
select a.sawon_name, a.sawon_pay from sawon a
where 3> (select count(*) from sawon b
where b.sawon_pay > a.sawon_pay) and sawon_pay is not null
order by sawon_pay desc;
< subquery를 이용한 table 생성 및 insert >
create table sa1 as select * from sawon; -- 제약조건(pk)는 복사가 안됨
select * from sa1;
desc sa1;
create table sa1 as select * from sawon where 1=0;
select * from sa2;
desc sa2;
create table sa3 as select sawon_no bunho,
sawon_name irum, sawon_pay pay from sawon where 1=0;
select * from sa3;
-- insert
create table sa4 as select sawon_no, sawon_name, sawon_jik
from sawon where 1=0;
create table sa5 as select sawon_no, sawon_name, sawon_pay
sawon_gen from sawon where 1=0;
select * from sa4;
select * from sa5;
insert all
into sa4 values(sawon_no, sawon_name, sawon_jik)
into sa5 values(sawon_no, sawon_name, sawon_pay, sawon_gen)
select sawon_no, sawon_name, sawon_jik, sawon_pay, sawon_gen
from sawon where buser_num = 10; -- 여러개의 데이터를 한번에 insert
insert all
into sa4 values(sawon_no, sawon_name, sawon_jik)
into sa5 values(sawon_no, sawon_name, sawon_pay,sawon_gen)
select sawon_no, sawon_name, sawon_jik, sawon_pay, sawon_gen
from sawon where buser_num = 10;
select * from sa4;
< 조건에 따른 복수 테이블에 insert 하기 >
insert all
when sawon_jik='사원' then
into sa4 values(sawon_no, sawon_name, sawon_jik)
when sawon_gen='남' then
into sa5 values(sawon_no, sawon_name, sawon_pay,sawon_gen)
select sawon_no, sawon_name, sawon_jik, sawon_pay, sawon_gen
from sawon where buser_num in(20, 30);
select * from sa4;
select * from sa5;
< subquery로 업데이트, 삭제 >
create table sa6 as select * from sawon;
select * from sa6;
update sa6 set sawon_jik=(select sawon_jik from sawon
where sawon_name='한국남') where sawon_no=1;
select * from sa6;
delete from sa6; where sawon_no in(select distinct gogek_damsano from gogek); -- 고객을 가진 직원 자료 모두 삭제
select * from sa6;
'교육' 카테고리의 다른 글
SQL transaction, view 요약 (0) | 2018.06.21 |
---|---|
SQL Union / Merge / Subquery 명령어 요약 (0) | 2018.06.19 |
서울 자바학원 여기서 배우자 (0) | 2018.06.08 |
SQL 내장함수 알아보기 (0) | 2018.06.08 |
java 배열 (0) | 2018.06.05 |