SQL 기초 실무/기초편

23.09.13. SQL Developer 예제 27 ~ 37번

잇꼬 2023. 9. 18. 17:04
728x90
반응형
SMALL

27. 개월 수 더한 날짜 출력하기 

-- 예제27. 2019년 5월 1일부터 100달 뒤의 날짜는 어떻게 되는지 출력해보세요.
select add_months( '2019/05/01', 100)
from dual ; 
-- 예제27_문제1. 오늘부터 100달 뒤의 날짜가 어떻게 되는지 출력하세요.
select add_months( sysdate, 100) 
from dual ;

28. 특정 날짜 뒤에 오는 요일 날짜 출력하기

-- 예제28. 2021년 5월 5일로부터 바로 돌아오는 월요일의 날짜가 어떻게 되는지 출력해보세요.
select next_day( '2021/05/05', '월요일')
 from dual ;
-- 예제28_문제1. 오늘부터 앞으로 돌아올 금요일의 날짜가 어떻게 되는지 출력하세요. 
select next_day( sysdate, '금요일')
from dual ;

29. 특정 날짜가 있는 달의 마지막 날짜 출력하기 

-- 예제29. 2021년 5월 5일의 해당 달의 마지막 날의 날짜를 출력하세요. 
select last_day( '2021/05/05')
from dual ;
-- 예제29_문제1. 오늘부터 요번달 말일까지 총 몇일 남았는지 출력하세요.
select last_day(sysdate) - sysdate
from dual ;

30. 문자형으로 데이터 유형 변환하기

-- 예제30. 이름이 SCOTT 인 사원의 입사한 요일과 월급을 출력하는데 월급을 출력할 때에 다음과 같이 천단위를 표시해서 출력하세요.
select ename, to_char( hiredate, 'day'), to_char( sal, '999,999')
from emp 
where ename='SCOTT' ;
select ename, hiredate, to_char( hiredate, 'RRRR'), to_char( hiredate, 'MON'),  to_char( hiredate, 'DD'), to_char( hiredate, 'DAY'),  to_char( hiredate, 'DY'), to_char( hiredate, 'day'), to_char( sal, 'L999,999')
from emp 
where ename='SCOTT' ;
-- 예제30_문제1. 수요일에 입사한 사원들의 이름과 입사일과 입사한 요일을 출력하세요.
select ename, hiredate, to_char( hiredate, 'DAY')
from emp
where to_char(hiredate, 'DAY') = '수요일' ; 
-- 예제30_문제2. 내가 태어날 생일의 요일을 출력하세요.
select to_char(to_date('1993/03/09', 'RRRR/MM/DD'), 'DAY') 
from dual ;

1) 날짜형 -> 문자형 / 숫자형 -> 문자형
2) to_char( 날짜 컬럼명, '날짜 포멧') 
3) 날짜 포멧 : 년도 (RRRR, YYYY, RR, YY) / 달(MON, MM) / 일(DD) / 요일(DAY, DY)

 

31. 날짜형으로 데이터 유형 변환하기

-- 예제31. 81년 11월 17일 입사한 사원의 이름과 입사일을 출력하세요. 
select ename, hiredate 
from emp
where hiredate = '81/11/17' ;
-- 현재 세션의 날짜 형식을 확인하는 방법 
select * 
from nls_session_parameters ;
-- 현재 세션의 날짜 형식을  DD/MM/RR 로 변경 
alter session set nls_date_format = 'DD/MM/RR' ;
select * 
from nls_session_parameters ;

select ename, hiredate 
from emp
where hiredate = to_date('81/11/17', 'RR/MM/DD') ;
-- 작성법 :  where hiredate = to_date('날짜', '작성한 날짜의 형식')

-- 예제31_문제. 1981년도에 입사한 사원들의 이름과 입사일을 출력하는데 최근에 입사한 사원부터 출력하세요.
select ename, hiredate
from emp 
where hiredate between to_date ('1981/01/01', 'RRRR/MM/DD') and to_date('1981/12/31', 'RRRR/MM/DD') + 1 order by hiredate desc ;
alter session set nls_date_format = 'RR/MM/DD' ;

32. 암시적 형 변환 이해하기

-- 예제32. 아래의 쿼리문은 실행이 될까요?
-- 암시적 형변환  Oracle DB에서 조건절의 데이터를 확인 후 자동으로 형 변환을 시행합니다. 
select ename, sal
from emp 
where sal = '3000' ;
-- 형변환이 이루어진다고 해서 좋은 것은 아니다. 
explain plan for
select ename, sal
 from emp 
 where sal = '3000' ;
-- Query 실행계획 {explain plan for ~ from table (dbms_xplan.display)} : 질의문이 실행되는 순서와 정보를 출력
select * from table(dbms_xplan.display) ;
-- 형변환이 이루어진다고 해서 좋은 것은 아니다. 검색속도가 느려지므로, 숫자는 숫자로 검색, 문자는 문자로만 검색할 것
select ename, sal
 from emp 
 where sal = 3000 ;
-- 이 쿼리문이 더 효율적이다.
-- 예제32_문제1. 다음의 쿼리문을 실행이 될까요? 
select ename, sal
from emp 
where sal like '30%' ;
explain plan for
select ename, sal
from emp 
where sal like '30%' ;

33. NULL 값 대신 다른 데이터 출력하기

-- 예제33. 이름과 월급과 커미션을 출력하는 커미션이 null인 사원들은 값을 0으로 출력하세요. 
select ename, comm, nvl(comm, 0 )
 from emp ;
select ename, sal, comm, sal + nvl(comm, 0 )
 from emp ;
-- 예제 33_문제1. 이름과 커미션을 출력하는데 커미션이 null인 사원들이 no comm 이라는 글씨로 출력되게 하세요.
select ename, nvl( to_char(comm), 'no comm')
from emp ;

34. IF문으로 SQL로 구현하기 ①

-- 예제 34. 이름, 부서번호, 보너스를 출력하는데 보너스를 부서번호가 10번이면 300, 부서번호가 20번이면 400, 나머지 번호번호는 0 을 출력하세요.
select ename deptno, decode( deptno, 10, 300, 20, 400, 0 ) as 보너스
 from emp ;  
-- 예제34_문제1. 이름, 직업, 보너스를 출력하는데 직업이 SALESMAN 이면 6000 을 출력하고 직업이 ANALYST 면 3000 을 출력하고 직업이 MANAGER 면 2000 을 출력하고 나머지 직업은 0 으로 출력되게 하시오
select ename, job, decode( job, 'SALESMAN', 6000, 'ANALSYT', 3000, 'MANAGER', 2000, 0) as 보너스
 from emp ;

35. IF문으로 SQL로 구현하기 ②

-- 예제35. 직업이 SALESMAN, ANALYST 인 사원들의 이름, 직업, 월급, 보너스를 출력하는데 월급이 3000 이상이면 보너스를  500을 출력하고 월급이 2000 이상이면 보너스를 300 을 출력하고 월급이 1000 이상이면 보너스를 200 을 출력하고 나머지를 0 을 출력하세요.
select ename, job, sal, case when sal >= 3000 then 500 
                                        when sal >= 2000 then 300 
                                        when sal >= 1000 then 200 else 0 end as 보너스 
    from emp 
    where job in ('SALESMAN', 'ANALYST') ;
-- 예제35_문제1. 이름, 월급, 보너스를 출력하는 월급이 3000 이상이면 보너스를 9000 을 출력하고 월급이 2000 이상이면 (2000이상이면 3000 보다 작으면) 8000 을 출력하고 나머지(2000 보다 작은 사원들)는 0을 출력하시오
select ename, sal, case when sal >= 3000 then 9000
                                  when sal >= 2000 and sal <3000 then 8000
                                  when sal < 2000 then 0 end as 보너스 
    from emp ;

36. 최대값 출력하기 

 

-- 예제36. 사원 테이블에서 최대 월급을 출력하세요.
select max(sal) 
    from emp ; 
-- 예제36_문제1. 직업이 SALESMAN 인 사원들 중에서의 최대월급을 출력하세요.
select max(sal)
    from emp 
    where job = 'SALESMAN' ;
-- 예제36_문제2. 직업이 SALESMAN 인 사원들 중에서의 최대월급을 출력하는데 아래와 같이 직업도 같이 출력하세요.
select job, max(sal)
    from emp 
    where job = 'SALESMAN' 
    group by job ;

1) 그룹함수 연산을 통해 단순히 하나의 값만 출력하려 해도 단일 결과가 나오기 위해서는 그룹으로 묶어야 함

 

37. 최소값 출력하기

-- 예제37. 직업이 SALESMAN 인 사원들 중에서 최소 월급을 출력하세요.
 select min(sal) 
    from emp
    where job = 'SALESMAN' ; 
-- 예제37_문제1. 부서번호가 20번인 사원들 중에서 최소월급을 출력하세요.
select min(sal)
    from emp 
    where deptno = 20 ;
-- 예제37_문제2. 부서번호와 부서번호별 최소월급을 출력하세요.
select deptno, min(sal) 
    from emp 
    group by deptno ;

1) 그룹함수 연산을 통해 그룹별로 출력하려 해도 결과가 나오기 위해서는 그룹으로 묶어야 함

728x90
반응형
LIST