커미션이 NULL이거나 0인 사원의
커미션은 500으로, 그렇지 않으면 COMM을 출력하시오.
SELECT
CASE
WHEN
NVL(COMM,0) = 0
THEN
500
ELSE
COMM
END as COMM
FROM
EMP
WHERE
HIREDATE >= TO_DATE('1981/05/31');
그외 인원들을 ‘그외’ 컬럼으로 뽑아주세요
SELECT
(SELECT
COUNT(EMPNO)
FROM
EMP
WHERE
HIREDATE >= TO_DATE('1980/01/01')
AND
HIREDATE <= TO_DATE('1981/01/01')
) as 입사1980,
(SELECT
COUNT(EMPNO)
FROM
EMP
WHERE
HIREDATE < TO_DATE('1980/01/01')
OR
HIREDATE > TO_DATE('1981/01/01')
) as 그외
FROM
DUAL;
**00:00:00**
까지 하므로, **1981/12/31**
까지로 계산하면 안됨.**DUAL**
’을 사용해야한다.사원의 이름, 입사일을 출력
SELECT
ENAME,
HIREDATE
FROM
EMP
WHERE
HIREDATE > (
SELECT
HIREDATE
FROM
EMP
WHERE
SAL = (
SELECT
MAX(SAL)
FROM
EMP
)
);
**Bottom-Up**
방식으로 쌓아올리는 것이 좋다.급여가 가장 높은 사원의 이름과 급여를 출력
-- FORD 보다 입사일이 늦은 사원 중
-- 급여가 가장 높은 사원의 이름과 급여를 출력
SELECT
ENAME,
SAL
FROM
(SELECT
ENAME,
SAL
FROM
((SELECT
ENAME,
SAL
FROM
EMP
WHERE
HIREDATE > (
SELECT
HIREDATE
FROM
EMP
WHERE
ENAME = 'FORD'
)))
ORDER BY
SAL DESC)
WHERE
ROWNUM <= 1;
-- 이 쿼리의 오류는 무엇일까?
-- 최종 메인 쿼리에서 'FORD'의 입사일과 관련이 없는 결과 데이터가 나온다.
SELECT
ENAME,
SAL
FROM
EMP
WHERE
SAL = (SELECT
MAX(SAL)
FROM
EMP
WHERE
HIAREDATE > (SELECT
HIREDATE
FROM
EMP
WHERE
ENAME = 'FORD'));
사원번호, 사원명, 급여를 출력
-- 20번 부서의 최고 급여보다 많은 사원의 사원번호,사원명,급여를 출력
SELECT
EMPNO,
ENAME,
SAL
FROM
EMP
WHERE
SAL > (
SELECT
MAX(SAL)
FROM
EMP
WHERE
DEPTNO = 20
);
( 어제 가장 어려웠던 쿼리. 이건 지속적으로 복습할 필요가 있다. )
-- EMP 테이블에서 가장 많은 사원을 갖는 MGR의 사원번호 출력
SELECT
MGR
FROM
EMP
GROUP BY
MGR
HAVING
COUNT(MGR) = (
SELECT
MAX(COUNT(MGR))
FROM
EMP
GROUP BY
MGR);
1) Oracle
**ROWNUM**
Pseudo Column**ROWNUM**
으로 Top N 쿼리를 만드려면 인라인 뷰 사용-- WHERE 에서 RNUM 사용하려면?
-- FROM 절에서부터 가져온 새로운 테이블의 ROWNUM을 참조할 수 있어야 한다.
-- 그렇기에, 새로 생성된 테이블의 ROWNUM을 참조하기 위해
-- SELECT 문으로 래핑해주어야 한다.
-- TOP ROWNUM은 1부터만 시작해야한다.
-- 내부 인라인 뷰의 ROWNUM 은 1이 아닌 시점부터 시작 가능하다.
SELECT
ENAME,
SAL
FROM(
SELECT
ENAME,
SAL,
ROWNUM as RNUM
FROM
(SELECT
ENAME,
SAL
FROM
EMP
ORDER BY
SAL DESC))
WHERE
RNUM = 2;
‘가장 많은’
, ‘가장 적은’
처음부터 몇위
까지,ROW_NUMBER() OVER()
-- 추가 ( Optional )
-- ROW_NUMBER() OVER as RNUM
-- 오라클에서는 누계함수가 막강하다.
SELECT
ROW_NUMBER() OVER(ORDER BY e.sal) AS RNUM,
e.*
FROM
EMP e
ORDER BY e.SAL;
-- JOB으로 그룹화하고, SAL과 ENAME으로 정렬하라.
SELECT
ROW_NUMBER() OVER(PARTITION BY job ORDER BY e.sal, e.ename) as snum,
e.*
FROM
EMP e;
**정규표현식**
예시정규표현식
매우 중요, 전 세게에서 이 기호는 항상 쓰임 ( 전 세계 통용되는 문법 )-- 입사일이 두 번째로 빠른 사람의 부서명과 이름, 입사일
SELECT
dname,
ename,
hiredate
FROM
(SELECT
ROWNUM as rnum,
ee.*
FROM (
SELECT
d.dname,
e.ename,
e.hiredate
FROM
EMP e
JOIN
DEPT d
ON
e.deptno = d.deptno
ORDER BY
hiredate ASC) ee)
WHERE
rnum = 2;
**ROWNUM**
은 테이블에 INSERT 된 순서를 나타낸다.**Inline-VIew**
에서 INSERT된 순서 또한 **ROWNUM**
의 순서로 나타낼 수 있다.-- DALLAS에 위치한 부서에
-- 최대 급여를 받는 사원에서
-- 최소 급여를 받는 사람의 급여를 뺀 급여값 출력
SELECT
MAX(SAL) - MIN(SAL) as result
FROM
EMP e
JOIN
DEPT d
ON
e.deptno = d.deptno
WHERE
d.loc = 'DALLAS';
ERD Cloud
써서 모델링 하면 됨.논리적 모델 + 물리적 모델
개념적 모델
논리적 모델
물리적 모델
실선 ⇒ FK
가 나의 PK
( 남에게서 가져온 PK가 나의 PK라면 )