ORACLE/SQL

1 SQL 시작(기본 + 단일행 함수)

히드라야 2015. 3. 9. 12:10

출처: 서진수 강사님 오라클 취업반 강의 

환경 설정 하기


설치환경 : OEL5 + Oracle 11g(11.2.0.1) 


설치 완료 후 할일 

1. test_data_eng.sql 파일을 /home/oracle 로 옮겨 주기 

      - 만일 다른 리눅스에서 옮기는 경우 

[oracle@localhost ~]$ scp /home/oracle/test_data_eng.sql 192.168.15.112:/home/oracle/

2. 아래의 명령어 실행하기 

$sqlplus /as sysdba                    관리자 계정으로 로그인

startup                                (만일 꺼져 있는 경우)

SQL> alter user scott                    연습용 계정의 권한을 풀어주기

2    identified by tiger account unlock ;

SQL> conn scott/tiger                    연습용 계정으로 접속하기 

SQL> @test_data_eng.sql                sql 불러오기 

SQL> select * from professor            테스트


wget http://utopia.knoware.nl/~hlub/uck/rlwrap/rlwrap-0.42.tar.gz

http://oracle-base.com/articles/linux/rlwrap.php


오라클 연습용 계정으로 로그인하기 

[oracle@MINSUNG ~]$ sqlplus scott/tiger

오라클 서버가 꺼져있을때 켠 후 로그인 하기 

Enter user-name: sys / oracle as sysdba     시스템 계정인 oracle로 로그인 하기 

  SQL>startup                                    db를 실행 시키고 

  SQL>conn scott/tiger                              연습용 계정으로 접속한다 

사용자 계정으로 프롬프트 바꾸기

  SQL> set sqlprompt "_USER>"



SQL 이란

사람  ↔  DBMS  DATABASE 

(SQL


SELECT 명령어 활용

문법 : SELECT [ 칼럼명 OR 표현식 ]  FROM  [ 테이블 명, 뷰 명 ] 


□ 모든 칼럼 조회

SQL> SELECT *             모두 선택 한다 

  2  FROM EMP ;            EMP 테이블의 모든 값을


 세미클론은 종료의 의미 

 대문자 = 키워드 소문자(칼럼이름 조건)를 구분해서 연습하도록 

 공백에 주의 할것 

※ 여러개 컬럼은 , 로 구분 


 테이블 이름을 조회 

SQL> SELECT * FROM tab ;

※ 쿼리를 작성하기 전에 실행하고 생각할것  

□ 테이블에 있는 칼럼을 조회 
  SQL>  DESC [테이블 명 ] ;

□ 출력하는 칼럼의 길이를 조절하기 

  COL empno FOR 9999         칼럼의 길이를 4자리로 설정

  COL ENAME FOR a8           칼럼의 길이를 8바이트로
  
  COL LINE 200                  화면의 가로를 200 바이트
  
  SET PAGES 50                 1페이지에 50줄 출력 

□ 표현식 사용 하기 

사용자가 입력하는 값을 리터럴 상수 
즉 조회시에 내가 원하는 값을 수정 해서 출력하기 위해 사용

SQL> SELECT name || '''s ID : ' || id || ', WEIGHT is ' || weight || 'Kg'
2  "ID AND WEIGHT "            칼럼 별칭 사용한 예제 
3  FROM student ;



□ 칼럼 별칭 사용

SQL> SELECT name "이름1" , name AS "이름2"

        2  FROM student ; 

이름1                         이름2
----------------------------- ---------------------------
James Seo                      James Seo
Rene Russo                     Rene Russo
Sandra Bullock                 Sandra Bullock

 □ 중복 제거 

      칼럼의 중복을 제거 하는 것

※  10g R2 부터는 정열을 사용하지 않아서 성능이 향상됨 

※  현재는 HASH 알고리즘 기법을 사용함

- 기억할 것은 10g R2 부터 DISTINCT 명령이 정렬을 지원해주지 않음 

※  반드시 SELECT 키워드 다음에 와야함 

    SCOTT>SELECT DISTINCT deptno

            2  FROM emp ;

                DEPTNO

----------

        30

        20

        10

  □     

   SCOTT>SELECT ename , job

  2  FROM emp

  3  WHERE job = 'CLERK' ;




□ NULL

의미는 값을 모른다는 의미 

NULL = NULL 

값을 모름 = 값을 모름  -> 값은 값을 모름

NULL 은 = 연산이 안됨 

 WHERE comm = NULL ;            안됨



SCOTT>SELECT empno , ename , comm

  2  FROM emp

  3  WHERE comm IS NULL ;


     EMPNO ENAME            COMM
---------- ---------- ----------
      7369 SMITH
      7566 JONES
      7698 BLAKE
      7782 CLARK
      7839 KING
      7876 ADAMS
      7900 JAMES
      7902 FORD
      7934 MILLER



SCOTT>SELECT empno ,ename , comm
  2  FROM emp
  3  WHERE comm IS NOT NULL ;

     EMPNO ENAME            COMM
---------- ---------- ----------
      7499 ALLEN             300
      7521 WARD              500
      7654 MARTIN           1400
      7844 TURNER              0


   
※ NULL 에 숫자 연산을 하면 NULL 이 되니 조심해서 사용할 것 


□ order by 대신 

SCOTT>create index idx_emp_ename

  2  on emp(ename);


Index created.


SCOTT>select ename

  2  from emp

  3  where ename > '0' ;






문자열 함수

□ 첫글자 대문자 로 바꾸어 주기 

SQL> SELECT ename , INITCAP(ename) "INITCAP"

  2  FROM emp

  3  WHERE deptno = 10 ;

※ 공백을 기준으로 작성됨


ENAME      INITCAP

---------- ----------

CLARK      Clark

KING       King

MILLER     Miller 


□ 대문자 소문자로 변환 하기 

SQL> SELECT ename , LOWER(ename) "LOWER" , UPPER(ename) "UPPER"

  2  FROM emp

  3  WHERE deptno = 10 ;


ENAME      LOWER      UPPER

---------- ---------- ----------

CLARK      clark      CLARK

KING       king       KING

MILLER     miller     MILLER



□ 바이트 갯수, 칼럼 갯수 조 회 

SQL> SELECT ename , LENGTH(ename) "컬럼의 갯수" , LENGTHB(ename) "컬럼의 바이트수"

  2  FROM emp ;



ENAME      컬럼의 갯수 컬럼의 바이트수
---------- ----------- ---------------
SMITH                5               5
ALLEN                5               5
WARD                 4               4
JONES                5               5
MARTIN               6               6
- 중 략 -


SQL> SELECT '하하하 하' "문장" , LENGTH('하하하 하') "칼럼의 갯수"

  2                           , LENGTHB('하하하 하') "바이트의 수"

 3  FROM dual ;


문장      칼럼의 갯수 바이트의 수

--------- ----------- -----------

하하하 하           5           9



※ 공백은 1바이트 인듯 함 


□ 사용자로 입력 받기 

SQL> SELECT ename , LENGTH(ename) "칼럼의 갯수"

  2  FROM emp

  3  WHERE LENGTH(ename) = LENGTH('&input') ;

Enter value for input: kfkfds


ENAME      칼럼의 갯수

---------- -----------

MARTIN               6

TURNER               6

MILLER               6



□ CONCAT()


SQL> SELECT CONCAT(ename , job) "합치기 함수"

  2  FROM emp

  3  WHERE deptno = 10 ;


합치기 함수
-------------------
CLARKMANAGER
KINGPRESIDENT
MILLERCLERK

□SUBSTR()

칼럼 길이 늘려 놓기 

SQL> COL "1번" FOR a10

SQL> COL "2번" FOR a10

SQL> COL "3번" FOR a10


SQL> SELECT SUBSTR('1234567890' , 5,3) "1번"
  2  FROM dual ;

1번
----------
567

※ 오른쪽(1번)에서 5칸을 간다음 오른쪽으로 3만큼 출력 


SQL> SELECT SUBSTR('1234567890' , -7,2) "2번"
  2  FROM dual ;
2번
----------
45

 ※ 왼쪽(0번)에서 7 칸만큼 샘을 한다음 오른쪽으로 2만큼 출력


SQL> SELECT ename ,sal

  2  FROM emp

  3  WHERE '00' = SUBSTR(sal , 3,2) ;

ENAME             SAL
---------- ----------
ALLEN            1600
KING             5000
TURNER           1500
ADAMS            1100
FORD             3000
MILLER           1300


□ SUBSTRB()

  해당 바이트 만큼 출력 

SQL> SELECT '맛있는라면' "라면" , SUBSTR('맛있는라면' , 1,2) "SUBSTR"

  2                             , SUBSTRB('맛있는라면' ,1,2) "SUBSTRB"

  3  FROM dual ;


라면       SUBS SU

---------- ---- --

맛있는라면 맛있 맛




□ INSTR()
1글자만 찾아서 그것의 위치를 출력하는것 

문 법: INSTR(‘문자열’ 또는 컬럼 , 찾는 글자 , 시작위치 , 몇 번째인지(기본값은 1))

※ INSTR(tel, ')') 첫번째로 나오는 ) 문자의 열을 출력하기 

SQL> SELECT 'a-b-c-d-e-f-g' , INSTR('a-b-c-d-e-f-g' , '-' , 3,2)
  2  FROM dual ;
'A-B-C-D-E-F- INSTR('A-B-C-D-E-F-G','-',3,2)
------------- ------------------------------
a-b-c-d-e-f-g                              6


※ 3번째(B) 시작해서 2번 - 가 나오면 그자리의 숫자를 출력 

SQL> SELECT '1-2-3-4-5-6-7-8-9' "test1" ,
  2  INSTR('1-2-3-4-5-6-7-8-9', '-' , 2,3)
  3  FROM dual ;
test1             INSTR('1-2-3-4-5-6-7-8-9','-',2,3)
----------------- ----------------------------------
1-2-3-4-5-6-7-8-9                                  6

※ 2번째에서 시작해서 3번 - 나오면 그자리 숫자를 출력 이때 시작위치가 - 면 포함됨


SQL> SELECT 'a-b-c-d' , INSTR('a-b-c-d' , '-' , -1,3) "INSTR"

  2  FROM dual ;

'A-B-C-      INSTR

------- ----------

a-b-c-d          2


※ -1 번째 (d)에서 시작해서 왼쪽으로 - 가 3개 까지 검색 후 오른쪽부터샘한 위치

SQL> SELECT 'a-b-c-d' "test1" , INSTR('a-b-c-d' , '-' , -6,2) "INSTR"

  2  FROM dual ;


test1        INSTR

------- ----------

a-b-c-d          0

※ -6 번째 (-)에서 시작해서 왼쪽으로 - 가 2개 까지 검색 후 오른쪽부터샘한 위치

   여기서는 넘어가서 0으로 체크됨 



□ 종합 문제 

SQL> SELECT name , tel , SUBSTR(tel, 1, INSTR(tel, ')') -1 )

  2  FROM student

  3  WHERE deptno1 = 201 ;


※ name 칼럼, tel 칼럼을 출력 후에 SUBSTR 함수를 사용 하여 tel에 1번째 자리부터 tel 칼럼에서 ) 첫번 째로 찾은 번호의 -1 만큼 출력한다 

NAME                           TEL             SUBSTR(TEL,1,INSTR(TEL,')')-1)

------------------------------ --------------- ------------------------------

Demi Moore                     02)6255-9875    02

Macaulay Culkin                02)312-9838     02

Wesley Snipes                  053)736-4981    053

Steve Martin                   02)6175-3945    02

Sean Connery                   02)381-5440     02

Christian Slater               031)345-5677    031



 LPAD( ) 함수

- 문 법: LPAD(‘문자열’ 또는 컬럼명, 자리수 , ’채울문자’ )


SQL> SELECT LPAD(ename , 9 , '12345') "LPAD"

  2  FROM emp

  3  WHERE deptno = 10 ;

LPAD
------------------
1234CLARK
12345KING
123MILLER


 RPAD( ) 함수

SQL> SELECT RPAD(ename , 9 , SUBSTR('123456789' , LENGTHB(ename) , 9 - LENGTHB(ename)))
  2  FROM emp
  3  WHERE deptno = 10 ;

RPAD(ENAME,9,SUBST
------------------
CLARK5678
KING45678
MILLER678



□ 첫째 특정 문자를 삭제 후 출력하기 

SQL>
SQL> SELECT LTRIM(ename, 'C')
  2  FROM emp
  3  WHERE deptno = 10 ;


LTRIM(ENAM
----------
(C)LARK
KING
MILLER


※ 첫글자에만 해당됨 중간에 들어가는것은 제외됨 

□ 마지막 특정 문자를 삭제 후 출력하기

SQL> SELECT RTRIM('abcdcefg' , 'g')
  2  FROM dual ;

RTRIM('
-------
abcdcef



□ 13) REPLACE( ) 함수
- 문 법: REPLACE(‘문자열’ 또는 컬럼명 , ‘이전문자’ , ’이후문자’)

SQL> SELECT ename , REPLACE(ename , SUBSTR(ename , 1,2) , '***') "REPLACE"
  2  FROM emp
  3  WHERE deptno = 10 ;

ENAME      REPLACE
---------- ------------------------------
CLARK      ***ARK
KING       ***NG
MILLER     ***LLER
※ 앞에서 바꾸는 글자가 2개 여도 3개랑 문자 변환이 가능함 


SQL> SELECT ename ,
  2  REPLACE(ename , SUBSTR(ename , 2,2), '--') "REPLACE"
  3  FROM emp
  4  WHERE deptno = 20 ;

ENAME      REPLACE
---------- --------------------
SMITH      S--TH
JONES      J--ES
ADAMS      A--MS
FORD       F--D


SQL> SELECT name ,jumin ,

  2  REPLACE(jumin , SUBSTR(jumin , 7,7) , '-/-/-/-' ) "REPLACE"

  3  FROM student

  4  WHERE deptno1 = 101 ;

NAME                           JUMIN         REPLACE
------------------------------ ------------- -------------------------------------------------------------------------------------------
James Seo                      7510231901813 751023-/-/-/-
Billy Crystal                  7601232186327 760123-/-/-/-
Richard Dreyfus                7711291186223 771129-/-/-/-
Danny Devito                   7808192157498 780819-/-/-/-


SQL> SELECT name , tel ,

  2  REPLACE(tel, SUBSTR(tel, 5,3) , '***') "REPLACE"

  3  FROM student

  4  WHERE deptno1 = 102 ;



NAME                           TEL             REPLACE
------------------------------ --------------- ---------------------------------------------
Rene Russo                     051)426-1700    051)***-1700
Nicholas Cage                  051)418-9627    051)***-9627
Tim Robbins                    055)488-2998    055)***-2998
Charlie Sheen                  055)423-9870    055)***-9870



SQL> SELECT name , tel ,
  2  REPLACE(tel , SUBSTR(tel, 9,4), '****') "REPLACE"
  3  FROM student
  4  WHERE deptno1 = 101 ;

NAME                           TEL             REPLACE
------------------------------ --------------- ------------------------------------------------------------
James Seo                      055)381-2158    055)381-****
Billy Crystal                  055)333-6328    055)333-****
Richard Dreyfus                02)6788-4861    02)6788-****
Danny Devito                   055)278-3649    055)278-****





숫자 관련 함수


□ 1) ROUND( ) 함수

- 문 법: ROUND(숫자 , 출력을 원하는 자리수)


SCOTT>SELECT ROUND(987.123 , 0) "ROUND1" ,

  2         ROUND(987.123 , 2) "ROUND2" ,

  3          ROUND(987.123 , -1) "ROUND3"

  4  FROM dual ;

 ROUND1     ROUND2     ROUND3

---------- ---------- ----------

       987     987.12        990


 2) TRUNC( ) 함수

이 함수는 ROUND 와 사용법은 동일하며 차이점은 무조건 버림을 한다는 것입니다.

- 문 법: TRUNC(숫자 , 원하는 자리수)


SCOTT>SELECT TRUNC(12345.9999,2) "TRINC1" ,

  2          TRUNC(12345.9999,0) "TRUNC2" ,

  3         TRUNC(12345.9999,-2) "TRUNC3"

  4  FROM dual;


    TRINC1     TRUNC2     TRUNC3

---------- ---------- ----------

  12345.99      12345      12300



□ 3) MOD( ) , CEIL( ) , FLOOR( ) 함수


SCOTT>SELECT MOD(101,10) "101/10" ,

  2          CEIL(123.10) "CEIL" ,

  3          FLOOR(123.10) "FLOOR"

  4  FROM dual ;


    101/10       CEIL      FLOOR
---------- ---------- ----------
         1        124        123



SCOTT>SELECT ROWNUM "ROWNO" , CEIL(rownum/3) "TEAMNO" , ename

  2  FROM emp ;


 ROWNO     TEAMNO ENAME

---------- ---------- ----------

         1          1 SMITH

         2          1 ALLEN

         3          1 WARD

         4          2 JONES

         5          2 MARTIN

         6          2 BLAKE

         7          3 CLARK

         8          3 KING

         9          3 TURNER

        10          4 ADAMS

        11          4 JAMES

        12          4 FORD

        13          5 MILLER


※ 3명씩 조를 나누는 상황에서 CEIL 함수를 많이 사용 


□ 4) POWER( ) 함수

이 함수는 숫자 1의 숫자 2의 승수를 구해주는 함수입니다.

- 문 법: POWER( 숫자1 , 숫자2)

SCOTT>SELECT POWER(3,3) "3^3"

  2  FROM dual ;


   3^3
----------
        27



날자 관련 함수


□ 1) SYSDATE 함수

-오라클이 설치된 곳에 OS 시간은 절대로 바꾸지 말것 


SCOTT>SELECT SYSDATE

  2  FROM dual ;

SYSDATE
------------
10-MAR-15


SCOTT>ALTER SESSION SET NLS_DATE_FORMAT='RRRR-MM-DD:HH24:MI:SS' ;

Session altered.

SCOTT>SELECT SYSDATE FROM dual ;

SYSDATE

-------------------

2015-03-10:23:56:15


□ MONTHS_BETWEEN 함수

이 함수는 두 날짜를 입력 받아서 두 날짜 사이의 개월 수를 출력하는 함수입니다


입력전에 먼저 작업하기(14/09/11 방식으로 입력 하도록 )

SCOTT>ALTER SESSION SET NLS_DATE_FORMAT = 'YY/MM/DD' ;

Session altered.


SCOTT>SELECT MONTHS_BETWEEN( '14/09/30' , '14/08/30')

  2  FROM dual ;

MONTHS_BETWEEN('14/09/30','14/08/30')
-------------------------------------
                                    1


SCOTT>SELECT MONTHS_BETWEEN( '14/09/15' , '14/08/30')

  2  FROM dual ;

MONTHS_BETWEEN('14/09/15','14/08/30')
-------------------------------------
                           .516129032






SCOTT>SELECT ename , hiredate ,
  2             ROUND(MONTHS_BETWEEN(TO_DATE('04/05/31') , hiredate) ,1) "date1",
  3             ROUND(((TO_DATE('04/05/31') - hiredate)/31),1) "date2"
  4  FROM emp
  5  WHERE DEPTNO = 10 ;


ENAME      HIREDATE      date1      date2
---------- -------- ---------- ----------
CLARK      81/06/09      275.7      270.7
KING       81/11/17      270.5      265.5
MILLER     82/01/23      268.3      263.4


□ ADD_MONTHS( ) 함수

ADD_MONTHS 함수는 주어진 날짜에 숫자만큼의 달을 추가 하는 함수

SCOTT>SELECT SYSDATE , ADD_MONTHS(SYSDATE ,1 )

  2  FROM dual ;


SYSDATE  ADD_MONT
-------- --------
15/03/11 15/04/11


□ NEXT_DAY( ) 함수

주어진 날짜를 기준으로 돌아오는 가장 최근 요일의 날짜를 반환해주는

SCOTT>SELECT SYSDATE , NEXT_DAY(SYSDATE , 'MON')

  2  FROM dual ;

SYSDATE  NEXT_DAY

-------- --------

15/03/11 15/03/16




5) LAST_DAY( ) 함수

LAST_DAY 함수는 주어진 날짜가 속한 달의 가장 마지막 날을 출력해주는 함수입니다

SCOTT>SELECT SYSDATE , LAST_DAY(SYSDATE) , LAST_DAY('14/05/01')

  2  FROM dual ;


SYSDATE  LAST_DAY LAST_DAY

-------- -------- --------

15/03/11 15/03/31 14/05/31


□ 날자에서    ROUDNE() , TRUNC() 


SCOTT>ALTER SESSION SET NLS_DATE_FORMAT= 'YYYY-MM-DD-HH24:MI:SS' ;

Session altered.


SCOTT>SELECT SYSDATE , ROUND(SYSDATE), TRUNC(SYSDATE)

  2  FROM dual ;

SYSDATE             ROUND(SYSDATE)      TRUNC(SYSDATE)
------------------- ------------------- -------------------
2015-03-11-09:34:42 2015-03-11-00:00:00 2015-03-11-00:00:00







형 변환 함수 


1) 묵시적(자동) 형 변환과 명시적(수동) 형 변환

묵시적 


SCOTT>SELECT 2+ '2'

  2  FROM dual ;

     2+'2'
----------
         4


※ 묵시적 형변환은 성능을 느리게 함 


□ TO_CHAR 함수 (날짜 -> 문자로 형 변환하기) - 날자에서 활용할때-

- 문 법: TO_CHAR(원래 날짜 , ‘원하는 모양’)

SCOTT>SELECT SYSDATE , TO_CHAR(SYSDATE, 'YYYY') "YYYY" ,

  2                    TO_CHAR(SYSDATE, 'RRRR') "RRRR" ,

  3                    TO_CHAR(SYSDATE, 'YY')   "YY" ,

  4                    TO_CHAR(SYSDATE,  'RR')  "RR" ,

  5                    TO_CHAR(SYSDATE,  'YEAR') "YEAR"

  6  FROM dual ;

SYSDATE             YYYY RRRR YY RR YEAR
------------------- ---- ---- -- -- ------------------------------------------
2015-03-11-09:45:50 2015 2015 15 15 TWENTY FIFTEEN



SCOTT>SELECT SYSDATE , TO_CHAR(SYSDATE, 'MM') "MM" ,

  2                    TO_CHAR(SYSDATE, 'MON') "MON" ,

  3                    TO_CHAR(SYSDATE, 'MONTH') "MONTH"

  4  FROM dual ;



SYSDATE             MM MON    MONTH
------------------- -- ------ -------------
2015-03-11-09:51:02 03 MAR    MARCH


SCOTT>SELECT SYSDATE , TO_CHAR(SYSDATE, 'DD')   "DD" ,

  2                    TO_CHAR(SYSDATE, 'DAY')  "DAY" ,

  3                    TO_CHAR(SYSDATE, 'DDTH') "DDTH"

  4  FROM dual ;

YSDATE             DD DAY           DDTH
------------------- -- ------------- ----
2015-03-11-09:54:59 11 WEDNESDAY     11TH



[ 년도 ]

‘YYYY’ – 연도를 4자리로 표현합니다. 예: 2014

‘RRRR’ – 2000년 이후에 Y2K 버그로 인해 등장한 날짜 표기법으로 연도 4자리 표기법입니다.

‘YY’ – 연도를 끝의 2 자리만 표시합니다. 예 : 14

'RR' - 연도를 마지막 2 자리만 표시합니다. 예: 14

‘YEAR’ – 연도의 영문 이름 전체를 표시합니다.

[ 월 ]

MM – 월을 숫자 2자리로 표현합니다. 예: 10

MON – 유닉스용 오라클에서 월을 뜻하는 영어 3글자로 표시합니다. 예: OCT

윈도용 오라클일 경우는 MONTH 와 동일합니다.

MONTH – 월을 뜻하는 이름 전체를 표시합니다

[ 일 ]

DD – 일을 숫자 2자리로 표시합니다. 예: 26

DAY – 요일에 해당하는 명칭을 표시하는데 유닉스용 오라클에서는 영문으로 나오고

윈도용 오라클에서는 한글로 나옵니다.

DDTH – 몇 번째 날인지를 표시합니다.

[ 시간 ]

HH24 – 하루를 24시간으로 표시합니다

HH – 하루를 12 시간으로 표시합니다.

분 : MI 로 표시합니다.

초 : SS 로 표시합니다.


문제1

select studno , name , birthday                

 from student 

where to_char(birthday,'MM') <02 ;

    STUDNO NAME                           BIRTHDAY

---------- ------------------------------ ------------

      9511 Billy Crystal                  23-JAN-76

      9514 Bill Murray                    20-JAN-76

      9712 Sean Connery                   05-JAN-78

문제2

select empno, ename , hiredate                  

 from emp 

  where to_char(hiredate,'MM') <=03 ;

     EMPNO ENAME      HIREDATE

---------- ---------- ------------

      7499 ALLEN      20-FEB-81

      7521 WARD       22-FEB-81

      7934 MILLER     23-JAN-82


□ case

select name , SUBSTR(jumin,3,2) "month" , CASE WHEN SUBSTR(jumin,3,2) BETWEEN '01' AND '03' THEN '1/4' WHEN SUBSTR(jumin,3,2) BETWEEN '04' AND '06' THEN '2/4' WHEN SUBSTR(jumin,3,2) BETWEEN '07' AND '09' THEN '3/4'  WHEN SUBSTR(jumin,3,2) BETWEEN '10' AND '12' THEN '4/4' END "QUARTER"from student ;

NAME                           mont QUA

------------------------------ ---- ---

James Seo                      10   4/4

Rene Russo                     02   1/4

Sandra Bullock                 06   2/4

Demi Moore                     12   4/4

Danny Glover                   03   1/4

Billy Crystal                  01   1/4

Nicholas Cage                  04   2/4

Micheal Keaton                 09   3/4

Bill Murray                    01   1/4

Macaulay Culkin                10   4/4

Richard Dreyfus                11   4/4

Tim Robbins                    04   2/4

Wesley Snipes                  09   3/4

Steve Martin                   02   1/4

Daniel Day-Lewis               12   4/4

Danny Devito                   08   3/4

Sean Connery                   01   1/4

Christian Slater               08   3/4

Charlie Sheen                  03   1/4

Anthony Hopkins                02   1/4








03.11

정규식 함수 



□ REGEXP_LIKE(칼럼 , ' 정규식' ) ;

※ 작은 따옴표안에 공백도 인식하니 조심할것 

SCOTT>SELECT *

  2  FROM t_reg

  3  WHERE REGEXP_LIKE(text, '[a-z]') ;

TEXT
----------
abc 123
abc  123
a1b2c3
aabbcc123
123abc
abc



공백 문자 출력 

SCOTT>SELECT *
  2  FROM t_reg
  3  WHERE REGEXP_LIKE(text, '[[:space:]]') ;

TEXT
----------
ABC 123
ABC  123
abc 123
abc  123



SCOTT>SELECT text
  2  FROM t_reg
  3  WHERE REGEXP_LIKE(text, '[a-z]{3}') ;
TEXT
----------
abc 123
abc  123
aabbcc123
123abc
abc


※ 연속으로 나오는것을 출력 만일 a1b2c3 은 출력 안함 

() 괄호 안의 문자를 참조로 지정합니다. 그런 다음 "\1"을사용하여 현재 식의 첫 번째 참조를 참조하고 "\2"를 사용하여 현재 식의 두 번째 참조를 참조할 수 있습니다.




SCOTT>select name ,
  2     regexp_replace(name , '[A-Z]' , '뿅' ) "test"
  3  from student ;

NAME                           test
------------------------------ ------------------------------
James Seo                      뿅ames 뿅eo
Rene Russo                     뿅ene 뿅usso
Sandra Bullock                 뿅andra 뿅ullock
Demi Moore                     뿅emi 뿅oore
Danny Glover                   뿅anny 뿅lover




SCOTT>select name ,
  2             regexp_replace(name , '([A-Z])' ,'\1뿅') "test"
  3  from student ;

NAME                           test
------------------------------ ------------------------------
James Seo                      J뿅ames S뿅eo
Rene Russo                     R뿅ene R뿅usso
Sandra Bullock                 S뿅andra B뿅ullock
Demi Moore                     D뿅emi M뿅oore
Danny Glover                   D뿅anny G뿅lover





SCOTT>select no , ip ,
  2             regexp_replace(ip , '\.' , '/' , 1,2) "지우지마"
  3  from t_reg2 ;


 NO IP                   지우지마
---- -------------------- --------------------
   1 10.10.0.1            10.10/0.1
   2 10.10.10.1           10.10/10.1
   3 172.16.5.100         172.16/5.100
   4 172.61.186.2         172.61/186.2
   5 172.61.168.2         172.61/168.2
   6 255.255.255.0        255.255/255.0

※ 1,2 번째로 가서 바꾸어주기 


SCOTT>select regexp_replace('aaa  bbb' , '( ){1,}' , '')
  2  from dual ;


REGEXP
------
aaabbb