본문 바로가기

디비1

디비1- 4월13일

*중간고사를 공부하면서 이거는 시험문제로 나왔으면 좋겠다는 문제를 개인적으로 만들어서 토요일까지 제출.


시험 출제자 이름 같이 적어줘 ㅋㅋㅋ 너무 어려워서도 ㄴㄴ 너무 쉬워서도 ㄴㄴ 

좋은 문제~~~~ 하고싶은 사람은 꼮내래~~ 시험문제를 받아보면 왜 만들어내라고 했는지를 알게됨.


*조인 (Join)

여러개의 테이블의 컬럼들의 결과를 하나의 결과값으로 출력하기 위한 방법


select *

from dept;


deptno:부서번호

dname:부서명

loc:부서위치


문제85. 사원번호, 이름, 월급, 부서위치, 부서번호를 출력하시오!

select empno, ename, sal, loc, emp.deptno

frm emp, dept

where emp.deptno=dept.deptno;


select empno, ename, sal, loc, dept.deptno

from emp, dept

where emp.deptno=dept.deptno;


select emp.empno, emp.ename, emp.sal, dept.loc, dept.deptno

from emp, dept

where emp.deptno=dept.deptno;


select e.empno, e.ename, e.sal, d.loc, d.deptno

from emp e, dept d

where e.deptno=d.deptno;


select emp.empno, e.ename, e.sal, d.loc, d.deptno

from emp e, dept d

where e.deptno=d.deptno; (X)


select empno,ename,sal,loc,emp.emptno

from emp,dept

where emp.deptno = dept.deptno;


원래는 이거 다 써야된대 그래서 성능이 좋아진대


select emp.empno, emp.ename, emp.sal, dept.loc, emp.deptno

from emp,dept

where emp.deptno = dept.deptno;


select e.empno, e.ename, e.sal, d.loc, e.deptno

from emp e, dept d

where e.deptno = d.deptno;


이런식으로!!!!    


근데 이거 위에  e.empno 이거를 emp.empno 해도되 ? 안해도되? 

되!!!


문제 86.직업이 SALESMAN인 사원들의 이름과 직업과 부서위치를 출력하시오.


SELECT E.ENAME, D.LOC, E.JOB

FROM EMP E , DEPT D

WHERE E.DEPTNO = D.DEPTNO               -- 연결고리

AND E.JOB = 'SALESMAN' ;                    -- 검색조건


문제 87.월급이 3000이상인 사원들의 이름과 월급과 부서위치를 출력하시오.


SELECT E.ENAME, E.SAL, D.LOC

FROM EMP E ,DEPT D

WHERE E.DEPTNO = D.DEPTNO AND E.SAL >= 3000;




문제88.DALLAS 에서 근무하는 사원들의 이름과 부서위치를 출력하시오.


SELECT E.ENAME , D.LOC

FROM EMP E , DEPT D

WHERE E.DEPTNO = D.DEPTNO

AND D.LOC = 'DALLAS' ; 


WHERE E.DEPTNO = D.DEPTNO 이걸 왜 해야되냐면 잘봐

KING   이 만약 10 이라면 


deptno       loc         


10           NEW YORK

20           DALLAS

30           CHICAGO

40           BOSTON


킹의 부서 위치가 뭔지 나와야 되고 킹의 부서번호를 갖고 부서테이블에 가봐야지

아 10번이 뉴욕이구나~ 이렇게 조인을 해서 알아내는거.


그리고 SCOTT의 부서위치가 너무 궁금한거야. 20을 가지고 그래서 부서 테이블로 간거지.


문제89. 월급이 1000에서 3000사이인 사원들의 이름과 월급과 부서위치를 출력하시오.


SELECT E.ENAME,E.SAL,D.LOC

FROM EMP E,DEPT D

WHERE E.DEPTNO = D.DEPTNO AND

 E.SAL BETWEEN 1000 AND 3000;


문제 90.부서위치, 부서위치별 토탈월급을 출력하시오.


SELECT D.LOC , SUM(E.SAL)

FROM EMP E , DEPT D

WHERE E.DEPTNO = D.DEPTNO

GROUP BY D.LOC;


여기서 WHERE절을 안쓰면 어떻게 될까?? 나오긴 나오는데 

값이 어어어어어어어ㅓ어엄청 커진다.다 조인할테니까


문제91.위의 결과에서 부서위치별 토탈월급이 9000이상인 것만 출력하시오.


SELECT D.LOC , SUM(E.SAL)

FROM EMP E , DEPT D

WHERE E.DEPTNO = D.DEPTNO

HAVING SUM(E.SAL) => 9000;


SELECT D.LOC , SUM(E.SAL)

FROM EMP E , DEPT D

WHERE E.DEPTNO = D.DEPTNO

GROUP BY D.LOC 이걸 빠뜨렸네..

HAVING SUM(E.SAL) => 9000;


SELECT D.LOC , SUM(E.SAL)

FROM EMP E , DEPT D

WHERE E.DEPTNO = D.DEPTNO

GROUP BY D.LOC

HAVING SUM(E.SAL) >= 9000;


(중간고사와 가까운 문제를 보여주면)


문제92.부서위치,부서위치별 인원수를 출력하는데 부서위치가 DALLAS는 제외하고 출력하고 부서위치별 인원수가 3명이상인 것만 출력하고 부서위치별 인원수가 높은 것부터 출력하시오.


select d.loc , count(e.ename)

from emp e , dept d

where e.deptno = d.deptno and d.loc != 'DALLAS'

group by d.loc

having count(e.name) >= 3

order by count(e.name) asc;


위에 틀린거..


select d.loc, count(e.empno)

from emp e , dept d

where e.deptno = d.deptno

and d.loc <> 'DALLAS'

group by d.loc

having count(*) >=3

order by count(*) desc;


혹은


5 select d.loc, count(*)

1 from emp e , dept d

2 where e.deptno = d.deptno

 and d.loc <> 'DALLAS'

3 group by d.loc

4 having count(*) >=3

6 order by count(*) desc;


select d.loc, count(*)

from emp e , dept d

where e.deptno = d.deptno

and d.loc <> 'DALLAS'   (임마를)

group by d.loc

having count(*) >=3      and <> 'DALLAS' (이렇게 쓰게되면 성능이 느려 where절에 써야된다.)

order by count(*) desc;


그래서 having절에 다쓰면안되고.. having은 그룹함수!!! 조건을 주어질때 하라는 것.


*다음주 시험 시험시간 7시 30분 

1시간에서  ~ 1시간 30분 시험 

15문제 ~ 20문제 (15문제 일 확률이 높다.) (SQL 작성하는게 시험문제,)

손으로 작성하면 됨. EMP와 DEPT 결과창 시험지에 보여줄거다.

sql에만 잘 작성해서 하면 된다.


공부방법 : 문제 92 직접 풀어보고 문제를 만든다는 생각으로 응용을 한다.

문제를 한번 다시 풀어보고 비교해봐라.


문제 93. 1981년도에 입사한 사원들의 이름과 월급과 부서위치와 

입사일을 출력하시오.


select e.ename,e.sal,d.loc,e.hiredate

from emp e , dept d

where e.deptno = d.deptno and hiredate = '1981';

틀렸네..



select e.ename,e.sal,d.loc,e.hiredate

from emp e , dept d

where e.deptno = d.deptno and 

to_char(e.hiredate,'RRRR') = '1981'; 


select e.ename,e.sal,d.loc,e.hiredate

from emp e , dept d

where e.deptno = d.deptno and e.hiredate between '81/01/01' and '81/12/31';