select 에서만 올 수 있음
기본형태
순차함수명( ) over( partition by 기준 값,.....
order by 값 정렬 기준,.....)
SELECT ENAME, SAL,JOB,
ROW_NUMBER() OVER(ORDER BY SAL DESC) AS RNUM,
RANK() OVER(ORDER BY SAL DESC) AS RNK,
DENSE_RANK() OVER(ORDER BY SAL DESC) AS DRNK
FROM EMP
;
--ORACLE의 ROWNUM : 데이터 취득 순서대로 줄번호를 할당한다.
-- 조회된 인덱스 순서
SELECT ENAME, SAL, ROWNUM
FROM EMP
ORDER BY SAL DESC(내림차순)
;
--업무별 급여 순위를 구하시오.
SELECT ENAME,SAL, DEPTNO,
RANK() OVER(PARTITION BY JOB ORDER BY SAL DESC) AS RNK
FROM EMP
;
PARTITION을 통해 업무끼리 분리 후 그다음 급여 순위를 별로 내림차순을 한다.
순차 함수는 SELECT에서만 사용 가능하다.
SELECT ENAME,SAL,DEPTNO
FROM(SELECT ENAME,SAL,DEPTNO,
RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC)AS RNK
FROM EMP)
WHERE RNK = 1
;
일단 처음 부서별 급여 1순위를 뽑기 위해서 부서별 급여순위를 뽑아야 하기 때문에, 서브쿼리를 사용했다. 서브쿼리를 살펴보면 순차함수 RANK을 사용해서 가로안에 파티션을 부서번호인 DEPTNO를 기준으로 나누고 SAL을 통해 내림차순을 했다. 그다음 1등인 사원만 구하면 되기에 WHERE 에서 RNK =1 이 들어갔다.
-- HINT SUBQUERY -> WHERE
-- HINT SUBQUERY * 2
--사용된 테이블 : EMP, DEPT
SELECT DEPTNO
FROM
(SELECT ENAME,DEPTNO, SAL,
RANK() OVER(ORDER BY SAL DESC) AS RNK
FROM EMP)
WHERE RNK =1
;
--출력: DEPTNO : 10
SELECT DNAME
FROM DEPT
WHERE DEPTNO = (SELECT DEPTNO
FROM
(SELECT ENAME,DEPTNO, SAL,
RANK() OVER(ORDER BY SAL DESC) AS RNK
FROM EMP)
WHERE RNK =2)
;
--출력 DNAME : ACCOUNTING
이 문제는 데이터를 두개를 활용해서 풀 수 있는 문제인데, 바로 공통되게 들어가 있는 부서 숫자인 DEPTNO을 활용해야한다.
처음에 사원 중에 가장 많은 급여를 받는 사람을 구해야 하기에 바로 순차함수 RANK 안에 ORDER BY SAL(급여) DESC(내림차순)을 하면 바로 가장 위에 있는 ROW가 많은 급여을 받는 사람이다. 그다음 그사람 필요하기에 WHERE에서 별칭 RNK =1 적었고, 그다음 여기가 핵심이다. 다른테이블인 DEPT 에서 사용하기 위해서 최종 SELECT에 DEPTNO를 적는다.
그런 다음 FROM에서 테이블 DEPT를 갖고오고, SELECT에서 부서명만 필하니 DNAME을 적는다
마지막으로 WHERE 에 부서번호를 받기 위해 DEPTNO 에 서브쿼리를 붙이는 것이다.
A.직접참조 : 1: N, DEPTNO==DEPTNO
B. 자가참조 :범위 EMPNO=MGR(상사EMPNO)
C. 간접참조 : 한테이블 SAL BETWEEN LOSAL AND HISAL
--별칭 : E,D
--ASC는 오름차순
SELECT *
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
ORDER BY E.EMPNO ASC, D.DEPTNO ASC
;
--SAL 범위
--간접참조사용 SAL
SELECT *
FROM EMP E INNER JOIN SALGRADE SG
ON E.SAL BETWEEN SG.LOSAL AND SG. HISAL
;
--자가참조
SELECT E1.ENAME AS 부하직원, E1.MGR, E2.EMPNO, E2.ENAME AS 상급자
FROM EMP E1 INNER JOIN EMP E2
ON E1.MGR = E2.EMPNO
;
---사원의 부서명과 급여등급을 출력하시오.
--직접참조사용
SELECT E.ENAME,D.DNAME,SG.GRADE
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
INNER JOIN SALGRADE SG
ON E.SAL BETWEEN SG.LOSAL AND SG.HISAL
;
--문제
--시카고에 근무하는 사원들의 / 급여순위를 구하시오.
SELECT E.ENAME,E.SAL, D.LOC,
RANK() OVER (ORDER BY SAL DESC) AS RNK
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
AND D.LOC= 'CHICAGO'
;
이문제는 다 구해놓고, 문자열을 구할때 쓰는 ' ' 바로 이 따옴표 때문에 못풀었다 처음에 너무 억울함이 올라왔지만, 결국 생각해보니 내가 처음에 배운것을 잘 기억하지 못해 생긴일이다. 꼭 기억하자 처음 배운 것을 !!
데이터베이스 또 벌써 3일차이고, 점점 느끼는게 앞으로 나아가는 것 보다도 중요한 한것은 배운 것을 잃지안고 계속 안고가는 게 중요하다는 생각이 자꾸 든다. 내일은 일어나서 자바 강의 다시듣자
그리고 이번주 목표인 농부도 살짝 들여다보자