DataBase

<DataBase_231031화> 단일행 함수 문제&답안

Technoqueen_X 2023. 10. 31. 20:43
728x90
반응형
select * from nls_session_parameters

set linesize 120
col parameter format a50
col value format a50

1 * select * from nls_session_parameters
/

 
-------------------------------------
 
<내가 풀이한>
<단일행 함수 문제&답안>
 
*** 단일행 함수 과제 ( scott계정의 테이블로 할 것)

1. 이름의 길이가 6자 이상인 사원의 정보를 이름, 이름 글자수, 업무를 검색
select ename, length(ename) as name_length, job from emp
where length(ename)>=6;

2. SCOTT의 사원번호, 성명(소문자로), 담당업무(대문자로) 검색
select empno, lower(ename), upper(job) from emp;

3. DEPT 테이블에서 Loc 컬럼의 첫 글자만 대문자로 변환하여 검색
select initcap(loc) as Loc_cap from dept;

4. 사원번호,이름,업무,급여를 검색하되 EMPNO와 ENAME을 줄 바꿔서 검색
select ename, empno, job, sal from emp;

5. sql에서 이름의 첫 글자가 ‘K’보다 크고 ‘Y’보다 작은 사원의 정보 검색
select ename from emp
where substr(ename, 1, 1)>'K' and substr(ename, 1, 1)<'Y';

6. 사원번호,이름,이름의 길이,급여,급여의 길이 검색
select empno, ename, length(ename) as name_length, sal, length(sal) as sal_length from emp;

7. 업무 중 sql에서 job column의 ‘A’자의 위치를 검색, 두 번째 ‘A’자의 위치도 검색
select job, 
instr(job, 'A', 1) "first_location",
instr(job, 'A', 1, 2) "second_location" from emp;

8. 이름의 검색 자릿수를 20으로 하고 오른쪽 빈칸에 ‘*’을 채우고, 
select rpad(ename, '20' , '*') "ename"
from emp;

9. 담당 업무 중 좌측에 ‘A’를 삭제하고 급여 중 좌측의 1을 삭제한 후 검색
select ltrim(job, 'A') "job_modi", ltrim(sal, '1') "sal_modi" from emp;

10. 담당 업무 중 우측에 ‘T’를 삭제하고 급여 중 우측의 0을 삭제한 후 검색
select rtrim(job, 'T') "job_modi", rtrim(sal, '0') "sal_modi" from emp;

11. 이름 중에 ‘A’,’B’,’C’는 소문자로 바꿔서 검색하고 급여를 숫자가 아닌 글자로 검색 (급여가 1425이면 일사이오)
select replace(replace(replace(ename,'A','a'),'B','b'),'C','c') name_lower,
replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(sal,1,'일'),2,'이'),3,'삼'),4,'사'),5,'오'),6,'육'),7,'칠'),8,'팔'),9,'구'),0,'공') sal_letter
from emp;

12. JOB의 글자 중 ‘LE’를 ‘AL’로 바꿔서 검색
select replace(JOB, 'LE', 'AL') from emp;

13. 모든 사원의 이름과 급여를 연결(||)하여 검색하되 각 15자리씩 왼쪽을 공백으로 검색
          SMITH            800
          ALLEN           1600

select lpad(ename, 15) || lpad(sal, 15) 공백연결 from emp;

14. 숫자 1234.5678를 정수로 반올림하고 소수 첫째 자리까지 반올림과 절삭한 값을 검색
select 
round(1234.5678, 0) 정수반올림,
round(1234.5678, 1) 소수첫째반올림,
trunc(1234.5678, 1) 소수첫째절삭
from dual;
 


15. 숫자 -456.789를 정수로 올림하고 -123.78을 내림한 정수를 검색
select 
ceil(-456.789),
floor(-123.78)
from dual;

16. 급여를 30으로 나눈 나머지를 구하여 검색
select sal, mod(sal, 30) 나머지
from emp;

17. 모든 사원의 정보를 이름,업무,입사일, 입사한 요일을 검색
select ename, job, hiredate, to_char(hiredate, 'DY') 요일 from emp;

18. 현재까지의 근무일수가 몇 주 몇 일인가 검색하라. 근무일수가 많은 사람순서로 검색하라.
(예:총 근무일수가 20일이면 2주 6일이 검색되게 한다.)
select
ename,
trunc((sysdate-hiredate)/7) as weeks,
trunc(mod((sysdate-hiredate), 7)) as days
from emp
order by weeks desc, days desc;

19. 현재까지의 근무 월수를 계산하여 정수로 검색하라.
select 
ename,
trunc(months_between(sysdate, hiredate)) 근무월수
from emp;

20. 입사일로부터 5개월이 지난 후 날짜를 ROUND함수와 TRUNC함수를 이용하여 월을 기준으로 검색하라
select
ename, hiredate,
round(add_months(hiredate, 5), 'month') as five_months_later_r,
trunc(add_months(hiredate, 5), 'month') as five_months_later_t
from emp;

21. 입사일자로부터 돌아오는 금요일을 검색하라
select ename, hiredate, next_day(hiredate, '금') next_friday from emp;

22. 입사한 달의 근무일수를 계산하여 검색하라, 단 토/일요일도 근무일수에 포함한다.
select hiredate, trunc(add_months(hiredate, 1), 'month')-hiredate working_day from emp;

23. 입사날짜를 ‘1 Jan 1981’ 과 ‘1981년 01월 01일’의 형태로 검색하라.
select ename, hiredate,
to_char(hiredate, 'dd Mon yyyy', 'NLS_DATE_LANGUAGE=ENGLISH') hd1,
to_char(hiredate, 'yyyy"년" mm"월" dd"일"') as hd2
from emp;

24. 입사일이 February 20, 1981과 May 1, 1981 사이에 입사한 사원의 이름,업무,입사일을 검색. 
select ename, job, hiredate from emp
where hiredate>'1981/02/20' and hiredate<'1981/03/01';

25. 위의 문제를 현재 세션을 February 20, 1981에 맞게 변경한 후에 검색하라.
select ename, job, to_char(hiredate,'Month dd, yyyy','nls_date_language=english') from emp
where hiredate>'81/02/20' and hiredate<'81/05/01';

26. 연봉에 보너스를 합한 금액을 $를 삽입하고 3자리마다 ,를 검색하라.
select ename, sal, nvl(comm,0)"comm", to_char(sal+nvl(comm,0),'fm$9,990') total from emp;

27. JOB이 ANALYST 이면 수당으로 급여의 10%를 지급하고
CLERK 이면 급여의 15% 지급, MANAGER이면 20% 지급하려고 한다. 
다른 업무는 보너스가 없다. 
사원번호,이름,업무,급여,수당을 검색하라. (CASE문)
select empno, ename, job, sal,
(case job
when 'ANALYST' then sal*0.1
when 'CLERK' then sal*0.15
when 'MANAGER' then sal*0.2
else 0
end) "bonus"
from emp;

28. 위 문제를 DECODE를 사용하여 검색하라.
select empno, ename, job, sal, 
decode(job, 'ANALYST', sal*0.1, 'CLERK', sal*0.15, 'MANAGER', sal*0.2, 0) bonus
from emp;

29. 급여가 1000 이상 2000 이하이면 1500을 지급하고 그 외에는 800을 지급하라
select ename, sal,
(case
when sal>=1000 and sal<=2000 then 1500
else 800
end) bonus
from emp;

30. 현재 급여를 기준으로 입사한 달의 근무일수에 해당하는 급여를 산출하라.
(일일 급여액 = 연 급여액/365)
select ename, hiredate, 
last_day(hiredate), 
(last_day(hiredate)-hiredate+1) as workingday, 
(sal/365)*(last_day(hiredate)-hiredate+1) as sudang
from emp;

31. 이름,입사일,입사일에서 6개월 뒤에 돌아오는 월요일을 구하여 검색
select ename, hiredate,
next_day(add_months(hiredate, 6), '월') "next_mon"
from emp;

32. 사원번호, 이름, 급여, 상사코드를 입력하고 상사코드가 NULL 이면 NO MGR을 검색하라.
select empno, ename, sal, nvl(to_char(mgr),'NO MGR') mgr from emp;

33. 사원번호, 이름, 급여, 보너스,급여와 보너스의 합을 검색하고 컬럼명은 INCOME으로 검색을 한다.
보너스가 NULL이면 급여만, NULL이 아니면 보너스와 급여의 합이 검색 되도록 하라. (NVL을 이용)
select empno, ename, sal, nvl(comm,0) "COMM", to_char(sal+nvl(comm,0)) INCOME 
from emp;

34. 사원번호, 이름, 이름의 길이, 급여의 길이, 보너스 길이를 검색하고
급여는 보너스의 길이와 급여의 길이가 같으면 NULL을,
다르면 급여의 길이가 검색되게 하라.
select empno, ename, length(ename) "name_length", length(sal) "sal_length", length(comm) "bonus_length",
(case
when length(comm)=length(sal) then NULL
else length(sal)
end) sal_length
from emp;

35. 다음과 같은 형태로 모든 사원 검색
Dream Salary        
------------------------------------------------  
SMITH salary:   $800.00  Dream Salary : $2,400  
ALLEN salary: $1,600.00  Dream Salary : $4,800  
WARD salary: $1,250.00  Dream Salary : $3,750  
……        
select ename || ' salary: ' || to_char(sal, '$99,999.00') || ' Dream Salary : ' || to_char(sal*3, '$99,999') "Dream Salary" from emp;
 
-------------------------------------
 
<선생님이 정리해주신>
<단일행 함수 문제&답안>
 
1.     이름의 길이가 6자 이상인 사원의 정보를 이름, 이름 글자수, 업무를 검색
Select ename, length(ename), job from emp
Where length(ename) >= 6;
 
2.     SCOTT의 사원번호, 성명(소문자로), 담당업무(대문자로) 검색
select empno, lower(ename), upper(job) from emp
where ename = 'SCOTT';
 
3.     DEPT 테이블에서 Loc 컬럼의 첫 글자만 대문자로 변환하여 검색
select deptno, dname, initcap(loc) loc from dept;
 
4.     사원번호,이름,업무,급여를 검색하되 EMPNO와 ENAME을 줄 바꿔서 검색
select empno ename, ename empno, sal from emp;
 
5.     이름의 첫 글자가 ‘K’보다 크고 ‘Y’보다 작은 사원의 정보 검색
select * from emp
where substr(ename, 1, 1) >'K' and substr(ename, 1, 1) <'Y';
 
6.     사원번호,이름,이름의 길이,급여,급여의 길이 검색
Select empno, ename, length(ename) n_length, sal, length(sal) s_length from emp;
 
7.     업무 중 ‘A’자의 위치를 검색, 두 번째 ‘A’자의 위치도 검색
Select ename, job, instr(job,'A',1,1) first_A, instr(job,'A',1,2) second_A from emp;
 
8.     이름의 검색 자릿수를 20으로 하고 오른쪽 빈칸에 ‘*’을 채우고,
select rpad(ename, 20, '*') ename from emp;
 
9.     담당 업무 중 좌측에 ‘A’를 삭제하고 급여 중 좌측의 1을 삭제한 후 검색
Select ltrim(job, 'A') job, ltrim(sal, '1') sal from emp;
 
10.담당 업무 중 우측에 ‘T’를 삭제하고 급여 중 우측의 0을 삭제한 후 검색
Select rtrim(job, 'T') job, ltrim(sal, '0') sal from emp;
 
11.  이름 중에 ‘A’,’B’,’C’는 소문자로 바꿔서 검색하고 급여를 숫자가 아닌 글자로 검색
       (급여가 1425 이면 일사이오 )
select replace(replace(ename, 'A', 'a'), 'B', 'b') "A,B 소문자로",
replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(sal, 1, '일'),2,'이'),3, '삼'),4,'사'),5, '오'),6,'육'),7, '칠'),8,'팔'),9, '구'),0,'영') "월급한글" from emp;
 
12.  JOB의 글자 중 ‘LE’를 ‘AL’로 바꿔서 검색
select replace(job,'LE','AL') from emp;
 
13.  모든 사원의 이름과 급여를 연결(||)하여 검색하되 각 15자리씩 왼쪽을 공백으로 검색
          SMITH            800
          ALLEN           1600
select lpad(ename || sal,15,'*') "이름_급여" from emp;
 
14.  숫자 1234.5678를 정수로 반올림하고 소수 첫째 자리까지 반올림과 절삭한 값을 검색
select round(1234.5678,0), round(1234.5678,1), trunc(1234.5678,1) from dual;
 
15.  숫자 -456.789를 정수로 올림하고 -123.78을 내림한 정수를 검색
select ceil(-456.789), floor(-123.78) from dual;
 
16.  급여를 30으로 나눈 나머지를 구하여 검색
select mod(sal, 30) from emp;
 
17.  모든 사원의 정보를 이름,업무,입사일, 입사한 요일을 검색
select ename, job, hiredate, to_char(hiredate, 'day') from emp;
 
18.  현재까지의 근무일수가 몇 주 몇 일인가 검색하라. 근무일수가 많은 사람순서로 검색하라.
(예:총 근무일수가 20일이면 2주 6일이 검색되게 한다.)
select
trunc((to_char(hiredate,'dd')/12)*365/7,'0') || '주 ' ||
trunc(mod((to_char(hiredate,'dd')/12)*365,7),'0') || '일' "근무일수"
from emp;
 
19.  현재까지의 근무 월수를 계산하여 정수로 검색하라.
select trunc(months_between(sysdate, hiredate)) "근무개월수" from emp;
 
20.  입사일로부터 5개월이 지난 후 날짜를 ROUND 함수와 TRUNC함수를 이용하여 월을 기준으로 검색하라
select hiredate, round(add_months(hiredate,'5'),'month'), trunc((add_months(hiredate,'5')),'month') from emp;
 
21.  입사일자로부터 돌아오는 금요일을 검색하라
select next_day(hiredate,'금'), to_char(next_day(hiredate,'금'),'day') from emp;
 
22.  입사한 달의 근무일수를 계산하여 검색하라, 단 토/일요일도 근무일수에 포함한다.
select to_char(last_day(hiredate), 'dd') - to_char(hiredate, 'dd') +1 "근무일수" from emp;
 
23.  입사날짜를 ‘1 Jan 1981’ 과 ‘1981년 01월 01일’의 형태로 검색하라.
select
to_char(hiredate, 'fm dd Mon yyyy', 'nls_date_language = english') "영문날짜",
to_char(hiredate, 'yyyy"년" mm"월" dd"일"') "한글날짜"
from emp;
 
24.  입사일이 February 20, 1981과 May 1, 1981 사이에 입사한 사원의 이름,업무,입사일을 검색.
select ename, job, hiredate from emp
where hiredate>'1981.02.20' and hiredate<'1981.03.01';
 
25.  위의 문제를 현재 세션을 February 20, 1981에 맞게 변경한 후에 검색하라.
select ename, job, to_char(hiredate, 'Mon dd, yyyy', 'nls_date_language=english') "입사일" from emp
where hiredate>'1981.02.20' and hiredate<'1981.03.01';
 
26.  연봉에 보너스를 합한 금액을 $를 삽입하고 3자리마다 ,를 검색하라.
select ename, lpad((to_char(sal+comm, '9,990')||'$'),'5','') "개인 총급여" from emp;
 
27.  JOB이 ANALYST 이면 수당으로 급여의 10%를 지급하고 CLERK 이면 급여의 15% 지급, MANAGER이면 20% 지급하려고 한다. 다른 업무는 보너스가 없다. 사원번호,이름,업무,급여,수당을 검색하라. (CASE문)
select empno, ename, job, sal,
(case job
when 'ANALYST' then sal*0.1
when 'CLERK' then sal*0.15
when 'MANAGER' then sal*0.2 else 0 end) "수당"
from emp;
 
28.  위 문제를 DECODE를 사용하여 검색하라.
select empno, ename, job, sal,
decode(job,'ANALYST',sal*0.1,'CLERK',sal*0.15,'MANAGER',sal*0.2,'0') "수당"
from emp;
 
29.  급여가 1000 이상 2000 이하이면 1500을 지급하고 그 외에는 800을 지급하라
select empno, ename, job, sal,
(case when sal>=1000 and sal<=2000 then 1500 else 800 end) "수당"
from emp;
 
30.  현재 급여를 기준으로 입사한 달의 근무일수에 해당하는 급여를 산출하라.
(일일 급여액 = 연 급여액/365)
select ename, sal, hiredate,
(to_char(last_day(hiredate), 'dd') - to_char(hiredate, 'dd') +1)*sal/365 "첫달급여"
from emp;
 
31.  이름,입사일,입사일에서 6개월 뒤에 돌아오는 월요일을 구하여 검색
select ename, hiredate,
next_day(add_months(hiredate,'6'),'월') "d_nextmdy"
from emp;
 
32.  사원번호, 이름, 급여, 상사코드를 입력하고 상사코드가 NULL 이면 NO MGR을 검색하라.
select empno, ename, sal, nvl(to_char(mgr),'NO MGR') mgr from emp;
 
33.  사원번호, 이름, 급여, 보너스,급여와 보너스의 합을 검색하고 컬럼명은 INCOME으로 검색을 한다. 보너스가 NULL이면 급여만, NULL이 아니면 보너스와 급여의 합이 검색 되도록 하라. (NVL을 이용)
select empno, ename, sal, nvl(comm,'0'), sal+nvl(comm,'0') "INCOME" from emp;
 
34.  사원번호, 이름, 이름의 길이, 급여의 길이, 보너스 길이를 검색하고 급여는 보너스의 길이와 급여의 길이가 같으면 NULL을, 다르면 급여의 길이가 검색되게 하라.
select empno, ename,
length(ename) "이름길이", length(sal) "급여길이", length(comm) "보너스길이",
(case
when length(sal)!=length(comm) then length(sal) else null end) "조건부급여길이"
from emp;
 
select empno, ename,
length(ename) "이름길이", length(sal) "급여길이", length(comm) "보너스길이",
decode(length(sal), length(comm), null, length(sal)) "조건부급여길이"
from emp;
  
35.  다음과 같은 형태로 모든 사원 검색

Dream Salary        
------------------------------------------------  
SMITH salary:   $800.00  Dream Salary : $2,400  
ALLEN salary: $1,600.00  Dream Salary : $4,800  
WARD salary: $1,250.00  Dream Salary : $3,750  
……        

select ename || ' salary:'||to_char(sal, '$9,990.99')||'    Dream Salary :'||to_char(sal*3, '$9,990') "Dream Salary" from emp;
 
-----------------------------------------
 
1. 이름의 길이가 6자 이상인 사원의 정보를 이름, 이름 글자수, 업무를 검색
    
    ```sql
    select 
    ename, length(ename) "이름 글자수", job
    from emp
    where length(ename) >= 6;
    
    ENAME      이름 글자수 JOB
    ---------- ----------- ---------
    MARTIN               6 SALESMAN
    TURNER               6 SALESMAN
    MILLER               6 CLERK
    ```
    
2. SCOTT의 사원번호, 성명(소문자로), 담당업무(대문자로) 검색
    
    ```sql
    select 
    empno, lower(ename) "성명", upper(job) "담당업무"
    from emp
    where ename = 'SCOTT';
    
    EMPNO      성명       담당업무
    ---------- ---------- ---------
    7788       scott      ANALYST
    ```
    
3. DEPT 테이블에서 Loc 컬럼의 첫 글자만 대문자로 변환하여 검색
    
    ```sql
    select 
    initcap(loc) "LOC"
    from dept;
    
    LOC
    -------------
    New York
    Dallas
    Chicago
    Boston
    ```
    
4. 사원번호,이름,업무,급여를 검색하되 EMPNO와 ENAME을 줄 바꿔서 검색??
    
    ```sql
    select 
    ename, 
    empno, 
    job, sal 
    from emp;
    ```
    
5. 이름의 첫 글자가 ‘K’보다 크고 ‘Y’보다 작은 사원의 정보 검색
    
    ```sql
    select 
    ename
    from emp
    where substr(ename, 1, 1) > 'K' and substr(ename, 1, 1) < 'Y';
    
    ENAME
    ----------
    SMITH
    WARD
    MARTIN
    SCOTT
    TURNER
    MILLER
    
    6 개의 행이 선택되었습니다.
    ```
    
6. 사원번호,이름,이름의 길이,급여,급여의 길이 검색
    
    ```sql
    select 
    empno,
    ename, 
    length(ename) "이름의 길이",
    sal, 
    length(sal) "급여의 길이"
    from emp;
    
    EMPNO ENAME      이름의 길이        SAL 급여의 길이
    ---------- ---------- ----------- ---------- -----------
           101 홍동우               3
          7369 SMITH                5        800           3
          7499 ALLEN                5       1600           4
          7521 WARD                 4       1250           4
          7566 JONES                5       2975           4
          7654 MARTIN               6       1250           4
          7698 BLAKE                5       2850           4
          7782 CLARK                5       2450           4
          7788 SCOTT                5       3000           4
          7839 KING                 4       5000           4
          7844 TURNER               6       1500           4
    ```
    
7. 업무 중 ‘A’자의 위치를 검색, 두 번째 ‘A’자의 위치도 검색
    
    ```sql
    select 
    distinct(job), 
    instr(job, 'A', 1, 1) "첫 번째 A",
    instr(job, 'A', 1, 2) "두 번째 A"
    from emp;
    
    JOB        첫 번째 A  두 번째 A
    --------- ---------- ----------
    
    PRESIDENT          0          0
    CLERK              0          0
    ANALYST            1          3
    MANAGER            2          4
    SALESMAN           2          7
    ```
    
8. 이름의 검색 자릿수를 20으로 하고 오른쪽 빈칸에 ‘*’을 채우고,
    
    ```sql
    select 
    rpad(ename, 20, '*')
    from emp;
    
    RPAD(ENAME,20,'*')
    ----------------------
    홍동우**************
    SMITH***************
    ALLEN***************
    WARD****************
    JONES***************
    MARTIN**************
    BLAKE***************
    CLARK***************
    SCOTT***************
    KING****************
    TURNER**************
    ```
    
9. 담당 업무 중 좌측에 ‘A’를 삭제하고 급여 중 좌측의 1을 삭제한 후 검색
    
    ```sql
    select 
    ltrim(job, 'A') "job",
    ltrim(sal, 1) "sal"
    from emp;
    
    job       sal
    --------- ----------------------------------------
    
    CLERK     800
    SALESMAN  600
    SALESMAN  250
    MANAGER   2975
    SALESMAN  250
    
    ```
    
10. 담당 업무 중 우측에 ‘T’를 삭제하고 급여 중 우측의 0을 삭제한 후 검색
    
    ```sql
    select 
    rtrim(job, 'T') "job",
    rtrim(sal, 0) "sal"
    from emp;
    
    job       sal
    --------- ----------------------------------------
    
    CLERK     8
    SALESMAN  16
    SALESMAN  125
    MANAGER   2975
    SALESMAN  125
    ```
    
11. 이름 중에 ‘A’,’B’,’C’는 소문자로 바꿔서 검색하고 급여를 숫자가 아닌 글자로 검색 (급여가 1425 이면 일사이오 )
    
    ```sql
    select 
    translate(ename, 'ABC', 'abc') "이름",
    translate(to_char(sal), '0123456789', '영일이삼사오육칠팔구') "급여",
    from emp;
    
    select 
    translate(ename, 'ABC', 'abc') "이름",
    translate(sal, 1234567890, '일이삼사오육칠팔구영') "급여"
    from emp;
    
    이름                 급여
    -------------------- --------------------------------------------------------------------------------
    홍동우
    SMITH                팔영영
    aLLEN                일육영영
    WaRD                 일이오영
    JONES                이구칠오
    MaRTIN               일이오영
    bLaKE                이팔오영
    ```
    
12. JOB의 글자 중 ‘LE’를 ‘AL’로 바꿔서 검색
    
    ```sql
    select
    replace(job, 'LE', 'AL') "JOB"
    from emp;
    
    JOB
    ------------------
    
    CALRK
    SAALSMAN
    SAALSMAN
    MANAGER
    SAALSMAN
    MANAGER
    MANAGER
    ANALYST
    PRESIDENT
    SAALSMAN
    ```
    
13. 모든 사원의 이름과 급여를 연결(||)하여 검색하되 각 15자리씩 왼쪽을 공백으로 검색
    
    SMITH            800
    
    ALLEN           1600
    
    ```sql
    select
    lpad(ename, 15, ' ') || lpad(sal, 15, ' ') "이름+급여"
    from emp;
    
    이름+급여
    ----------------------------------------
             홍동우
              SMITH            800
              ALLEN           1600
               WARD           1250
              JONES           2975
             MARTIN           1250
              BLAKE           2850
    ```
    
14. 숫자 1234.5678를 정수로 반올림하고 소수 첫째 자리까지 반올림과 절삭한 값을 검색
    
    ```sql
    select 
    round(1234.5678, 0) "round 0",
    round(1234.5678, 1) "round 1", 
    trunc(1234.5678, 1) "trunc"
    from dual
    
    round 0    round 1      trunc
    ---------- ---------- ----------
          1235     1234.6     1234.5
    ```
    
15. 숫자 -456.789를 정수로 올림하고 -123.78을 내림한 정수를 검색
    
    ```sql
    select 
    ceil(-456.789) "ceil",
    floor(-123.78) "floor"
    from dual;
    
    ceil      floor
    ---------- ----------
          -456       -124
    ```
    
16. 급여를 30으로 나눈 나머지를 구하여 검색
    
    ```sql
    select 
    mod(sal, 30) "mod"
    from emp;
    
    mod
    ----------
            20
            10
            20
             5
            20
    ```
    
17. 모든 사원의 정보를 이름,업무,입사일, 입사한 요일을 검색
    
    ```sql
    select 
    ename, 
    job, 
    hiredate,
    to_char(hiredate, 'day') "입사요일"
    from emp;
    
    ENAME      JOB       HIREDATE 입사요일
    ---------- --------- -------- ---------
    홍동우
    SMITH      CLERK     80/12/17 수요일
    ALLEN      SALESMAN  81/02/20 금요일
    WARD       SALESMAN  81/02/22 일요일
    JONES      MANAGER   81/04/02 목요일
    MARTIN     SALESMAN  81/09/28 월요일
    ```
    
18. 현재까지의 근무일수가 몇 주 몇 일인가 검색하라. 근무일수가 많은 사람순서로 검색하라.
    
    (예:총 근무일수가 20일이면 2주 6일이 검색되게 한다.)
    
    ```sql
    select 
    ename, 
    floor((sysdate - hiredate) / 7)||'주 '|| 
    floor(mod((sysdate - hiredate), 7))||'일'
    "근무일수"
    from emp
    where hiredate is not null
    order by  "근무일수" desc;
    
    ENAME      근무일수
    ---------- -------------------------------------------------------------------------------------
    SMITH      2170주 0일
    ALLEN      2160주 5일
    WARD       2160주 3일
    JONES      2154주 6일
    BLAKE      2150주 5일
    CLARK      2145주 1일
    ```
    
19. 현재까지의 근무 월수를 계산하여 정수로 검색하라.
    
    ```sql
    select 
    ename, 
    floor(months_between(sysdate, hiredate)) "근무 월수"
    from emp
    where hiredate is not null;
    
    ENAME       근무 월수
    ---------- ----------
    SMITH             499
    ALLEN             497
    WARD              496
    JONES             495
    MARTIN            489
    BLAKE             494
    ```
    
20. 입사일로부터 5개월이 지난 후 날짜를 ROUND 함수와 TRUNC함수를 이용하여 월을 기준으로 검색하라 
    
    ```sql
    select 
    ename,
    round(add_months(hiredate, 5), 'month')
    from emp;
    ```
    
21. 입사일자로부터 돌아오는 금요일을 검색하라
    
    ```sql
    select 
    ename, 
    hiredate,
    next_day(hiredate, '금')
    from emp;
    
    ENAME      HIREDATE NEXT_DAY
    ---------- -------- --------
    SMITH      80/12/17 80/12/19
    ALLEN      81/02/20 81/02/27
    WARD       81/02/22 81/02/27
    JONES      81/04/02 81/04/03
    MARTIN     81/09/28 81/10/02
    BLAKE      81/05/01 81/05/08
    CLARK      81/06/09 81/06/12
    SCOTT      87/04/19 87/04/24
    KING       81/11/17 81/11/20
    TURNER     81/09/08 81/09/11
    ```
    
22. 입사한 달의 근무일수를 계산하여 검색하라, 단 토/일요일도 근무일수에 포함한다.
    
    ```sql
    select 
    hiredate,
    last_day(hiredate) - hiredate + 1 "입사월근무일수"
    from emp;
    
    HIREDATE 입사월근무일수
    -------- --------------
    
    80/12/17             15
    81/02/20              9
    81/02/22              7
    81/04/02             29
    81/09/28              3
    81/05/01             31
    81/06/09             22
    87/04/19             12
    81/11/17             14
    81/09/08             23
    ```
    
23. 입사날짜를 ‘1 Jan 1981’ 과 ‘1981년 01월 01일’의 형태로 검색하라.
    
    ```sql
    select 
    to_char(hiredate, 'fmdd mon yyyy') "입사일 1",
    to_char(hiredate, 'yyyy"년" mm"월" dd"일"') "입사일 2"
    from emp;
    ```
    
24. 입사일이 February 20, 1981과 May 1, 1981 사이에 입사한 사원의 이름,업무,입사일을 검색.
    
    ```sql
    select 
    ename, 
    job, 
    hiredate
    from emp
    where hiredate >= to_date('81/02/20') and hiredate < to_date('81/05/02');
    
    ENAME      JOB       HIREDATE
    ---------- --------- --------
    ALLEN      SALESMAN  81/02/20
    WARD       SALESMAN  81/02/22
    JONES      MANAGER   81/04/02
    BLAKE      MANAGER   81/05/01
    ```
    
25. 위의 문제를 현재 세션을 February 20, 1981에 맞게 변경한 후에 검색하라.
    
    ```sql
    ALTER SESSION SET NLS_DATE_FORMAT = 'month dd, yyyy';
    ALTER SESSION SET NLS_DATE_LANGUAGE = 'ENGLISH';
    
    select 
    ename, 
    job, 
    hiredate
    from emp
    where hiredate >= to_date('February 20, 1981') and hiredate < to_date('May 02, 1981');
    
    ENAME      JOB       HIREDATE
    ---------- --------- ----------------------
    ALLEN      SALESMAN  february  20, 1981
    WARD       SALESMAN  february  22, 1981
    JONES      MANAGER   april     02, 1981
    BLAKE      MANAGER   may       01, 1981
    ```
    
26. 연봉에 보너스를 합한 금액을 $를 삽입하고 3자리마다 ,를 검색하라.
    
    ```sql
    select
    ename,
    sal,
    to_char((sal + nvl(comm, 0)), '$9,999,990') "연봉+보너스"
    from emp;
    
    ENAME             SAL 연봉+보너스
    ---------- ---------- -----------
    SMITH             800        $800
    ALLEN            1600      $1,900
    WARD             1250      $1,750
    JONES            2975      $2,975
    MARTIN           1250      $2,650
    BLAKE            2850      $2,850
    ```
    
27. JOB이 ANALYST 이면 수당으로 급여의 10%를 지급하고 CLERK 이면 급여의 15% 지급, MANAGER이면 20% 지급하려고 한다. 다른 업무는 보너스가 없다. 사원번호,이름,업무,급여,수당을 검색하라. (CASE문)
    
    ```sql
    select 
    empno,
    ename,
    job,
    sal, 
    case job when 'ANALYST' then sal*0.1
      when 'CLERK' then sal*0.15
      when 'MANAGER' then sal*0.2
      else 0 end
    "수당"
    from emp;
    
    EMPNO ENAME      JOB              SAL       수당
    ---------- ---------- --------- ---------- ----------
           101 홍동우                                   0
          7369 SMITH      CLERK            800        120
          7499 ALLEN      SALESMAN        1600          0
          7521 WARD       SALESMAN        1250          0
          7566 JONES      MANAGER         2975        595
          7654 MARTIN     SALESMAN        1250          0
          7698 BLAKE      MANAGER         2850        570
          7782 CLARK      MANAGER         2450        490
          7788 SCOTT      ANALYST         3000        300
          7839 KING       PRESIDENT       5000          0
          7844 TURNER     SALESMAN        1500          0
    
         EMPNO ENAME      JOB              SAL       수당
    ---------- ---------- --------- ---------- ----------
          7876 ADAMS      CLERK           1100        165
          7900 JAMES      CLERK            950      142.5
          7902 FORD       ANALYST         3000        300
          7934 MILLER     CLERK           1300        195
    ```
    
28. 위 문제를 DECODE를 사용하여 검색하라.
    
    ```sql
    select 
    empno, 
    ename, 
    job, 
    sal, 
    decode(job, 'ANALYST', sal*0.1, 'CLERK', sal*0.15, 'MANAGER', sal*0.2, 0) "수당"
    from emp;
    
    EMPNO ENAME      JOB              SAL       수당
    ---------- ---------- --------- ---------- ----------
           101 홍동우                                   0
          7369 SMITH      CLERK            800        120
          7499 ALLEN      SALESMAN        1600          0
          7521 WARD       SALESMAN        1250          0
          7566 JONES      MANAGER         2975        595
          7654 MARTIN     SALESMAN        1250          0
          7698 BLAKE      MANAGER         2850        570
          7782 CLARK      MANAGER         2450        490
          7788 SCOTT      ANALYST         3000        300
          7839 KING       PRESIDENT       5000          0
          7844 TURNER     SALESMAN        1500          0
    
         EMPNO ENAME      JOB              SAL       수당
    ---------- ---------- --------- ---------- ----------
          7876 ADAMS      CLERK           1100        165
          7900 JAMES      CLERK            950      142.5
          7902 FORD       ANALYST         3000        300
          7934 MILLER     CLERK           1300        195
    ```
    
29. 급여가 1000 이상 2000 이하이면 1500을 지급하고 그 외에는 800을 지급하라
    
    ```sql
    select 
    ename, 
    sal, 
    case when sal >= 1000 and 2000 <= 2000 then 1500
      else 800 end
    "보너스"
    from emp;
    
    ENAME             SAL     보너스
    ---------- ---------- ----------
    홍동우                       800
    SMITH             800        800
    ALLEN            1600       1500
    WARD             1250       1500
    JONES            2975       1500
    MARTIN           1250       1500
    BLAKE            2850       1500
    CLARK            2450       1500
    SCOTT            3000       1500
    KING             5000       1500
    TURNER           1500       1500
    
    ENAME             SAL     보너스
    ---------- ---------- ----------
    ADAMS            1100       1500
    JAMES             950        800
    FORD             3000       1500
    MILLER           1300       1500
    ```
    
30. 현재 급여를 기준으로 입사한 달의 근무일수에 해당하는 급여를 산출하라.
    
    (일일 급여액 = 연 급여액/365)
    
    ```sql
    select 
    ename, 
    floor((last_day(hiredate) - hiredate + 1) * (sal/365)) "입사월 급여"
    from emp;
    
    ENAME      입사월 급여
    ---------- -----------
    SMITH               32
    ALLEN               39
    WARD                23
    JONES              236
    MARTIN              10
    BLAKE              242
    CLARK              147
    SCOTT               98
    KING               191
    TURNER              94
    ```
    
31. 이름,입사일,입사일에서 6개월 뒤에 돌아오는 월요일을 구하여 검색
    
    ```sql
    select 
    ename, 
    hiredate,
    next_day(add_months(hiredate, 6), 'Monday') "6개월 뒤 월요일"
    from emp;
    
    ENAME      HIREDATE               6개월 뒤 월요일
    ---------- ---------------------- ----------------------
    홍동우
    SMITH      december  17, 1980     june      22, 1981
    ALLEN      february  20, 1981     august    24, 1981
    WARD       february  22, 1981     august    24, 1981
    JONES      april     02, 1981     october   05, 1981
    MARTIN     september 28, 1981     march     29, 1982
    BLAKE      may       01, 1981     november  02, 1981
    CLARK      june      09, 1981     december  14, 1981
    SCOTT      april     19, 1987     october   26, 1987
    KING       november  17, 1981     may       24, 1982
    TURNER     september 08, 1981     march     15, 1982
    ```
    
32. 사원번호, 이름, 급여, 상사코드를 입력하고 상사코드가 NULL 이면 NO MGR을 검색하라.
    
    ```sql
    select 
    empno, 
    ename, 
    sal, 
    nvl(to_char(MGR), 'NO MGR') "MGR"
    from emp;
    
    EMPNO ENAME             SAL MGR
    ---------- ---------- ---------- ----------------------------------------
           101 홍동우                NO MGR
          7369 SMITH             800 7902
          7499 ALLEN            1600 7698
          7521 WARD             1250 7698
          7566 JONES            2975 7839
          7654 MARTIN           1250 7698
          7698 BLAKE            2850 7839
          7782 CLARK            2450 7839
          7788 SCOTT            3000 7566
          7839 KING             5000 NO MGR
    ```
    
33. 사원번호, 이름, 급여, 보너스,급여와 보너스의 합을 검색하고 컬럼명은 INCOME으로 검색을 한다. 보너스가 NULL이면 급여만, NULL이 아니면 보너스와 급여의 합이 검색 되도록 하라. (NVL을 이용)
    
    ```sql
    select 
    empno, 
    ename, 
    sal, 
    comm, 
    nvl2(comm, sal + comm, sal) "INCOME"
    from emp;
    
    EMPNO ENAME             SAL       COMM     INCOME
    ---------- ---------- ---------- ---------- ----------
           101 홍동우
          7369 SMITH             800                   800
          7499 ALLEN            1600        300       1900
          7521 WARD             1250        500       1750
          7566 JONES            2975                  2975
          7654 MARTIN           1250       1400       2650
          7698 BLAKE            2850                  2850
          7782 CLARK            2450                  2450
          7788 SCOTT            3000                  3000
          7839 KING             5000                  5000
          7844 TURNER           1500          0       1500
    ```
    
34. 사원번호, 이름, 이름의 길이, 급여의 길이, 보너스 길이를 검색하고 급여는 보너스의 길이와 급여의 길이가 같으면 NULL을, 다르면 급여의 길이가 검색되게 하라.
    
    ```sql
    select 
    empno, 
    ename, 
    length(ename),
    length(sal), 
    length(comm),
    case when length(sal) = length(comm) then null
      else length(sal) end
    "급여"
    from emp;
    
    EMPNO ENAME      LENGTH(ENAME) LENGTH(SAL) LENGTH(COMM)       급여
    ---------- ---------- ------------- ----------- ------------ ----------
           101 홍동우                 3
          7369 SMITH                  5           3                       3
          7499 ALLEN                  5           4            3          4
          7521 WARD                   4           4            3          4
          7566 JONES                  5           4                       4
          7654 MARTIN                 6           4            4
          7698 BLAKE                  5           4                       4
          7782 CLARK                  5           4                       4
          7788 SCOTT                  5           4                       4
          7839 KING                   4           4                       4
          7844 TURNER                 6           4            1          4
    
         EMPNO ENAME      LENGTH(ENAME) LENGTH(SAL) LENGTH(COMM)       급여
    ---------- ---------- ------------- ----------- ------------ ----------
          7876 ADAMS                  5           4                       4
          7900 JAMES                  5           3                       3
          7902 FORD                   4           4                       4
          7934 MILLER                 6           4                       4
    ```
    
35. 다음과 같은 형태로 모든 사원 검색 
    
    ```sql
    select 
    rpad(ename, 6, ' ') ||
     ' salary: ' || 
    lpad(to_char(sal, '$99,999.00'), 10, ' ') ||
    'Dream Salary: ' ||
    lpad(to_char(sal*3, '$99,999.00'), 10, ' ')
    "Dream Salary"
    from emp
    where sal is not null;
    
    Dream Salary
    ---------------------------------------------------------------------------
    SMITH  salary:     $800.0Dream Salary:   $2,400.0
    ALLEN  salary:   $1,600.0Dream Salary:   $4,800.0
    WARD   salary:   $1,250.0Dream Salary:   $3,750.0
    JONES  salary:   $2,975.0Dream Salary:   $8,925.0
    MARTIN salary:   $1,250.0Dream Salary:   $3,750.0
    BLAKE  salary:   $2,850.0Dream Salary:   $8,550.0
    CLARK  salary:   $2,450.0Dream Salary:   $7,350.0
    SCOTT  salary:   $3,000.0Dream Salary:   $9,000.0
    KING   salary:   $5,000.0Dream Salary:  $15,000.0
    TURNER salary:   $1,500.0Dream Salary:   $4,500.0
    ADAMS  salary:   $1,100.0Dream Salary:   $3,300.0
    ```

728x90
반응형