[오라클] 연산자
본문 바로가기
IT. 컴퓨터

[오라클] 연산자

by 솔기잇 2020. 4. 24.

NULL 존재하지 않는 값이므로 연산에 사용할 없다.

 SELECT 1+2+3+4+5, 5-2, 5*2, 5/2

FROM DUAL;

 

SELECT 1+2+3+4+5, 5-NULL, 5*NULL, 5/1, 5/NULL

FROM DUAL;

 

SELECT NAME, COMM

FROM TBL_NEWSAWON;

 

SELECT NAME, COMM

FROM TBL_NEWSAWON

WHERE COMM =0;

 

SELECT NAME, COMM

FROM TBL_NEWSAWON

WHERE COMM IS NULL;  -- = 대신 IS 해서 쓴다.

 

 

SELECT NAME, COMM

FROM TBL_NEWSAWON

WHERE NOT COMM IS NULL;

 

SELECT NAME, COMM

FROM TBL_NEWSAWON

WHERE  COMM IS NOT NULL;   -- 위의 것과 같은 결과

  

SELECT NAME AS "사원명", SAL "급여",  COMM 커미션,

       --연봉 => 12 급여 + 커미션

       -- SAL*12 + COMM 이것이 아니라

       NVL(COMM,0) "연봉",  -- NULL이라면 0 나타내라

       NVL2(COMM, 999, 888), -- NULL이라면 999, NULL 아니라면 888

       NVL2(COMM, COMM, 0)

FROM TBL_NEWSAWON;

 

SELECT NAME,SAL, COMM,            -- 위와 똑같은

       SAL*12+ NVL(COMM, 0),

       NVL2(COMM, SAL*12 + COMM, SAL*12)

FROM TBL_NEWSAWON;

 

SELECT NAME,SAL, COMM,           

       SAL*12+ NVL(COMM, 0),

       NVL2(COMM, SAL*12 + COMM, SAL*12),

       COALESCE(SAL*12 + COMM, SAL*12, COMM,0)

-- NULL이면 다음 값을, 다음 값을 ..., NULL 나올 때까지 나온다

FROM TBL_NEWSAWON;

 

<<급여와 보너스를 합해서 연봉을 구하기>>

SELECT FIRST_NAME AS "",

            SALARY AS "급여",

            COMMISSION_PCT AS "보너스%",

            (SALARY + NVL(SALARY*COMMISSION_PCT,0) ) * 12  AS "연봉1",

            NVL2(COMMISSION_PCT,

                     (SALARY + SALARY*COMMISSION_PCT) * 12,

                      SALARY * 12)  AS "연봉2",

            COALESCE((SALARY + SALARY*COMMISSION_PCT) * 12,

                             SALARY * 12, 0) AS "연봉3"

FROM EMPLOYEES;

 

 

 

문자, 날짜, 숫자, 어떤 것이든 연결시켜주는 연결 연산자인 || 연산자

   

    SELECT *

    FROM TBL_NEWSAWON;

   

    SELECT '사원번호가'|| SANO || '' || NAME || HIREDATE ||'입니다.'

    FROM TBL_NEWSAWON;

   

    <<>>

사원번호가1001인한석규90/01/02입니다.

사원번호가1002인두석규92/01/03입니다.

사원번호가1003인세석규94/01/04입니다.

사원번호가1004인네석규96/01/05입니다.

사원번호가1005인오연수96/01/06입니다.

사원번호가2001인일용이00/01/07입니다.

사원번호가2002인이미자01/01/08입니다.   

   

 

 

TBL_NEWSAWON 테이블에서 급여가 2000 이상 4000 이하

직원들의 정보를 사원번호, 사원명, 직급, 급여로 나타내세요.

 

    SELECT DEPTNO, SANO, NAME, JIK, SAL   -- 이것을 권장

    FROM TBL_NEWSAWON

    WHERE SAL>=2000 AND SAL <=4000;

   

   

SELECT DEPTNO, SANO, NAME, JIK, SAL  -- (위의 값과 같음)

    FROM TBL_NEWSAWON                   

    WHERE SAL BETWEEN 2000 AND 4000;     -- 2000 이상 4000이하

   

   

    

SELECT DEPTNO, SANO, NAME, JIK, SAL  

    FROM TBL_NEWSAWON

    WHERE SAL < 2000 OR SAL > 4000;      --2000 작고  4000크다

   

      SELECT DEPTNO, SANO, NAME, JIK, SAL   --위의 값과 같음

    FROM TBL_NEWSAWON

    WHERE NOT (SAL BETWEEN 2000 AND 4000); 

   

 

정렬함수 (ORDER BY)

    SELECT DEPTNO, SANO, NAME, JIK,

           NVL2(COMM,SAL*12 + COMM, SAL *12)

           AS "YEARPAY"

    FROM TBL_NEWSAWON

   WHERE SAL >= 2000 AND SAL <= 4000

   ORDER BY NVL2(COMM, SAL*12 + COMM, SAL*12) DESC;

 

 

   

    SELECT DEPTNO, SANO, NAME, JIK,

           NVL2(COMM,SAL*12 + COMM, SAL *12)

           AS "YEARPAY"

    FROM TBL_NEWSAWON

    WHERE SAL>=2000 AND SAL <=4000

    ORDER BY 5 DESC; -- 내림차순 (5:다섯번째 컬럼을 내림차순으로)

   

    <>

DEPTNO  SANO NAME    JIK        YEARPAY

10         1002    두석규    부장       48600

30         3002    노주현    과장       48600

20         2002    이미자    과장       48600

20         2001    일용이    부장       48500

10         1003    세석규    과장       36500

20         2003    삼미자    사원       36500

30         3001    고소영    부장       36400

30         3003    도지원    사원       36200

30         3009    이자연    대리       36000

20         2004    사미자    사원       36000

10         1004    네석규    사원       24000

 

 

SELECT DEPTNO, SANO, NAME, JIK,

           NVL2(COMM,SAL*12 + COMM, SAL *12)

           AS "YEARPAY"

    FROM TBL_NEWSAWON

    WHERE SAL>=2000 AND SAL <=4000

    ORDER BY 5 ASC; -- 오름차순 (생략가능)

      

    <>

DEPTNO  SANO NAME    JIK        YEARPAY

30         3005    마광수    사원       24000

10         1004    네석규    사원       24000

10         1005    오연수    사원       24000

30         3004    류시원    사원       24000

20         2002    이미자    과장       48600

10         1002    두석규    부장       48600

30         3002    노주현    과장       48600   

 

 

    SELECT DEPTNO, SANO, NAME, JIK,

           NVL2(COMM,SAL*12 + COMM, SAL *12)

           AS "YEARPAY"

    FROM TBL_NEWSAWON

    WHERE SAL>=2000 AND SAL <=4000

    ORDER BY 4,5 DESC;-- 같은 차순에 연봉을 내림차순으로 보고 싶다.

                                           

  <>

DEPTNO             SANO    NAME    JIK        YEARPAY

30         3002    노주현    과장       48600

20         2002    이미자    과장       48600

10         1003    세석규    과장       36500

10         1005    오연수    사원       24000

10         1004    네석규    사원       24000

30         3004    류시원    사원       24000

30         3005    마광수    사원       24000 

                     

                     

 

 

 

SELECT DISTINCT DEPTNO, JIK -- DISTINCT 중복되는 값을 하나만 출력

 FROM TBL_NEWSAWON

 ORDER BY 1;  --NULL 오라클은 가장 값으로 간주

 

 <>

DEPTNO             JIK

10         과장

10         사원

10         사장

20         과장

20         사원

30         과장

30         사원

NULL 사원      

 

 

단일행함수

문자 함주, 숫자함수, 날짜함수

 

 1. 문자함수

    A. UPPER -- 모든 문자를 대문자로 변환시켜주는 함수

    B. LOWER -- 모든 문자를 소문자로 변환시켜주는 함수

    C. INITCAP -- 첫글자만 대문자로 변환시키고 나머지 글자는

               -- 모두 소문자로 변환시켜주는 함수

 

SELECT JOB,UPPER(JOB), LOWER(JOB),INITCAP(JOB)

FROM EMP

WHERE JOB ='sAleSMan'

 

<<>>

JOB            UPPER(JOB)       LOWER(JOB)    INITCAP(JOB)

sAleSMan          SALESMAN        salesman           Salesman

 

    D. CONCAT

-- 두개의 문자열을 연결시켜주는 함수 

   

    SELECT NAME,JIK,

           CONCAT(NAME,JIK) -- 두개만 붙일 있다.

    FROM TBL_NEWSAWON;  

   

    <>

NAME    JIK        CONCAT(NAME,JIK)

한석규    사장       한석규사장

두석규    부장       두석규부장

세석규    과장       세석규과장

네석규    사원       네석규사원

오연수    사원       오연수사원         

 

 

    SELECT NAME,JIK,JUBUN,

           --CONCAT(NAME,JIK || JUBUN),

            CONCAT(CONCAT(NAME,JIK), JUBUN )

FROM TBL_NEWSAWON;

   

   

    <>

NAME    JIK        JUBUN  CONCAT(CONCAT(NAME,JIK),JUBUN)

한석규    사장       7110031234567           한석규사장7110031234567

두석규    부장       7210031234567           두석규부장7210031234567

세석규    과장       7310031234567           세석규과장7310031234567

네석규    사원       7410031234567           네석규사원7410031234567

오연수    사원       7510032234567           오연수사원7510032234567

일용이    부장       8110031234567           일용이부장8110031234567

 

   

    DESC TBL_SAWON;

   

   

   

E. SUBSTR

--특정 문자열에서 특정한 일부부만 추출할 사용 하는 함수이다.

   

   

    SELECT 'KH정보교육원',

            SUBSTR('KH정보교육원',1,4), -- 첫번째 글자에서 4번째까지 뽑아라

            SUBSTR('KH정보교육원',2,4),

            SUBSTR('KH정보교육원',3)  -- 세번째 글자부터 끝까지 뽑아라

    FROM DUAL;

   <>

    KH정보교육원            KH정보        H정보교       정보교육원

 

 

 SELECT NAME,SUBSTR(JUBUN,1,6),JIK

 FROM TBL_NEWSAWON;

 

 

 <퀴즈> TBL_NEWSAWON 테이블에서 여자만 사원번호, 사원명, 직급을 나타내세요.

       

<>

SELECT JUBUN,SANO,NAME, JIK

FROM TBL_NEWSAWON       

WHERE SUBSTR (JUBUN,7,1)=2 OR SUBSTR (JUBUN,7,4)=4;  -- IN (2,4)

 

 SELECT 'KH정보교육원',

            SUBSTRB('KH정보교육원',1,4), -- B는바이트를 뜻한다. ~4바이트까지

            SUBSTRB('KH정보교육원',2,4),

            SUBSTRB('KH정보교육원',4) 

 FROM DUAL;

 

 <>

 'KH정보교육원'  SUBSTRB('KH정보교육원',1,4)    SUBSTRB('KH정보교육원',2,4)

KH정보교육원                            KH

 

SUBSTRB('KH정보교육원',4)

    H정보교육원

 

 

 

  

   F. REVERSE 

-- 행당 문자열로 거꾸로 보여 주는 함수이다.

   

 SELECT 'ORACLE','KH정보교육원',

         REVERSE('ORACLE'),   -- 거꾸로 돌린다는

         REVERSE ('KH정보교육원')

 FROM DUAL;

 

 <>

 ORACLE              KH정보교육원   ELCARO               걋낢맏ㅑHK

 

 SELECT JUBUN, REVERSE(JUBUN)

 FROM TBL_NEWSAWON;

 

 <>

 7110031234567         7654321300117

7210031234567           7654321300127

7310031234567           7654321300137

 

    G. INSTR

-- 어떤 문자열에서 특정글자가 나오는 위치값을 알려주는 함수이다.

            

SELECT 'KH정부교육원 통신정보학',

       INSTR('KH정부교육원 통신정보학', '정보',1,1),

       INSTR('KH정부교육원 통신정보학', '정보',4,1),

       INSTR('KH정부교육원 통신정보학', '정보',1,2),

       INSTR('KH정부교육원 통신정보학', '정보',1,3),

       INSTR('KH정부교육원 통신정보학', '정보',2),  

       INSTR('KH정부교육원 통신정보학', '정보',4)

FROM DUAL;   

 

 

<>

KH정부교육원 통신정보학 11         11         0           0           11         11         

 

 

 CREATE TABLE TBL_FILEINFO 테이블 생성

 (FILENO    NUMBER

 ,FILENAME  VARCHAR2(500)

 );

 << 넣기>>

 INSERT INTO TBL_FILEINFO VALUES

 (1, 'C:\MYDOCUMENT\SALES\W01011월영업계획.DOC');

  INSERT INTO TBL_FILEINFO VALUES

 (2, 'D:\ORACLESTUDY.TXT');

  INSERT INTO TBL_FILEINFO VALUES

 (3, 'C:\MUSIC\MP3\KOREA\DONGYO\학교종이땡땡땡.MP3');

 

 COMMIT;

 

 SELECT *

 FROM TBL_FILEINFO;

 

 

<문제>

1           C:\MYDOCUMENT\SALES\W01011월영업계획.DOC

2           D:\ORACLESTUDY.TXT

3           C:\MUSIC\MP3\KOREA\DONGYO\학교종이땡땡땡.MP3

최종 파일 네임만 나타내 주세요.

              

<<>>

SELECT SUBSTR(FILENAME,1,1),

   REVERSE (SUBSTR  (REVERSE (FILENAME),1, INSTR (REVERSE (FILENAME),'\',1,1)-1))

FROM TBL_FILEINFO;

 

 

<>

C           W01011월영업계획.DOC

D           ORACLESTUDY.TXT

C           학교종이땡땡땡.MP3

 

 

H. LENGTH

 -- 문자열의 길이를 나타내는 함수

 

SELECT LENGTH('KH정보교육원'), LENGTH('KH 정보교육원')

FROM DUAL;

--> 7 (문자열의 길이를 나타남) , 8

 

SELECT LENGTHB('KH정보교육원'), LENGTHB('KH 정보교육원')

FROM DUAL;

--> 12  ,            13

 

   I. LPAD -- PAD 채운다는 의미(LEFT PAD 약자)

             --  왼쪽부터 채워라

   J. RPAD -- RIGHT PAD 약자

           -- 오른쪽부터 채워라     

          

SELECT LPAD('KH정보교육원', 20,'S')          

FROM DUAL;                          --

-- 1.  20Byte 확보해라(20글자가 아니다.)

-- 2. 확보한 20 byte 공간 안에 KH정보교육원(12BYTE)D 넣어라.

-- 3.  KH정보교육원(12BYTE) 넣고 남은 왼쪽 빈공간에

--    'S' 넣어 채워라.

 

--> SSSSSSSSKH정보교육원 

 

 

 

SELECT LPAD('KH정보교육원', 20,'한국')          

FROM DUAL;

--> 한국한국KH정보교육원

 

 

SELECT LPAD('*',6,'*')

FROM DUAL;

-- --> ******

 

K. TRIM

-- :TRIM 잘라내는

-- LTRIM / RTRIM

 

SELECT 'BDABBABCAAACCDAABBCC',

       LTRIM('BCABBABCAAACCDAABBCC','BAC')

-– 왼쪽부터 잘라나가다가 D 만나서 그만

FROM DUAL;

 

<< 결과 >>

--> BDABBABCAAACCDAABBCC DAABBCC

 

-- ==> LTRIM 출발점이 왼쪽

--     BAC 나오면 TRIM(삭제)

--     그러므로 ABC 포함되지 않은 D 나올 때까지

--     왼쪽부터 삭제한 결과 값을 보여준다.

 

--> BDABBABCAAACCDAABBCC BCABBABCAAACCD (RTRIM 결과 )

 

 

SELECT '            김성훈 멋지다.              ',

       'KH정보교육원' || '          김성훈 멋지다. '

FROM DUAL;

<<결과 >>

-- >             김성훈 멋지다.     KH정보교육원          김성훈 멋지다.

 

 

 

SELECT LTRIM('                    김성훈 멋지다.              '),

       'KH정보교육원' ||

       LTRIM('                  김성훈 멋지다. ')

FROM DUAL;

 

<<결과 >>

 -- > 김성훈 멋지다.              KH정보교육원김성훈 멋지다.

 

 

 

SELECT ''||'            한민국        '||'짝짝짝짝짝~!',

       ''||LTRIM('            한민국        ')||'짝짝짝짝짝~!',

       ''||RTRIM('            한민국        ')||'짝짝짝짝짝~!'

FROM DUAL;

 

<<결과 >>         

-->             한민국        짝짝짝짝짝~!

--> 대한민국        짝짝짝짝짝~!            한민국짝짝짝짝짝~!

-->             한민국짝짝짝짝짝~!

 


close