Oracle SQL

SQL 문제 6-7일차

JaeGuin 2021. 8. 22. 17:29

6일차

6 일차 SQL 과제 –

1.사원 테이블에서 급여(SAL) 값을 누계(SAL_CUMULATIVE) 값으로 사원번호(EMPNO) 오름차순 정렬 순서로 아래 예제처럼 출력하세요?
ex)

 

 

더보기

SELECT empno, ename, sal
,(sum(sal)OVER(ORDER BY empno)) AS SAL_CUMULATIVE
FROM emp
ORDER BY empno;


     

2.사원 테이블에서 직업이 ‘SALESMAN’ 사원 중에 급여(SAL) 낮은 순서대로 순위(RANK)를 아래 예제처럼 출력하세요?
ex)  급여가 같은 경우 데이터 정렬 순서 나오는 대로 순위 정함.
    

 

더보기

SELECT job, ename, sal, ROW_NUMBER() OVER (ORDER BY sal) AS rank
from emp
WHERE job = 'SALESMAN'
ORDER BY rank;

 



3.사원 테이블에서 직업이 ‘SALESMAN’ 사원 중에 급여(SAL) 낮은 순서대로 순위(RANK)를 아래 예제처럼 출력하세요?
ex) 급여가 같은 경우 순위는 같고 동률 순위 사람 수 만큼 다음 순위에 순위 차를 둠
   

 

더보기

SELECT job, ename, sal, rank() OVER (ORDER BY sal) AS rank
from emp
WHERE job = 'SALESMAN'
ORDER BY rank;

 



4.사원 테이블에서 직업이 ‘SALESMAN’ 사원 중에 급여(SAL) 낮은 순서대로 순위(RANK)를 아래 예제처럼 출력하세요?
ex) 급여가 같은 경우 순위는 같고 다음 순위는 위 순위 번호 다음값
 

 

더보기

SELECT job, ename, sal, RANK() OVER (PARTITION BY deptno ORDER BY sal DESC ) as rank 
FROM emp   
WHERE job = 'SALESMAN'
ORDER BY rank;

 



5.EMP테이블을 백업 하기 위하여(복제하기 위하여)  한 sql문장으로
데이터를 EMP_BAK TABLE을 생성하여 넣는 문장을 작성하시오
(테이블 생성 및 INSERT가 한 문장으로 수행 되어야 함.)

CREATE TABLE EMP_BAK as SELECT * FROM emp;

 



6. EMP Table에 5000 건의 테스트 데이터를 생성하시오.

INSERT INTO emp (empno,	ename, job, mgr, hiredate, sal, comm, deptno)
    SELECT  	 LEVEL,	  
    dbms_random.string ('U', 4),
    CASE  
	      WHEN  LEVEL =  1		    THEN  'PRESIDENT'
	      WHEN  LEVEL <= 4   	    THEN  'MANAGER'	
	      WHEN  dbms_random.value < .5  THEN  'ANALYST'
	      WHEN  dbms_random.value < .5  THEN  'CLERK'
	      	    		      	    ELSE  'SALESMAN' END,	
    CASE
	    WHEN  LEVEL > 1
	    THEN  TRUNC (dbms_random.value (1, LEVEL))END,	      
      TRUNC ( SYSDATE - dbms_random.value (0, 3650)),	
      ROUND ( dbms_random.value (100, 5000) , -2),
      TRUNC (DBMS_RANDOM.VALUE (0, 10000), 0),
      TRUNC (DBMS_RANDOM.VALUE (0, 10000), 0)                 
FROM	 dual
CONNECT BY	 LEVEL	<= 5000;

쉬운건 이렇게도 가능

INSERT INTO EMP
SELECT LEVEL,
       NULL, NULL, NULL, NULL, NULL, NULL, NULL
FROM DUAL
CONNECT BY LEVEL <= 5000;

 

 


 

7일차

7일차 SQL에서만 6일차 5번 문제에서 만든 EMP이름 (각자이름) 테이블을 이용합니다.

1.사원(EMP이름)테이블에서 직업(JOB)이 ‘SALESMAN’ 인 사원 급여(SAL)에 400 더하는 수정(UPDATE) 구문을 구하세요?

 

더보기

UPDATE emp_bak SET sal=sal+400 WHERE job='SALESMAN';

 


2.사원(EMP이름)테이블에서 급여(SAL)가 사원 평균급여 보다 높은 사원을 대상으로 고용일자(HIREDATE)를 1년 더하는 수정(UPDATE) 구문을 구하세요?

 

더보기

UPDATE emp_bak SET hiredate= hiredate+365 WHERE sal >(SELECT AVG(sal) FROM emp_bak);

 


3.사원(EMP이름)테이블에서 전체 사원을 대상으로 COMM 컬럼에 100 을 더하고 직업(JOB)이 ‘CLERK’ 인 사원은 현 급여에서 2배, ‘MANAGER’ 인 직업을 가진 사원은 현 급여에서 3배, 이외 직업을 가진 사원은 현 급여에서 4배를 더하는 수정(UPDATE) 구문을 구하세요?

 

더보기

UPDATE emp1 SET comm=comm+100
,sal = CASE job
WHEN 'CLERK' THEN sal*2
WHEN 'MANAGER' THEN sal*3
ELSE sal*4
END;

 


4.사원(EMP이름)테이블에서 이름(ENAME)이 ‘M’으로 시작하는 사원 
삭제(DELETE) 구문을 구하세요?

 

더보기

DELETE FROM emp_bak WHERE ename LIKE 'M%';

 


5.사원(EMP이름)테이블에서 급여(SAL)가 사원 평균급여 보다 높은 사원 삭제(DELETE) 구문을 구하세요?

 

더보기

DELETE FROM emp_bak WHERE sal>(select AVG(sal) FROM emp_bak);