본문으로 바로가기

18223 DB-3

category 프로그래밍/DB 2018. 2. 25. 19:20


DB 180223.pdf

 

 IndexString : 문자열의 번호(숫자)를 반환한다.

*INSTR(대상문자열, 찾는문자열)

 

-> 1에서 첫번째 값2를 찾아 위치하고 있는 인덱스숫자를 리턴한다. 결과는 3

EX)

SELECT INSTR('HELLO WORLD', 'L')

FROM DUAL;


 

EX)

SELECT INSTR('HELLO WORLD', 'k')

FROM DUAL;

값을 찾을 수 없는 경우 0으로 표시된다. 참고로 프로그래밍 언어에서는 -1로 표시된다.

 

 


*INSTR(대상문자열, 찾는문자열, 찾는시작위치)

EX)

SELECT INSTR('HELLO WORLD', 'L',5)

FROM DUAL;

 

->5번째부터 시작해서 L이 있는 위치하고 있는 숫자를 리턴한다. 결과는 10

 


 

 

*INSTR(대상문자열, 찾는문자열, 찾는시작위치, 몇번째)

EX)

SELECT INSTR('HELLO WORLD', 'L',1, 2)

FROM DUAL;

 

->첫번째부터 시작하는데 첫번째위치는 L위치가 3이지만 2번째 L을 찾아야 하므로 결과가 4가 된다.

 




*INSTR(대상문자열, 찾는문자열, 찾는시작위치, 몇번째)

 

EX)

SELECT INSTR('HELLO WORLD', 'L',-1, 2)

FROM DUAL;

 

 


 

마이너스가 붙으면 뒤에서 부터 앞으로 움직이는데 2번째 L을 찾아야 하므로 위의 결과랑 동일하게

4가 출력된다.

 

EX)

SELECT first_name

FROM EMPLOYEES

WHERE INSTR(UPPER(FIRST_NAME), 'A',2) = 2;

 


 

 

*like 사용없이 a 2개 들어가고 1분기에 입사한 사원과 입사일을 구하시오.

 

SELECT FIRST_NAME,HIRE_DATE

FROM EMPLOYEES

where to_char(hire_date,'q')=1   --q Quarter약자

 AND INSTR(UPPER(FIRST_NAME), 'A',1, 2)  > 0;    

                              대상문자열,  찾는문자열, 찾는시작위치, 몇번째

 

 


 

A의 첫번째 시작 위치가 어디에서 시작될지 모르지만 첫번째를 찾고 두번째

A가 나올때 까지 찾는데 0보다 커야 한다. 왼쪽부터 찾아야 하므로

 

*문자열 바꾸는 REPLACE함수

*REPLACE(문자열, '대상문자열', '바꿀문자열')

 

SELECT REPLACE('HELLO WORLD!!', 'L','R')

FROM DUAL;

 

 


 

 

SELECT REPLACE('HELLO WORLD!!', '!!','X')

FROM DUAL;

 

 


 

 

-공백제거

SELECT REPLACE('HELLO WORLD!!', ' ','')

FROM DUAL;

 


 

-왼쪽공백제거

SELECT LTRIM('            HELLO WORLD!!       ')

FROM DUAL;

 


 

 

-오른쪽공백제거  

 

SELECT RTRIM('            HELLO WORLD!!       ')

FROM DUAL;

 

 

 

-양쪽의 공백을 지운다.

 

SELECT TRIM('            HELLO WORLD!!       ')

FROM DUAL;

 

 


*fIrstname + lastname을 이용하여 EMAIL을 구하기

SELECT SUBSTR(FIRST_NAME,1,1)|| UPPER(REPLACE(LAST_NAME,' ', ''))

FROM EMPLOYEES;

 

 

 


 

 

 

 

*case

Select 컬럼명,,,,

case when 조건1  then     1 : 조건1 true이면 값1을 돌려준다.

...

    

     else  n   : 그렇지 않으면 값n을 돌려준다.

end

when, then은 항상 한세트씩

 

EX) JOB이름이 PU CLERK를 찾아 만족하면 급여를 11% 인상하시오.

 

SELECT FIRST_NAME, JOB_ID, SALARY

    CASE WHEN JOB_ID = 'PU CLERK'

         THEN SALARY * 1.1  --11%인상

         ELSE SALARY

    END AS UP_SAL

FROM EMPLOYEES;

 

 


 

 

EX)

홀수월에 입사한 사원들의 급여를 30% 감봉하고

짝수월에 입사한 사원들의 급여를 30%인상하여

변경된 급여의 내림차순으로 사원들의 정보를 클릭하시오.

 

 

-출력 : 이름, 입사일, 급여, 변경급여

 

 

SELECT FIRST_NAME,  HIRE_DATE,

    CASE WHEN MOD(TO_CHAR(HIRE_DATE,'MM'),2 )= 1

         THEN SALARY * 0.7

         ELSE SALARY * 1.3

    END AS POST_SALARY, SALARY

FROM EMPLOYEES

ORDER BY POST_SALARY DESC;

 

 


 

--반올림

  -ROUND() : 값을 정수형으로 반올림한다.

  -ROUND(, 숫자) : 값을 숫자번째 자리까지 반올림한다.

ex)

SELECT ROUND(3.14159), ROUND(3.14159,2)

FROM DUAL;

 


 

만약에 3.54159였다면 결과는 4가됩니다.

 

 

--올림

 

--CEIL() : 값을 정수형으로 올림한다.

소수점은 신경쓰지 않음.

 

 


 

--내림

 

--FLOOR() : 값을 정수형으로 내림한다.

소수점아래는 없는것으로 치겠다.

 

 


 

Ex)

--80번 부서에 있는 사원들 중 급여가 9000 이하인 사원들의 급여를

  50% 인상하고, 1500을 초과하는 사원들의 급여를 10% 삭감하여

  80번 부서 사원정보를 출력하시오.

  출력: 부서번호, 사원명, 급여, 변경급여

 

  

SELECT DEPARTMENT_ID, FIRST_NAME, SALARY,

 

 

    CASE WHEN SALARY <= 9000 

         THEN SALARY * 1.5

         ELSE SALARY * 0.9

    END AS RE_SAL

FROM EMPLOYEES

WHERE DEPARTMENT_ID = 80

;

 

 


 

 

Ex)

--80번 부서에 있는 사원들 중 급여가 9000 이하인 사원들의 급여를

  50% 인상하고, 1500을 초과하는 사원들의 급여를 10% 삭감하여

  전체 사원정보를 출력하시오.

  출력: 부서번호, 사원명, 급여, 변경급여

 

 

SELECT DEPARTMENT_ID, FIRST_NAME, SALARY,

    CASE WHEN DEPARTMENT_ID=80 AND SALARY <= 9000 

 

 

         THEN SALARY * 1.5

         WHEN DEPARTMENT_ID=80 AND SALARY > 9000 

         THEN SALARY * 1.5

         ELSE SALARY

    END AS RE_SAL

FROM EMPLOYEES

 

;

 


 

*DECODE(, 비교값1, 결과값, ..., 결과값n)

--값과 비교값1이 같다면 결과값1을 돌려준다.

--일치하는 것이 없으면 결과값N을 돌려준다.

 

SELECT FIRST_NAME, HIRE_DATE,

DECODE(TO_CHAR(HIRE_DATE, 'YY'), 01, '창립',

       08, '마지막 입사', '중간입사') AS 구분

FROM EMPLOYEES;

 

--EX : 01년도에 입사한 사원을 창립으로 표현하고

--08년도에 입사한 사원을 마지막 입사로 표현하고

-- 그 외 사원을 중간 입사로 표현하시오.

--값과 비교값1이 같다면 결과값

 

 


 

 

--홀수분기에 입사한 사원의 급여를 10%감봉하고

--짝수분기에 입사한 사원의 급여를 20%인상하여

--사원 정보를 출력

--출력: 사원명, 입사일, 급여, 변경급여

 

SELECT FIRST_NAME, hire_date, Salary,

DECODE(MOD(To_char(HIRE_DATE, 'q'),2), 1, round(SALARY*0.9),round( SALARY*1.2) ) AS 변경급여

FROM EMPLOYEES



 

 

;

 

 

 

 

 

 

'프로그래밍 > DB' 카테고리의 다른 글

DB-180228  (491) 2018.03.02
DB-180227  (479) 2018.03.02
180226 DB-4  (487) 2018.02.27
180222 DB-2  (475) 2018.02.22
2018221 DB-1  (475) 2018.02.21