ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 003. 문자열 데이터 조회(와일드카드, ESCAPE), 커밋/롤백, 데이터 업데이트, 정렬, 문자열 관련 함수
    SsY/Class 2023. 3. 28. 10:42
    728x90

    2023.03.24(금)

    SCOTT 계정 실습
    • 어제 이어서...
      - 새파일 유저 확인 + 추가실습 테이블에 데이터 입력 + 커밋
    더보기
    SELECT USER
    FROM DUAL;
    --==>> SCOTT
    
    --○ 추가 실습 테이블 구성(TBL_SAWON) --// 어제 구성 함
    CREATE TABLE TBL_SAWON
    ( SANO      NUMBER(4)
    , SANAME    VARCHAR2(30)
    , JUBUN     CHAR(13)
    , HIREDATE  DATE        DEFAULT SYSDATE     --// 추가적인 기능 부여
    , SAL       NUMBER(10)
    );
    --==>> Table TBL_SAWON이(가) 생성되었습니다.
    
    SELECT *
    FROM TBL_SAWON;
    --==> 조회 결과 없음
    
    DESC TBL_SAWON;
    --==>>
    /*
    이름       널? 유형           
    -------- -- ------------ 
    SANO        NUMBER(4)    
    SANAME      VARCHAR2(30) 
    JUBUN       CHAR(13)     
    HIREDATE    DATE         
    SAL         NUMBER(10)
    */
    
    --○ 데이터 입력
    INSERT INTO TBL_SAWON(SANO,SANAME,JUBUN,HIREDATE,SAL)
    VALUES(1001,'박혜서','9910102234567',TO_DATE('2001-01-03','YYYY-MM-DD'), 3000);
    
    INSERT INTO TBL_SAWON(SANO,SANAME,JUBUN,HIREDATE,SAL)
    VALUES(1002,'유서영','9902242234567',TO_DATE('2010-11-05','YYYY-MM-DD'), 2000);
    
    INSERT INTO TBL_SAWON(SANO,SANAME,JUBUN,HIREDATE,SAL)
    VALUES(1003,'최이서','9403302234567',TO_DATE('1999-08-16','YYYY-MM-DD'), 5000);
    
    INSERT INTO TBL_SAWON(SANO,SANAME,JUBUN,HIREDATE,SAL)
    VALUES(1004,'양연수','9910132234567',TO_DATE('2008-02-02','YYYY-MM-DD'), 4000);
    
    INSERT INTO TBL_SAWON(SANO,SANAME,JUBUN,HIREDATE,SAL)
    VALUES(1005,'양수현','9907092234567',TO_DATE('2009-07-15','YYYY-MM-DD'), 2000);
    
    INSERT INTO TBL_SAWON(SANO,SANAME,JUBUN,HIREDATE,SAL)
    VALUES(1006,'주수인','9604052234567',TO_DATE('2009-07-15','YYYY-MM-DD'), 2000);
    
    INSERT INTO TBL_SAWON(SANO,SANAME,JUBUN,HIREDATE,SAL)
    VALUES(1007,'이기배','9806261234567',TO_DATE('2009-07-15','YYYY-MM-DD'), 2000);
    
    INSERT INTO TBL_SAWON(SANO,SANAME,JUBUN,HIREDATE,SAL)
    VALUES(1008,'이준복','9607161234567',TO_DATE('2010-06-05','YYYY-MM-DD'), 1000);
    
    INSERT INTO TBL_SAWON(SANO,SANAME,JUBUN,HIREDATE,SAL)
    VALUES(1009,'이하이','0204054234567',TO_DATE('2012-12-10','YYYY-MM-DD'), 1000);
    
    INSERT INTO TBL_SAWON(SANO,SANAME,JUBUN,HIREDATE,SAL)
    VALUES(1010,'이이제','0503243234567',TO_DATE('2015-03-01','YYYY-MM-DD'), 1500);
    
    INSERT INTO TBL_SAWON(SANO,SANAME,JUBUN,HIREDATE,SAL)
    VALUES(1011,'선동열','7505071234567',TO_DATE('1998-03-01','YYYY-MM-DD'), 3000);
    
    INSERT INTO TBL_SAWON(SANO,SANAME,JUBUN,HIREDATE,SAL)
    VALUES(1012,'선우용녀','7102032234567',TO_DATE('1995-03-01','YYYY-MM-DD'), 2000);
    
    INSERT INTO TBL_SAWON(SANO,SANAME,JUBUN,HIREDATE,SAL)
    VALUES(1013,'남주혁','0607083234567',TO_DATE('2015-03-01','YYYY-MM-DD'), 4000);
    
    INSERT INTO TBL_SAWON(SANO,SANAME,JUBUN,HIREDATE,SAL)
    VALUES(1014,'남궁이','0512153234567',TO_DATE('2020-05-06','YYYY-MM-DD'), 3000);
    
    INSERT INTO TBL_SAWON(SANO,SANAME,JUBUN,HIREDATE,SAL)
    VALUES(1015,'선우선','0102094234567',TO_DATE('2010-03-01','YYYY-MM-DD'), 2000);
    
    INSERT INTO TBL_SAWON(SANO,SANAME,JUBUN,HIREDATE,SAL)
    VALUES(1016,'남진','7309231234567',TO_DATE('1996-03-01','YYYY-MM-DD'), 4000);
    
    --==>> 1 행 이(가) 삽입되었습니다. * 16
    
    ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
    --==>> Session이(가) 변경되었습니다.
    
    --○ 확인
    SELECT *
    FROM TBL_SAWON;
    --==>>
    /*
          SANO SANAME                         JUBUN         HIREDATE          SAL
    ---------- ------------------------------ ------------- ---------- ----------
          1001 박혜서                         9910102234567 2001-01-03       3000
          1002 유서영                         9902242234567 2010-11-05       2000
          1003 최이서                         9403302234567 1999-08-16       5000
          1004 양연수                         9910132234567 2008-02-02       4000
          1005 양수현                         9907092234567 2009-07-15       2000
          1006 주수인                         9604052234567 2009-07-15       2000
          1007 이기배                         9806261234567 2009-07-15       2000
          1008 이준복                         9607161234567 2010-06-05       1000
          1009 이하이                         0204054234567 2012-12-10       1000
          1010 이이제                         0503243234567 2015-03-01       1500
          1011 선동열                         7505071234567 1998-03-01       3000
          1012 선우용녀                       7102032234567 1995-03-01       2000
          1013 남주혁                         0607083234567 2015-03-01       4000
          1014 남궁이                         0512153234567 2020-05-06       3000
          1015 선우선                         0102094234567 2010-03-01       2000
          1016 남진                           7309231234567 1996-03-01       4000
    */
    
    --○ 커밋
    COMMIT;
    --==>> 커밋 완료.

    • 문자열 데이터 조회
    • LIKE 와 WILD CARD(CHARACTER) 『 % 』『 _ 』
    --○ TBL_SAWON 테이블에서 양연수 사원의 정보를 모두 조회한다.
    SELECT *
    FROM TBL_SAWON
    WHERE SANAME = '양연수';
    --==>> 1004	양연수	9910132234567	2008-02-02	4000
    
    SELECT *
    FROM TBL_SAWON
    WHERE SANAME LIKE '양연수';
    --==>> 1004	양연수	9910132234567	2008-02-02	4000
    
    --※ LIKE :  동사 → 좋아하다.
    --           부사 → ~와 같이, ~처럼       // CHECK!
    
    --※ WILD CARD(CHARACTER) → 『%』
    --   『LIKE』와 함께 사용되는 『%』는 모든 글자를 의미하도록 사용할 수 있다.
    --   『LIKE』와 함께 사용되는 『_』는 아무 글자 한 개를 의미하도록 사용할 수 있다.

    더보기
    --○ TBL_SAWON 테이블에서 성이 『이』씨인 사원의
    --   사원명, 주민번호, 급여 항목을 조회한다.
    SELECT 사원명, 주민번호, 급여
    FROM TBL_SAWON
    WHERE SANAME = '이';
    
    SELECT SANAME, JUBUN, SAL
    FROM TBL_SAWON
    WHERE SANAME = '이';
    --==>> 조회 결과 없음
    --> SANAME 컬럼에 『'이'』 한 글자만 들어있는 데이터 조회해라
    
    SELECT SANAME, JUBUN, SAL
    FROM TBL_SAWON
    WHERE SANAME = '이__';
    --==>> 조회 결과 없음
    --> SANAME 컬럼에 『'이__'』 세 글자가 들어있는 데이터 조회해라
    
    SELECT SANAME, JUBUN, SAL
    FROM TBL_SAWON
    WHERE SANAME LIKE '이__';
    --==>> // 이 경우에는, 외자 이름을 가진 경우는 나오지 않는다.
    /*
    이기배	9806261234567	2000
    이준복	9607161234567	1000
    이하이	0204054234567	1000
    이이제	0503243234567	1500
    */
    
    SELECT SANAME, JUBUN, SAL
    FROM TBL_SAWON
    WHERE SANAME LIKE '이_';
    --==>> 조회 결과 없음
    
    SELECT SANAME, JUBUN, SAL
    FROM TBL_SAWON
    WHERE SANAME LIKE '이%';
    --==>> // 이씨 성을 가진 모두 검색 가능~
    /*
    이기배	9806261234567	2000
    이준복	9607161234567	1000
    이하이	0204054234567	1000
    이이제	0503243234567	1500
    */

    --○ TBL_SAWON 테이블에서 이름의 마지막 글자가 『서』로 끝나는 사원의
    --   사원명, 주민번호, 입사일, 급여 항목을 조회한다.
    SELECT 사원명, 주민번호, 입사일, 급여
    FROM TBL_SAWON
    WHERE 이름의 마지막 글자가 『서』;
    
    SELECT SANAME, JUBUN, HIREDATE, SAL
    FROM TBL_SAWON
    WHERE SANAME LIKE '__서';
    --==>>
    /*
    박혜서	9910102234567	2001-01-03	3000
    최이서	9403302234567	1999-08-16	5000
    */
    
    SELECT SANAME, JUBUN, HIREDATE, SAL
    FROM TBL_SAWON
    WHERE SANAME LIKE '%서';
    --==>>
    /*
    박혜서	9910102234567	2001-01-03	3000
    최이서	9403302234567	1999-08-16	5000
    */

    --○ TBL_SAWON 테이블에서 이름의 두 번째 글자가 『이』인 사원의
    --   사원명, 주민번호, 입사일, 급여 항목을 조회한다.
    SELECT 사원명, 주민번호, 입사일, 급여
    FROM TBL_SAWON
    WHERE 이름의 두 번째 글자가 『이』;
    
    SELECT SANAME, JUBUN, HIREDATE, SAL
    FROM TBL_SAWON
    WHERE SANAME LIKE '_이';
    --==>> 조회 결과 없음
    
    SELECT SANAME, JUBUN, HIREDATE, SAL
    FROM TBL_SAWON
    WHERE SANAME LIKE '_이_';
    --==>> //전제 조건 : 이름이 세 글자 인 사람만
    /*
    최이서	9403302234567	1999-08-16	5000
    이이제	0503243234567	2015-03-01	1500
    */
    
    SELECT SANAME, JUBUN, HIREDATE, SAL
    FROM TBL_SAWON
    WHERE SANAME LIKE '_이%';
    --==>> // 전제 조건 : 이름이 몇글자이든 상관 없이 두번째 자리가 '이' 인 사람
    /*
    최이서	9403302234567	1999-08-16	5000
    이이제	0503243234567	2015-03-01	1500
    */

    --○ TBL_SAWON 테이블에서 이름에 『이』라는 글자가
    --   하나라도 포함되어 있으면 해당 사원의;
    --   사원명, 주민번호, 입사일, 급여 항목을 조회한다.
    SELECT 사원명, 주민번호, 입사일, 급여
    FROM TBL_SAWON
    WHERE 이름에 『이』라는 글자 하나라도 포함되어 있으면;
    
    SELECT SANAME, JUBUN, HIREDATE, SAL
    FROM TBL_SAWON
    WHERE SANAME LIKE '%이%';
    --==>>
    /*
    최이서	9403302234567	1999-08-16	5000
    이기배	9806261234567	2009-07-15	2000
    이준복	9607161234567	2010-06-05	1000
    이하이	0204054234567	2012-12-10	1000
    이이제	0503243234567	2015-03-01	1500
    남궁이	0512153234567	2020-05-06	3000
    */

    --○ TBL_ SAWON 테이블에서 이름에 『이』라는 글자가
    --   연속으로 두 번 포함되어 있으면 해당 사원의
    --   사원명, 주민번호, 입사일, 급여 항목을 조회한다.
    SELECT 사원명, 주민번호, 입사일, 급여
    FROM TBL_SAWON
    WHERE 『이』라는 글자가 연속으로 두번 포함;
    
    SELECT SANAME, JUBUN, HIREDATE, SAL
    FROM TBL_SAWON
    WHERE 『이』라는 글자가 연속으로 두번 포함;
    
    SELECT SANAME, JUBUN, HIREDATE, SAL
    FROM TBL_SAWON
    WHERE SANAME LIKE '%이이%';
    --==>> 이이제	0503243234567	2015-03-01	1500
    
    
    --○ TBL_ SAWON 테이블에서 이름에 『이』라는 글자가
    --   연속적이지 않더라도... 두 번 포함되어 있으면 해당 사원의
    --   사원명, 주민번호, 입사일, 급여 항목을 조회한다.
    SELECT 사원명, 주민번호, 입사일, 급여
    FROM TBL_SAWON
    WHERE 『이』라는 글자가 연속적이지 않더라도 두번 포함;
    
    SELECT SANAME, JUBUN, HIREDATE, SAL
    FROM TBL_SAWON
    WHERE 『이』라는 글자가 연속적이지 않더라도 두번 포함;
    
    SELECT SANAME, JUBUN, HIREDATE, SAL
    FROM TBL_SAWON
    WHERE SANAME LIKE '%이%이%';
    --==>>
    /*
    이하이	0204054234567	2012-12-10	1000
    이이제	0503243234567	2015-03-01	1500
    */
    • 주의할 점 
      - 데이터베이스 설계 시 성과 이름을 분리해서 처리해야 할 업무 계획이 있다면(지금 당장은 아니더라도)
      테이블에서 성 컬럼(LAST NAME) 과 이름 컬럼(FIRST NAME)을 분리하여 구성해야한다.
    --○ TBL_SAWON 테이블에서 성씨가 남씨인 사원의
    --   사원명, 주민번호, 급여 항목을 조회한다.
    SELECT 사원명, 주민번호, 급여
    FROM TBL_SAWON
    WHERE 성씨가 남씨;
    
    SELECT SANAME, JUBUN, SAL
    FROM TBL_SAWON
    WHERE SANAME LIKE '남%';
    --==>>
    /*
    남주혁	0607083234567	4000
    남궁이	0512153234567	3000
    남진	7309231234567	4000
    */
    
    --○ TBL_SAWON 테이블에서 성씨가 선씨인 사원의
    --   사원명, 주민번호, 급여 항목을 조회한다.
    SELECT 사원명, 주민번호, 급여
    FROM TBL_SAWON
    WHERE 성씨가 선씨;
    
    SELECT SANAME, JUBUN, SAL
    FROM TBL_SAWON
    WHERE SANAME LIKE '선%';
    --==>>
    /*
    선동열	    7505071234567	3000
    선우용녀	7102032234567	2000
    선우선	    0102094234567	2000
    */
    더보기
    --○ TBL_SAWON 테이블에서 여직원들의 사원명, 주민번호, 급여 항목을 조회한다.
    SELECT 사원명, 주민번호, 급여
    FROM TBL_SAWON
    WHERE 여직원;
    
    SELECT SANAME, JUBUN, SAL
    FROM TBL_SAWON
    WHERE 성별이 여성;
    
    SELECT SANAME, JUBUN, SAL
    FROM TBL_SAWON
    WHERE 주민번호 7번째 자리 1개 2
          주민번호 7번째 자리 1개 4;
    
    SELECT SANAME, JUBUN, SAL
    FROM TBL_SAWON
    WHERE JUBUN 7번째 자리 1개 2
       OR JUBUN 7번째 자리 1개 4;
    
    SELECT SANAME, JUBUN, SAL
    FROM TBL_SAWON
    WHERE JUBUN LIKE '______2' 
       OR JUBUN LIKE '______4';
    --==>> 조회 결과 없음 // 의미 잘못전달
    
    SELECT SANAME, JUBUN, SAL
    FROM TBL_SAWON
    WHERE JUBUN LIKE '______2______' 
       OR JUBUN LIKE '______4______';
    --==>>  // 이 경우에는 13자리까지라는 유효성이 포함되어있어 이 형태가 더 바람직함
    /*
    박혜서     	9910102234567	3000
    유서영  	9902242234567	2000
    최이서  	9403302234567	5000
    양연수 	    9910132234567	4000
    양수현	    9907092234567	2000
    주수인	    9604052234567	2000
    이하이	    0204054234567	1000
    선우용녀	7102032234567	2000
    선우선	    0102094234567	2000
    */
    
    SELECT SANAME, JUBUN, SAL
    FROM TBL_SAWON
    WHERE JUBUN LIKE '______2%' 
       OR JUBUN LIKE '______4%';
    --==>>
    /*
    박혜서     	9910102234567	3000
    유서영  	9902242234567	2000
    최이서  	9403302234567	5000
    양연수 	    9910132234567	4000
    양수현	    9907092234567	2000
    주수인	    9604052234567	2000
    이하이	    0204054234567	1000
    선우용녀	7102032234567	2000
    선우선	    0102094234567	2000
    */

    • 주의할점2
      - ESCAPE
    --○ 실습 테이블 생성(TBL_WATCH)
    CREATE TABLE TBL_WATCH
    ( WATCH_NAME    VARCHAR2(20)
    , BIGO          VARCHAR2(100)
    );
    --==>> Table TBL_WATCH이(가) 생성되었습니다.
    
    
    --○ 데이터 입력
    INSERT INTO TBL_WATCH(WATCH_NAME, BIGO)
    VALUES('금시계','순금 99.99% 함유된 최고급 시계');
    INSERT INTO TBL_WATCH(WATCH_NAME, BIGO)
    VALUES('은시계','고객 만족도 99.99점을 획득한 시계');
    
    --==>> 1 행 이(가) 삽입되었습니다. * 2
    
    
    --○ 확인
    SELECT *
    FROM TBL_WATCH;
    --==>>
    /*
    WATCH_NAME           BIGO                                                                                                
    -------------------- ------------------------------------------
    금시계               순금 99.99% 함유된 최고급 시계                                                                      
    은시계               고객 만족도 99.99점을 획득한 시계
    */
    
    --○ 커밋
    COMMIT;
    --==>> 커밋 완료.   // INSERT 구문 뒤에 커밋함!
    
    
    --○ TBL_WATCH 테이블의 BIGO(비고) 컬럼에
    --   『99.99%』 라는 글자가 들어있는 행(레코드)의 정보를 조회한다.
    SELECT *
    FROM TBL_WATCH
    WHERE BIGO 컬럼에 99.99%가 들어있는 행;
    
    SELECT *
    FROM TBL_WATCH
    WHERE BIGO = '99.99%';
    --==>> 조회 결과 없음 //99.99%만 들어가있는 레코드 없음~
    
    SELECT *
    FROM TBL_WATCH
    WHERE BIGO LIKE '%99.99%%';
    
    SELECT *
    FROM TBL_WATCH
    WHERE BIGO LIKE '%99.99% %';
    
    SELECT *
    FROM TBL_WATCH
    WHERE BIGO LIKE '%99.99%% %';
    --==>> % 와일드 카드는 개수를 몇 개 붙이든 같은 의미를 가지기 때문에 %하나 쓴 것과 동일
    /*
    금시계	순금 99.99% 함유된 최고급 시계
    은시계	고객 만족도 99.99점을 획득한 시계
    */
    
    --○ ESCAPE
    
    SELECT *
    FROM TBL_WATCH
    WHERE BIGO LIKE '%99.99$%%' ESCAPE'$'; 
    --==>> 금시계	순금 99.99% 함유된 최고급 시계
    
    --※ ESCAPE 로 정한 문자의 다음 한 글자는 와일드카드(캐릭터)에서 탈출시켜라...
    --   → 『ESCAPE '$'』
    --   일반적으로 키워드가 아닌, 연산자도 아닌, 사용빈도가 낮은 특수문자(특수기호)를 사용한다.

    • COMMIT 커밋 / ROLLBACK 롤백
    SELECT *
    FROM TBL_DEPT;
    --==>>
    /*
        DEPTNO DNAME          LOC          
    ---------- -------------- -------------
            10 ACCOUNTING     NEW YORK     
            20 RESEARCH       DALLAS       
            30 SALES          CHICAGO      
            40 OPERATIONS     BOSTON 
    */
    
    --○ 데이터 입력
    INSERT INTO TBL_DEPT VALUES(50,'개발부','서울');     --// 테이블(~~) 괄호 안에 컬럼의 입력 순서나 파라미터를 넘기지 않는것이 가능 // 그러나 NULL이 안되는 컬럼은 반드시 포함되어야하며, 넣지 않은 값의 DEFAULT 는 NULL 값이다.
    --==>> 1 행 이(가) 삽입되었습니다.
    --> 50번... 개발부... 서울...
    --  1) 
    --  지금 입력한 이 데이터는 TBL_DEPT 테이블이 저장되어 있는
    --  하드디스크상에 물리적으로 적용되어 저장된 것이 아니라
    --  메모리(RAM) 상에 입력된 것이다.   
    
    SELECT *
    FROM TBL_DEPT;
    --==>> --// 메모리상에 저장된 것이 보인다고 하드디스크 상에 저장된 것이 아님을 인지
    /*
        DEPTNO DNAME          LOC          
    ---------- -------------- -------------
            10 ACCOUNTING     NEW YORK     
            20 RESEARCH       DALLAS       
            30 SALES          CHICAGO      
            40 OPERATIONS     BOSTON  
            50 개발부	      서울
    */
    
    --○ 롤백
    ROLLBACK;
    --==>> 롤백 완료.
    
    --○ 롤백 이후 다시 확인
    SELECT *
    FROM TBL_DEPT;
    --==>>
    /*
        DEPTNO DNAME          LOC          
    ---------- -------------- -------------
            10 ACCOUNTING     NEW YORK     
            20 RESEARCH       DALLAS       
            30 SALES          CHICAGO      
            40 OPERATIONS     BOSTON  
    */
    --> 50번... 개발부... 서울...
    --  에 대한 데이터가 소실되었음을 확인(존재하지 않음)
    
    --○ 다시 입력
    INSERT INTO TBL_DEPT VALUES(50,'개발부','서울');
    --==>> 1 행 이(가) 삽입되었습니다.
    --> 메모리 상에 입력된 이 데이터를
    --  실제 하드디스크상에 물리적으로 저장하기 위해서는
    --  COMMIT 을 수행해야 한다.
    
    
    --○ 확인
    SELECT *
    FROM TBL_DEPT;
    --==>>
    /*
    10	ACCOUNTING	NEW YORK
    20	RESEARCH	DALLAS
    30	SALES	CHICAGO
    40	OPERATIONS	BOSTON
    50	개발부	서울
    */
    
    
    --○ 커밋
    COMMIT;
    --==>> 커밋 완료.
    
    --○ 커밋 이후 다시 확인
    SELECT *
    FROM TBL_DEPT;
    --==>>
    /*
        DEPTNO DNAME          LOC          
    ---------- -------------- -------------
            10 ACCOUNTING     NEW YORK     
            20 RESEARCH       DALLAS       
            30 SALES          CHICAGO      
            40 OPERATIONS     BOSTON       
            50 개발부         서울   
    */
    
    --○ 롤백
    ROLLBACK;
    
    --○ 롤백 이후 다시 확인
    SELECT *
    FROM TBL_DEPT;
    --==>>
    /*
        DEPTNO DNAME          LOC          
    ---------- -------------- -------------
            10 ACCOUNTING     NEW YORK     
            20 RESEARCH       DALLAS       
            30 SALES          CHICAGO      
            40 OPERATIONS     BOSTON       
            50 개발부         서울   
    */
    --> 롤백(ROLLBACK)을 수행했음에도 불구하고
    --  50번... 개발부... 서울... 의 데이터는 소실되지 않았음을 확인
    
    
    --※ COMMIT 을 실행한 이후로 DML구문(INSERT, UPDATE, DELETE 등) 을 통해
    --   변경된 데이터만 취소할 수 있는 것일 뿐...
    --   DML 명령(INSERT, UPDATE, DELETE 등)을 사용한 후 COMMIT 하고 나서 ROLLBACK 을 실행해봐야
    --   이전 상태로 되돌릴 수 없다. (아무런 소용이 없다.)

    • 데이터 수정 UPDATE
    --○ 데이터 수정(TBL_DEPT)    // UPDATE-WHERE-SET 순서로 작성하자!
    UPDATE TBL_DEPT
    SET DNAME = '연구부', LOC = '경기'
    WHERE DEPTNO = 50;
    --==>> 1 행 이(가) 업데이트되었습니다.
    
    --○ 확인
    SELECT *
    FROM TBL_DEPT;
    --==>>
    /*
        DEPTNO DNAME          LOC          
    ---------- -------------- -------------
            10 ACCOUNTING     NEW YORK     
            20 RESEARCH       DALLAS       
            30 SALES          CHICAGO      
            40 OPERATIONS     BOSTON       
            50 연구부         경기    
    */
    
    --○ 롤백
    ROLLBACK;
    --==>> 롤백 완료.
    
    --○ 롤백 이후 다시 확인
    SELECT *
    FROM TBL_DEPT;
    --==>>
    /*
        DEPTNO DNAME          LOC          
    ---------- -------------- -------------
            10 ACCOUNTING     NEW YORK     
            20 RESEARCH       DALLAS       
            30 SALES          CHICAGO      
            40 OPERATIONS     BOSTON       
            50 개발부         서울 
    */
    --> 수정(UPDATE)을 수행하기 이전 상태로 복원되었음을 확인

    • 데이터 삭제 DELETE
    --○ 데이터 삭제 (TBL_DEPT)
    SELECT *
    FROM TBL_DEPT
    WHERE DEPTNO = 50;
    --==>> 50	개발부	서울
    
    DELETE
    FROM TBL_DEPT
    WHERE DEPTNO = 50;
    --==>> 1 행 이(가) 삭제되었습니다.
    
    --○ 확인
    SELECT *
    FROM TBL_DEPT;
    --==>>
    /*
    10	ACCOUNTING	NEW YORK
    20	RESEARCH	DALLAS
    30	SALES	CHICAGO
    40	OPERATIONS	BOSTON
    */
    
    
    --○ 롤백
    ROLLBACK;
    --==>> 롤백 완료.
    
    --○ 롤백 이후 다시 확인
    SELECT *
    FROM TBL_DEPT;
    --==>>
    /*
    10	ACCOUNTING	NEW YORK
    20	RESEARCH	DALLAS
    30	SALES	CHICAGO
    40	OPERATIONS	BOSTON
    50	개발부	서울
    */
    --> 삭제(DELETE) 구문을 수행하기 이전 상태로 복원되었음을 확인
    
    DELETE
    FROM TBL_DEPT
    WHERE DEPTNO = 50;
    --==>> 1 행 이(가) 삭제되었습니다.
    
    --○ 커밋
    COMMIT;
    --==>> 커밋 완료.
    
    --○ 롤백
    ROLLBACK;
    
    --○ 롤백 이후 다시 확인
    SELECT *
    FROM TBL_DEPT;
    --==>>
    /*
    10	ACCOUNTING	NEW YORK
    20	RESEARCH	DALLAS
    30	SALES	CHICAGO
    40	OPERATIONS	BOSTON
    */

    • 정렬 ODER BY 절
      - PASING 가장 마지막 순서
    • 오름차순 정렬 ASC
    더보기
    SELECT ENAME"사원명",DEPTNO"부서번호",JOB"직종",SAL"급여"
          , SAL*12+NVL(COMM,0)"연봉"
    FROM TBL_EMP
    ORDER BY DEPTNO ASC;        -- DEPTNO → 부서번호 기준 정렬      -- //가장 마지막 PASING 순서 
                                -- ASC    → Ascending 오름차순 정렬   → 생략 가능
    --==>>
    /*
    사원명     부서번호   직종      급여       연봉
    ---------- ---------- --------- ---------- ----------
    CLARK              10 MANAGER         2450      29400
    KING               10 PRESIDENT       5000      60000
    MILLER             10 CLERK           1300      15600
    JONES              20 MANAGER         2975      35700
    FORD               20 ANALYST         3000      36000
    ADAMS              20 CLERK           1100      13200
    SMITH              20 CLERK            800       9600
    SCOTT              20 ANALYST         3000      36000
    WARD               30 SALESMAN        1250      15500
    TURNER             30 SALESMAN        1500      18000
    ALLEN              30 SALESMAN        1600      19500
    JAMES              30 CLERK            950      11400
    BLAKE              30 MANAGER         2850      34200
    MARTIN             30 SALESMAN        1250      16400
    */
    
    SELECT ENAME"사원명",DEPTNO"부서번호",JOB"직종",SAL"급여"
          , SAL*12+NVL(COMM,0)"연봉"
    FROM TBL_EMP
    ORDER BY DEPTNO;
    --==>> 기본적으로 오름차순이기 때문에 ASC 생략가능
    /*
    사원명     부서번호   직종      급여       연봉
    ---------- ---------- --------- ---------- ----------
    CLARK              10 MANAGER         2450      29400
    KING               10 PRESIDENT       5000      60000
    MILLER             10 CLERK           1300      15600
    JONES              20 MANAGER         2975      35700
    FORD               20 ANALYST         3000      36000
    ADAMS              20 CLERK           1100      13200
    SMITH              20 CLERK            800       9600
    SCOTT              20 ANALYST         3000      36000
    WARD               30 SALESMAN        1250      15500
    TURNER             30 SALESMAN        1500      18000
    ALLEN              30 SALESMAN        1600      19500
    JAMES              30 CLERK            950      11400
    BLAKE              30 MANAGER         2850      34200
    MARTIN             30 SALESMAN        1250      16400
    */

    • 내림차순 정렬 DESC 
    더보기
    SELECT ENAME"사원명",DEPTNO"부서번호",JOB"직종",SAL"급여"
          , SAL*12+NVL(COMM,0)"연봉"
    FROM TBL_EMP
    ORDER BY DEPTNO DESC;           -- DEPTNO → 부서번호 기준 정렬
                                    -- DESC   → Descending 내림차순 정렬  → 생략 불가능
    --==>>
    /*
    사원명     부서번호   직종      급여       연봉
    ---------- ---------- --------- ---------- ----------
    BLAKE              30 MANAGER         2850      34200
    TURNER             30 SALESMAN        1500      18000
    ALLEN              30 SALESMAN        1600      19500
    MARTIN             30 SALESMAN        1250      16400
    WARD               30 SALESMAN        1250      15500
    JAMES              30 CLERK            950      11400
    SCOTT              20 ANALYST         3000      36000
    JONES              20 MANAGER         2975      35700
    SMITH              20 CLERK            800       9600
    ADAMS              20 CLERK           1100      13200
    FORD               20 ANALYST         3000      36000
    KING               10 PRESIDENT       5000      60000
    MILLER             10 CLERK           1300      15600
    CLARK              10 MANAGER         2450      29400
    */
    
    SELECT ENAME"사원명",DEPTNO"부서번호",JOB"직종",SAL"급여"
          , SAL*12+NVL(COMM,0)"연봉"
    FROM TBL_EMP
    ORDER BY SAL DESC;
    --==>>
    /*
    사원명     부서번호   직종      급여       연봉
    ---------- ---------- --------- ---------- ----------
    KING               10 PRESIDENT       5000      60000
    FORD               20 ANALYST         3000      36000
    SCOTT              20 ANALYST         3000      36000
    JONES              20 MANAGER         2975      35700
    BLAKE              30 MANAGER         2850      34200
    CLARK              10 MANAGER         2450      29400
    ALLEN              30 SALESMAN        1600      19500
    TURNER             30 SALESMAN        1500      18000
    MILLER             10 CLERK           1300      15600
    WARD               30 SALESMAN        1250      15500
    MARTIN             30 SALESMAN        1250      16400
    ADAMS              20 CLERK           1100      13200
    JAMES              30 CLERK            950      11400
    SMITH              20 CLERK            800       9600
    */

    • 정렬 주의점 / 특이사항
      - PASING 순서에 의해  ALIAS(별칭) 사용가능 // 단, ALIAS 에 띄어쓰기가 적용된 경우 " " 붙여서 사용해야함
      - SELECT 된 순서대로 1번 ~ 해서 번호로도 정렬 가능
      - 여러 기준으로 정렬 가능. 단, 순차적으로 적용 (뒤에오는 정렬은 앞에서 해둔 정렬의 영향을 받는다.)
      - 정렬시에 ',' 로 연결 해둘 시에도 정렬 방법을 기재하지 않으면 자동으로 ASC가 된다.
    SELECT ENAME"사원명",DEPTNO"부서번호",JOB"직종",SAL"급여"
          , SAL*12+NVL(COMM,0)"연봉"
    FROM TBL_EMP
    ORDER BY 연봉 DESC;
    --==>>
    /*
    사원명     부서번호   직종      급여       연봉
    ---------- ---------- --------- ---------- ----------
    KING               10 PRESIDENT       5000      60000
    FORD               20 ANALYST         3000      36000
    SCOTT              20 ANALYST         3000      36000
    JONES              20 MANAGER         2975      35700
    BLAKE              30 MANAGER         2850      34200
    CLARK              10 MANAGER         2450      29400
    ALLEN              30 SALESMAN        1600      19500
    TURNER             30 SALESMAN        1500      18000
    MARTIN             30 SALESMAN        1250      16400
    MILLER             10 CLERK           1300      15600
    WARD               30 SALESMAN        1250      15500
    ADAMS              20 CLERK           1100      13200
    JAMES              30 CLERK            950      11400
    SMITH              20 CLERK            800       9600
    */
    --> 오라클 내부적으로 ORDER BY 절보다 SELECT 절이 먼저 처리되기 때문에
    --  컬럼명 대신 SELECT 절에서 사용한 ALIAS(별칭) 을
    --  ORDER BY 절에서 사용해도 문제가 발생하지 않는다. (→ 가능하다.)
    
    
    SELECT ENAME"사원명",DEPTNO"부서 번호",JOB"직종",SAL"급여"
          , SAL*12+NVL(COMM,0)"연봉"
    FROM TBL_EMP
    ORDER BY 부서 번호 DESC;
    --==>>
    /*
    ORA-00933: SQL command not properly ended
    00933. 00000 -  "SQL command not properly ended"
    *Cause:    
    *Action:
    851행, 111열에서 오류 발생
    */
    
    SELECT ENAME"사원명",DEPTNO"부서 번호",JOB"직종",SAL"급여"
          , SAL*12+NVL(COMM,0)"연봉"
    FROM TBL_EMP
    ORDER BY "부서 번호" DESC;
    --==>>
    /*
    사원명     부서번호   직종      급여       연봉
    ---------- ---------- --------- ---------- ----------
    BLAKE              30 MANAGER         2850      34200
    TURNER             30 SALESMAN        1500      18000
    ALLEN              30 SALESMAN        1600      19500
    MARTIN             30 SALESMAN        1250      16400
    WARD               30 SALESMAN        1250      15500
    JAMES              30 CLERK            950      11400
    SCOTT              20 ANALYST         3000      36000
    JONES              20 MANAGER         2975      35700
    SMITH              20 CLERK            800       9600
    ADAMS              20 CLERK           1100      13200
    FORD               20 ANALYST         3000      36000
    KING               10 PRESIDENT       5000      60000
    MILLER             10 CLERK           1300      15600
    CLARK              10 MANAGER         2450      29400
    */
    
    SELECT ENAME"사원명",DEPTNO"부서번호",JOB"직종",SAL"급여"
          , SAL*12+NVL(COMM,0)"연봉"
    FROM TBL_EMP
    ORDER BY 2; -- DEPT ASC
    --==>>
    /*
    사원명     부서번호   직종      급여       연봉
    ---------- ---------- --------- ---------- ----------
    CLARK              10 MANAGER         2450      29400
    KING               10 PRESIDENT       5000      60000
    MILLER             10 CLERK           1300      15600
    JONES              20 MANAGER         2975      35700
    FORD               20 ANALYST         3000      36000
    ADAMS              20 CLERK           1100      13200
    SMITH              20 CLERK            800       9600
    SCOTT              20 ANALYST         3000      36000
    WARD               30 SALESMAN        1250      15500
    TURNER             30 SALESMAN        1500      18000
    ALLEN              30 SALESMAN        1600      19500
    JAMES              30 CLERK            950      11400
    BLAKE              30 MANAGER         2850      34200
    MARTIN             30 SALESMAN        1250      16400
    */
    --> TBL_EMP 테이블이 소유한 컬럼의 고유한 순서가 아니라
    --  SLEECT처리되는 컬럼의 순서
    --  또한, 이 때의 순서는 1부터 시작
    
    SELECT ENAME,  DEPTNO, JOB, SAL
    FROM TBL_EMP
    ORDER BY 2,4; -- DEPTNO 를 기준 1차 정렬, SAL 기준 2차 정렬... ASC
    --==>>
    /*
    ENAME          DEPTNO JOB              SAL
    ---------- ---------- --------- ----------
    MILLER             10 CLERK           1300
    CLARK              10 MANAGER         2450
    KING               10 PRESIDENT       5000
    SMITH              20 CLERK            800
    ADAMS              20 CLERK           1100
    JONES              20 MANAGER         2975
    SCOTT              20 ANALYST         3000
    FORD               20 ANALYST         3000
    JAMES              30 CLERK            950
    MARTIN             30 SALESMAN        1250
    WARD               30 SALESMAN        1250
    TURNER             30 SALESMAN        1500
    ALLEN              30 SALESMAN        1600
    BLAKE              30 MANAGER         2850
    */
    
    SELECT ENAME, DEPTNO, JOB, SAL
    FROM TBL_EMP
    ORDER BY 2,3,4 DESC;
    --> ① DEPTNO(부서번호) 기준 오름차순 정렬
    --  ② JOB(직종명) 기준 오름차순 정렬
    --  ③ SAL(급여) 기준 내림차순 정렬
    --  (3차 정렬 수행)
    --==>>
    /*
    ENAME          DEPTNO JOB              SAL
    ---------- ---------- --------- ----------
    MILLER             10 CLERK           1300
    CLARK              10 MANAGER         2450
    KING               10 PRESIDENT       5000
    SCOTT              20 ANALYST         3000
    FORD               20 ANALYST         3000
    ADAMS              20 CLERK           1100
    SMITH              20 CLERK            800
    JONES              20 MANAGER         2975
    JAMES              30 CLERK            950
    BLAKE              30 MANAGER         2850
    ALLEN              30 SALESMAN        1600
    TURNER             30 SALESMAN        1500
    MARTIN             30 SALESMAN        1250
    WARD               30 SALESMAN        1250
    */

    • 문자열 관련 함수
    • 문자열 결합
      - CONCAT() 함수
    CONCAT() → 문자열 결합 함수
    SELECT '김철수' || '김영희' "확인1"
        , CONCAT('김철수','김영희') "확인2"
    FROM DUAL;
    --==>> 김철수김영희	김철수김영희
    
    SELECT ENAME || JOB "확인1"
         , CONCAT(ENAME, JOB) 
    FROM TBL_EMP;
    --==>>
    /*
    SMITHCLERK	    SMITHCLERK
    ALLENSALESMAN	ALLENSALESMAN
    WARDSALESMAN	WARDSALESMAN
    JONESMANAGER	JONESMANAGER
    MARTINSALESMAN	MARTINSALESMAN
    BLAKEMANAGER	BLAKEMANAGER
    CLARKMANAGER	CLARKMANAGER
    SCOTTANALYST	SCOTTANALYST
    KINGPRESIDENT	KINGPRESIDENT
    TURNERSALESMAN	TURNERSALESMAN
    ADAMSCLERK	    ADAMSCLERK
    JAMESCLERK	    JAMESCLERK
    FORDANALYST	    FORDANALYST
    MILLERCLERK	    MILLERCLERK
    */
    
    SELECT ENAME || JOB || DEPTNO "확인1"
          , CONCAT(ENAME,JOB,DEPTNO)
    FROM TBL_EMP;
    --==>> 에러발생
    /*
    ORA-00909: invalid number of arguments
    00909. 00000 -  "invalid number of arguments"
    *Cause:    
    *Action:
    995행, 13열에서 오류 발생
    */
    --> 두 개의 문자열을 결합시켜주는 기능을 가진 함수
    --  오로지 2 개만 결합을 수행할 수 있다.
    
    SELECT ENAME || JOB || DEPTNO "확인1"
          , CONCAT(CONCAT(ENAME,JOB),DEPTNO) "확인2"
    FROM TBL_EMP;
    --==>>
    /*
    SMITHCLERK20	    SMITHCLERK20
    ALLENSALESMAN30	ALLENSALESMAN30
    WARDSALESMAN30	WARDSALESMAN30
    JONESMANAGER20	JONESMANAGER20
    MARTINSALESMAN30	MARTINSALESMAN30
    BLAKEMANAGER30	BLAKEMANAGER30
    CLARKMANAGER10	CLARKMANAGER10
    SCOTTANALYST20	SCOTTANALYST20
    KINGPRESIDENT10	KINGPRESIDENT10
    TURNERSALESMAN30	TURNERSALESMAN30
    ADAMSCLERK20	    ADAMSCLERK20
    JAMESCLERK30    	JAMESCLERK30
    FORDANALYST20	FORDANALYST20
    MILLERCLERK10	MILLERCLERK10
    */
    --> 내부적인 형 변환이 일어나며 결합을 수행하게 된다.
    --  CONCAT() 은 문자타입과 문자타입을 대상으로 결합을 수행하는 함수이지만
    --  내부적으로는 숫자나 날짜를 문자 타입으로 바꾸어주는 과정이 포함되어 있다.

    • 문자열 추출
      - SUBSTR() 문자 갯수 기반 / SUBSTRINGB() 바이트 기반
    --※ JAVA 의 String.subString()
    /*
    obj.subString();
    ---
     |
    문자열.subString(n,m); → 문자열 추출
                    -----
                    n 부터 m-1 까지... (0부터 시작하는 인덱스 적용)
                    
    */
    
    
    --○ SUBSTR() 문자 갯수 기반 / SUBSTRINGB() 바이트 기반 → 문자열 추출 함수
    SELECT ENAME"1"
         , SUBSTR(ENAME,1,2) "2"
         , SUBSTR(ENAME,2,2) "3"
         , SUBSTR(ENAME,3,2) "4"
         , SUBSTR(ENAME,2) "5"  
    FROM TBL_EMP;
    --> 문자열을 추출하는 기능을 가진 함수
    --  첫 번째 파라미터는 대상 문자열 (추출의 대상, TARGET)
    --  두 번째 파라미터는 추출을 시작하는 위치 (단, 인덱스는 1부터 시작)
    --  세 번째 파라미터는 추출할 문자열의 갯수 (생략시... 시작위치부터 끝까지) 
    --==>>
    /*
    1          2  3  4  5        
    ---------- -- -- -- ---------
    SMITH      SM MI IT MITH     
    ALLEN      AL LL LE LLEN     
    WARD       WA AR RD ARD      
    JONES      JO ON NE ONES     
    MARTIN     MA AR RT ARTIN    
    BLAKE      BL LA AK LAKE     
    CLARK      CL LA AR LARK     
    SCOTT      SC CO OT COTT     
    KING       KI IN NG ING      
    TURNER     TU UR RN URNER    
    ADAMS      AD DA AM DAMS
    JAMES      JA AM ME AMES     
    FORD       FO OR RD ORD      
    MILLER     MI IL LL ILLER
    */
    더보기
    --○ TBL_SAWON 테이블에서 성별이 남성인 사원만
    --   사원번호, 사원명, 주민번호, 급여 항목을 조회한다.
    --   단, SUBSTR() 함수를 사용할 수 있도록 하며,
    --   급여를 기준으로 내림차순 정렬을 수행할 수 있도록 한다.
    SELECT 사원번호, 사원명, 주민번호, 급여
    FROM TBL_SAWON
    WHERE 성별이 남성
    ORDER BY 급여를 기준으로 내림차순;
    
    SELECT SANO"사원번호", SANAME"사원명", JUBUN"주민번호", SAL"급여"
    FROM TBL_SAWON
    WHERE 주민번호 7번째 자리 1개가 1
          주민번호 7번째 자리 1개가 3
    ORDER BY SAL DESC;
    
    SELECT SANO"사원번호", SANAME"사원명", JUBUN"주민번호", SAL"급여"
    FROM TBL_SAWON
    WHERE SUBSTR(JUBUN,7,1) 가 1 
          SUBSTR(JUBUN,7,1) 가 3
    ORDER BY SAL DESC;
    
    SELECT SANO"사원번호", SANAME"사원명", JUBUN"주민번호", SAL"급여"
    FROM TBL_SAWON
    WHERE SUBSTR(JUBUN,7,1) = 1 
       OR SUBSTR(JUBUN,7,1) = 3
    ORDER BY SAL DESC;
    
    SELECT SANO"사원번호", SANAME"사원명", JUBUN"주민번호", SAL"급여"
    FROM TBL_SAWON
    WHERE SUBSTR(JUBUN,7,1) = '1'
       OR SUBSTR(JUBUN,7,1) = '3'
    ORDER BY SAL DESC;
    --==>>
    /*
    사원번호   사원명                         주민번호      급여
    ---------- ------------------------------ ------------- ----------
          1013 남주혁                         0607083234567       4000
          1016 남진                           7309231234567       4000
          1011 선동열                         7505071234567       3000
          1014 남궁이                         0512153234567       3000
          1007 이기배                         9806261234567       2000
          1010 이이제                         0503243234567       1500
          1008 이준복                         9607161234567       1000
    */
    
    SELECT SANO"사원번호", SANAME"사원명", JUBUN"주민번호", SAL"급여"
    FROM TBL_SAWON
    WHERE SUBSTR(JUBUN,7,1) IN ('1','3')
    ORDER BY SAL DESC;
    --==>>
    /*
    사원번호   사원명                         주민번호      급여
    ---------- ------------------------------ ------------- ----------
          1013 남주혁                         0607083234567       4000
          1016 남진                           7309231234567       4000
          1011 선동열                         7505071234567       3000
          1014 남궁이                         0512153234567       3000
          1007 이기배                         9806261234567       2000
          1010 이이제                         0503243234567       1500
          1008 이준복                         9607161234567       1000
    */

    • 문자열 길이
      - LENGTH() / LENGTHB()
      - FROM NLS_DATABASE_PARAMETERS; // 인코딩 방식 확인
    SELECT ENAME "1"
         , LENGTH(ENAME) "2"
         , LENGTHB(ENAME) "3"
    FROM TBL_EMP;
    --==>> LENGTH() 는 글자 수를 반환, LENGTHB() 는 바이트 수를 반환
    --==>>
    /*
    SMITH	5	5
    ALLEN	5	5
    WARD	4	4
    JONES	5	5
    MARTIN	6	6
    BLAKE	5	5
    CLARK	5	5
    SCOTT	5	5
    KING	4	4
    TURNER	6	6
    ADAMS	5	5
    JAMES	5	5
    FORD	4	4
    MILLER	6	6
    */
    
    --○ 확인
    SELECT *
    FROM NLS_DATABASE_PARAMETERS;
    --==>>
    /*
    PARAMETER                      VALUE                                   
    ------------------------------ ----------------------------------------
    NLS_LANGUAGE                   AMERICAN                                
    NLS_TERRITORY                  AMERICA                                 
    NLS_CURRENCY                   $                                       
    NLS_ISO_CURRENCY               AMERICA                                 
    NLS_NUMERIC_CHARACTERS         .,                                      
    NLS_CHARACTERSET               AL32UTF8                                
    NLS_CALENDAR                   GREGORIAN                               
    NLS_DATE_FORMAT                DD-MON-RR                               
    NLS_DATE_LANGUAGE              AMERICAN                                
    NLS_SORT                       BINARY                                  
    NLS_TIME_FORMAT                HH.MI.SSXFF AM
    NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM                
    NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR                      
    NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR            
    NLS_DUAL_CURRENCY              $                                       
    NLS_COMP                       BINARY                                  
    NLS_LENGTH_SEMANTICS           BYTE                                    
    NLS_NCHAR_CONV_EXCP            FALSE                                   
    NLS_NCHAR_CHARACTERSET         AL16UTF16                               
    NLS_RDBMS_VERSION              11.2.0.2.0   
    
    20개 행이 선택되었습니다. 
    */
    --※ 한글 데이터를 처리할 경우
    --   바이트 기반으로 처리해야만 하는 상황이라면
    --   항상 인코딩 방식을 잘 체크하고 사용해야 한다.

    • 문자열 찾기
      - INSTR()
    --○ INSTR()
    SELECT 'ORACLE ORAHOME BIORA' "1"
           ,INSTR('ORACLE ORAHOME BIORA', 'ORA', 1, 1) "2"
           ,INSTR('ORACLE ORAHOME BIORA', 'ORA', 1, 2) "3"
           ,INSTR('ORACLE ORAHOME BIORA', 'ORA', 2, 1) "4"
           ,INSTR('ORACLE ORAHOME BIORA', 'ORA', 2) "5"
           ,INSTR('ORACLE ORAHOME BIORA', 'ORA', 2, 2) "6"
    FROM DUAL;
    --==>> ORACLE ORAHOME BIORA	1	8	8	8	18
    --> 첫 번째 파라미터에 해당하는 문자열에서.. (즉, 대상 문자열)
    --  두 번째 파라미터를 통해 넘겨준 문자열이 등장하는 위치를 찾아라
    --  세 번째 파라미터 값은 찾기 시작하는... (즉, 스캔을 시작하는) 위치 // 스캔은 이 위치부터 시작하지만 반환하는 값은 처음 1 부터 시작하게 된다.
    --  네 번째 파라미터 값은 몇 번째 등장하는 값을 찾을 것인지에 대한 설정 (1일 경우에는 생략 가능)
    
    
    SELECT '나의오라클 집으로오라 합니다' "1"
          ,INSTR('나의오라클 집으로오라 합니다','오라',1) "2"
          ,INSTR('나의오라클 집으로오라 합니다','오라',2) "3"
          ,INSTR('나의오라클 집으로오라 합니다','오라',10) "4"
          ,INSTR('나의오라클 집으로오라 합니다','오라',11) "5"
    FROM DUAL;
    --> 마지막 파라미터(네 번째 파라미터)를 생략한 형태로 사용 → 네 번째 파라미터 1이 생략 되어있는 형태
    --  한글 형태를 대상으로 수행할 수 있다.
    --==>> 나의오라클 집으로오라 합니다	3	3	10	0   --// 찾지 못한 경우에 0 을 반환!

    • 문자열 반전
      REVERSE()
    --○ REVERSE()
    SELECT 'ORACLE' "1"
         , REVERSE('ORACLE') "2"
         , REVERSE('오라클') "3"
    FROM DUAL;
    --> 대상 문자열(매개변수)을 거꾸로 반환한다. (단, 한글은 제외)
    --==>> ORACLE	ELCARO	���

    더보기
    --○ 실습 대상 테이블 생성(TBL_FILES)
    CREATE TABLE TBL_FILES
    ( FILENO        NUMBER(3)
    , FILENAME      VARCHAR2(100)
    );
    --==>> Table TBL_FILES이(가) 생성되었습니다.
    
    --○ 실습 데이터 입력
    INSERT INTO TBL_FILES VALUES(1, 'C:\AAA\BBB\CCC\SALES.DOC');
    INSERT INTO TBL_FILES VALUES(2, 'C:\AAA\PANMAE.XXLS');
    INSERT INTO TBL_FILES VALUES(3, 'D:\RESEARCH.PPT');
    INSERT INTO TBL_FILES VALUES(4, 'C:\DOCUMENTS\STUDY.HWP');
    INSERT INTO TBL_FILES VALUES(5, 'C:\DOCUMENTS\TEMP\SQL.TXT');
    INSERT INTO TBL_FILES VALUES(6, 'C:\JAVASTUDY\TEST002.JAVA');
    INSERT INTO TBL_FILES VALUES(7, 'D:\SHARE\F\TEST.PNG');
    INSERT INTO TBL_FILES VALUES(8, 'C:\USER\LEEKIBAE\PICTURE\PHOTO\SPRING.JPG');
    INSERT INTO TBL_FILES VALUES(9, 'C:\ORACLESTUDY\20230324_01_SCOTT.SQL');
    --==>> 1 행 이(가) 삽입되었습니다. * 9
    
    --○ 확인
    SELECT *
    FROM TBL_FILES;
    --==>>
    /*
    1	C:\AAA\BBB\CCC\SALES.DOC
    2	C:\AAA\PANMAE.XXLS
    3	D:\RESEARCH.PPT
    4	C:\DOCUMENTS\STUDY.HWP
    5	C:\DOCUMENTS\TEMP\SQL.TXT
    6	C:\JAVASTUDY\TEST002.JAVA
    7	D:\SHARE\F\TEST.PNG
    8	C:\USER\LEEKIBAE\PICTURE\PHOTO\SPRING.JPG
    9	C:\ORACLESTUDY\20230324_01_SCOTT.SQL
    */
    
    --○ 커밋
    COMMIT;
    --==>> 커밋 완료.
    
    SELECT FILENO"파일번호", FILENAME "파일명"
    FROM TBL_FILES;
    --==>>
    /*
      파일번호 파일명                                                                                                 
    ---------- ---------------------------------------------------
             1 SALES.DOC                                                                            
             2 PANMAE.XXLS                                                                                  
             3 RESEARCH.PPT                                                                                     
             4 STUDY.HWP                                                                              
             5 SQL.TXT                                                                           
             6 TEST002.JAVA                                                                           
             7 TEST.PNG                                                                                 
             8 SPRING.JPG                                                           
             9 20230324_01_SCOTT.SQL                                                                
    */
    
    
    
    --○ TBL_FILES 테이블을 대상으로
    --   위와 같이 조회될 수 있도록 (파일명.확장자) 쿼리문을 구성한다.
    
    SELECT FILENO "파일번호", SUBSTR(FILENAME,INSTR(FILENAME,'\',-1,1)+1) "파일명"
    FROM TBL_FILES;
    
    SELECT FILENO"파일번호"
          ,SUBSTR(FILENAME,(LENGTH(FILENAME) - INSTR(REVERSE(FILENAME),'\',1)+2)) "파일명"
    FROM TBL_FILES;
    
    
    SELECT FILENO"파일번호"
          , REVERSE(SUBSTR(REVERSE(FILENAME),1,INSTR(REVERSE(FILENAME),'\',1)-1)) "파일명"
    FROM TBL_FILES;
    
    -- 강사님 풀이
    
    SELECT FILENO "파일번호", FILENAME "경로포함파일명"
          ,REVERSE(FILENAME) "거꾸로된경로포함파일명"              --// ALIAS 가 너무 길면 에러남
    FROM TBL_FILES;
    
    SELECT FILENO "파일번호", FILENAME "경로포함파일명"
          ,REVERSE(FILENAME) "거꾸로된경로포함파일"              
    FROM TBL_FILES;
    --==>>
    /*
    1	C:\AAA\BBB\CCC\SALES.DOC	                COD.SELAS\CCC\BBB\AAA\:C
    2	C:\AAA\PANMAE.XXLS	                        SLXX.EAMNAP\AAA\:C
    3	D:\RESEARCH.PPT	                            TPP.HCRAESER\:D
    4	C:\DOCUMENTS\STUDY.HWP	                    PWH.YDUTS\STNEMUCOD\:C
    5	C:\DOCUMENTS\TEMP\SQL.TXT	                TXT.LQS\PMET\STNEMUCOD\:C
    6	C:\JAVASTUDY\TEST002.JAVA	                AVAJ.200TSET\YDUTSAVAJ\:C
    7	D:\SHARE\F\TEST.PNG	                        GNP.TSET\F\ERAHS\:D
    8	C:\USER\LEEKIBAE\PICTURE\PHOTO\SPRING.JPG	GPJ.GNIRPS\OTOHP\ERUTCIP\EABIKEEL\RESU\:C
    9	C:\ORACLESTUDY\20230324_01_SCOTT.SQL	        LQS.TTOCS_10_42303202\YDUTSELCARO\:C
    */
    -- 최초 '\' 가 등장하는 위치
    
    SELECT FILENO "파일번호", FILENAME "경로포함파일명"
          , SUBSTR(REVERSE(FILENAME),1,(최초 '\' 가 등장하는 위치-1)) "거꾸로된경로포함파일"              
    FROM TBL_FILES;
    
    -- 최초 '\' 가 등장하는 위치
    SELECT INSTR(대상문자열, '\',1)      -- 마지막 매개변수 1 생략 (최초등장)
    FROM TBL_FILES;
    
    -- 최초 '\' 가 등장하는 위치
    SELECT INSTR(REVERSE(FILENAME), '\',1) 
    FROM TBL_FILES;
    --==>>
    /*
    10
    12
    13
    10
    8
    13
    9
    11
    22
    */
    
    SELECT FILENO "파일번호", FILENAME "경로포함파일명"
          , SUBSTR(REVERSE(FILENAME),1,(INSTR(REVERSE(FILENAME), '\',1)-1)) "거꾸로된경로포함파일"              
    FROM TBL_FILES;
    --==>>
    /*
    1	C:\AAA\BBB\CCC\SALES.DOC	                COD.SELAS
    2	C:\AAA\PANMAE.XXLS	                        SLXX.EAMNAP
    3	D:\RESEARCH.PPT	                            TPP.HCRAESER
    4	C:\DOCUMENTS\STUDY.HWP	                    PWH.YDUTS
    5	C:\DOCUMENTS\TEMP\SQL.TXT	                TXT.LQS
    6	C:\JAVASTUDY\TEST002.JAVA	                AVAJ.200TSET
    7	D:\SHARE\F\TEST.PNG	                        GNP.TSET
    8	C:\USER\LEEKIBAE\PICTURE\PHOTO\SPRING.JPG	GPJ.GNIRPS
    9	C:\ORACLESTUDY\20230324_01_SCOTT.SQL        LQS.TTOCS_10_42303202
    */
    
    SELECT FILENO "파일번호", FILENAME "경로포함파일명"
          , REVERSE(SUBSTR(REVERSE(FILENAME),1,(INSTR(REVERSE(FILENAME), '\',1)-1))) "파일명"           
    FROM TBL_FILES;
    --==>>
    /*
    1	C:\AAA\BBB\CCC\SALES.DOC	                SALES.DOC
    2	C:\AAA\PANMAE.XXLS	                        PANMAE.XXLS
    3	D:\RESEARCH.PPT	                            RESEARCH.PPT
    4	C:\DOCUMENTS\STUDY.HWP	                    STUDY.HWP
    5	C:\DOCUMENTS\TEMP\SQL.TXT	                SQL.TXT
    6	C:\JAVASTUDY\TEST002.JAVA	                TEST002.JAVA
    7	D:\SHARE\F\TEST.PNG	                        TEST.PNG
    8	C:\USER\LEEKIBAE\PICTURE\PHOTO\SPRING.JPG	SPRING.JPG
    9	C:\ORACLESTUDY\20230324_01_SCOTT.SQL	        20230324_01_SCOTT.SQL
    */

    • 공간 확보 후 문자열 채우는 함수
      - LPAD() ,  RPAD()
      - 두 번째 파라미터 먼저 확인 
    --○ LPAD()  //LEFT
    --> Byte 공간을 확보하여 왼쪽부터 문자로 채우는 기능을 가진 함수
    SELECT 'ORACLE' "1"
          , LPAD('ORACLE',10,'*') "2"
    FROM DUAL;
    --==>> ORACLE	****ORACLE
    --> ① 10Byte 공간을 확보한다.                    → 두 번째 파라미터에 의해...
    --  ② 확보한 공간에 'ORACLE' 문자열을 담는다.    → 첫 번째 파라미터에 의해...
    --  ③ 남아있는 Byte 공간(4Byte)을 왼.쪽.부터 세번째 파라미터로 채운다.
    --  ④ 이렇게 구성된 최종 결과값을 반환한다.
    
    
    --○ RPAD()  //RIGHT
    --> Byte 공간을 확보하여 왼쪽부터 문자로 채우는 기능을 가진 함수
    SELECT 'ORACLE' "1"
          , RPAD('ORACLE',10,'*') "2"
    FROM DUAL;
    --==>> ORACLE	ORACLE****
    --> ① 10Byte 공간을 확보한다.                    → 두 번째 파라미터에 의해...
    --  ② 확보한 공간에 'ORACLE' 문자열을 담는다.    → 첫 번째 파라미터에 의해...
    --  ③ 남아있는 Byte 공간(4Byte)을 오.른.쪽.부터 세번째 파라미터로 채운다.
    --  ④ 이렇게 구성된 최종 결과값을 반환한다.

    • 문자열 잘라내기 (특히 공백제거 함수)
      - LTRIM() , RTRIM()
      - TRIM 손톱깎이!  또깍 또깍 또깍 해서 자르다가 다른 부분이 나오면 멈춤
         근데 뭉텅이로 자르는게 아니라 두 번째 파라미터 값 안에 있는 문자들을 하나하나하나로 자르게 됨!..
      - 두 번째 매개변수가 없으면 무조건 공백 제거 함수로 활용됨!

     

    728x90
Designed by planet-si