-
003. 문자열 데이터 조회(와일드카드, ESCAPE), 커밋/롤백, 데이터 업데이트, 정렬, 문자열 관련 함수SsY/Class 2023. 3. 28. 10:42728x90
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'SsY > Class' 카테고리의 다른 글
005. 서브쿼리, 인라인뷰, 등수 함수, 그룹 함수 와 주의점 (0) 2023.03.29 004. 문자열 / 숫자 데이터 / 날짜 데이터 관련 함수, 변환 함수, CASE문(조건문, 분기문) (0) 2023.03.28 002. 컬럼,데이터 추가/삭제, 테이블 제거, NULL 처리/연산, 문자열 결합, WHERE 조건문, BETWEEN ⓐ AND ⓑ (0) 2023.03.28 001. 테이블스페이스~컬럼 생성, 파일 조회 , * PASING 순서, 오라클의 주요 자료형(숫자,문자,날짜) , 연산자, 코멘트 (0) 2023.03.27 000. Oracle 설치 및 삭제 // 데이터베이스에 대한 이해 : 데이터, 정보, 데이터베이스(+관리) (0) 2023.03.25 - 어제 이어서...