ORACLE

OracleStudy / 20220221_01_scott.sql / 기본 구문 실습

universedevelope 2022. 7. 1. 11:52
-- ※ BETWEEN [A] AND [B] 는 날짜형, 숫자형, 문자형 데이터 모두에 적용
   -- 단, 문자형일경우 아스키코드 순서를 따르기 때문에(사전식배열)
   -- 대문자가 앞쪽에 위치하고 소문자가 뒤쪽에 위치
   -- 또한 BETWEEN [A] AND [B] 는 해당 구문이 수행되는 시점에서
   -- 오라클 내부적으로는 부등호 연산자의 형태로 바뀌어 연산 처리됨.
SELECT ASCII('A') "COL1", ASCII('B') "COL2", ASCII('a') "COL3", ASCII('b') "COL4"   
FROM DUAL;
--==>> 65	66	97	98

SELECT USER
FROM DUAL;

SELECT ENAME, JOB, SAL
FROM TBL_EMP
WHERE JOB = 'SALESMAN'
      OR JOB = 'CLERK';
/*
SMITH	CLERK	    800
ALLEN	SALESMAN	1600
WARD	SALESMAN	1250
MARTIN	SALESMAN	1250
TURNER	SALESMAN	1500
ADAMS	CLERK	    1100
JAMES	CLERK	    950
MILLER	CLERK	    1300
호석이	SALESMAN	(null)
문정이	SALESMAN	(null)
*/

SELECT ENAME, JOB, SAL
FROM TBL_EMP
WHERE JOB IN('SALESMAN', 'CLERK');
/*
SMITH	CLERK	    800
ALLEN	SALESMAN	1600
WARD	SALESMAN	1250
MARTIN	SALESMAN	1250
TURNER	SALESMAN	1500
ADAMS	CLERK	    1100
JAMES	CLERK	    950
MILLER	CLERK	    1300
호석이	SALESMAN	(null)
문정이	SALESMAN	(null)
*/

SELECT ENAME, JOB, SAL
FROM TBL_EMP
WHERE JOB =ANY('SALESMAN', 'CLERK');
/*
SMITH	CLERK	    800
ALLEN	SALESMAN	1600
WARD	SALESMAN	1250
MARTIN	SALESMAN	1250
TURNER	SALESMAN	1500
ADAMS	CLERK	    1100
JAMES	CLERK	    950
MILLER	CLERK	    1300
호석이	SALESMAN	(null)
문정이	SALESMAN	(null)
*/

--※ 위의 3가지 유형의 쿼리문은 모두 같은 결과를 반환한다.
--   하지만, 맨 위의 쿼리문(OR)이 가장 빠르게 처리된다.
--   물론 메모리에 대한 내용이 아니라 CPU 처리에 대한 내용이므로
--   이 부분까지 감안하여 쿼리문을 구성하게 되는 경우는 많지 않다.
--   → 『~ IN(  ,   )』 과 『~ = ANY(    ,    )』는 같은 연산자효과를 가진다
--      이들 모두는 내부적으로 『OR』구조로 변경되어 연산 처리된다.        

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

-- ○ 추가 실습 테이블 구성(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)
*/

-- ○ 생성된 테이블에 데이터 입력(TBL_SAWON)
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1001, '김민성', '9707251234567', TO_DATE('2005-01-03', 'YYYY-MM-DD'), 3000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1002, '서민지', '9505152234567', TO_DATE('1999-11-23', 'YYYY-MM-DD'), 4000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1003, '이지연', '9905192234567', TO_DATE('2006-08-10', 'YYYY-MM-DD'), 3000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1004, '이연주', '9508162234567', TO_DATE('2007-10-10', 'YYYY-MM-DD'), 4000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1005, '오이삭', '9805161234567', TO_DATE('2007-10-10', 'YYYY-MM-DD'), 4000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1006, '이현이', '8005132234567', TO_DATE('1999-10-10', 'YYYY-MM-DD'), 1000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1007, '박한이', '0204053234567', TO_DATE('2010-10-10', 'YYYY-MM-DD'), 1000);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1008, '선동렬', '6803171234567', TO_DATE('1998-10-10', 'YYYY-MM-DD'), 1500);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1009, '선우용녀', '6912232234567', TO_DATE('1998-10-10', 'YYYY-MM-DD'), 1300);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1010, '선우선', '0303044234567', TO_DATE('2010-10-10', 'YYYY-MM-DD'), 1600);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1011, '남주혁', '0506073234567', TO_DATE('2012-10-10', 'YYYY-MM-DD'), 2600);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1012, '남궁민', '0208073234567', TO_DATE('2012-10-10', 'YYYY-MM-DD'), 2600);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1013, '남진', '6712121234567', TO_DATE('1998-10-10', 'YYYY-MM-DD'), 2200);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1014, '홍수민', '0005044234567', TO_DATE('2015-10-10', 'YYYY-MM-DD'), 5200);

INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1015, '임소민', '9711232234567', TO_DATE('2007-10-10', 'YYYY-MM-DD'), 5500);


--==>> 1 행 이(가) 삽입되었습니다. * 15

-- ○ 확인
SELECT *
FROM TBL_SAWON;
/*
1001	김민성	    9707251234567	2005-01-03	3000
1002	서민지	    9505152234567	1999-11-23	4000
1003	이지연	    9905192234567	2006-08-10	3000
1004	이연주	    9508162234567	2007-10-10	4000
1005	오이삭	    9805161234567	2007-10-10	4000
1006	이현이	    8005132234567	1999-10-10	1000
1007	박한이 	    0204053234567	2010-10-10	1000
1008	선동렬	    6803171234567	1998-10-10	1500
1009	선우용녀	6912232234567	1998-10-10	1300
1010	선우선	    0303044234567	2010-10-10	1600
1011	남주혁	    0506073234567	2012-10-10	2600
1012	남궁민	    0208073234567	2012-10-10	2600
1013	남진	    6712121234567	1998-10-10	2200
1014	홍수민	    0005044234567	2015-10-10	5200
1015	임소민	    9711232234567	2007-10-10	5500
*/
 
-- ○ 커밋 
COMMIT;
--==>> 커밋완료

-- ○ TBL_SAWON 테이블에서 '이지연' 사원의 데이터를 조회한다.

SELECT *
FROM TBL_SAWON
WHERE SANAME = '이지연';
--==>> 1003	이지연	9905192234567	2006-08-10	3000

SELECT *
FROM TBL_SAWON
WHERE SANAME LIKE '이지연';
--==>> 1003	이지연	9905192234567	2006-08-10	3000

-- ※ LIKE : 동사 → 좋아하다
--         : 부사 → ~ 같이, ~ 처럼  CHECK ~ !!!

-- ※ WHILD CARD(CHARACTER) → 『%』는 모든 글자를 의미하고
--    『LIKE』와 함께 사용되는 『_』는 아무 글자 한개를 의미한다.

-- ○ TBL_SAWON 테이블에서 성씨가 『김』씨인 사원의
--    사원명, 주민번호, 급여 항목을 조회한다.
SELECT *
FROM TBL_SAWON
WHERE SANAME = '김'; 
--==>> 조회 결과 없음

SELECT *
FROM TBL_SAWON
WHERE SANAME LIKE '김__';
--==>> 1001	김민성	9707251234567	2005-01-03	3000

SELECT *
FROM TBL_SAWON
WHERE SANAME LIKE '김%';
--==>> --==>> 1001	김민성	9707251234567	2005-01-03	3000

-- ○ TBL_SAWON 테이블에서 성씨가 『이』씨인 사원의
--    사원명 주민번호 급여 항목을 조회한다.

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '이';
--==>> 조회 결과 없음

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '이__';
/*
이지연	9905192234567	3000
이연주	9508162234567	4000
이현이	8005132234567	1000
*/


SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '이%';
--==>>
/*
이지연	9905192234567	3000
이연주	9508162234567	4000
이현이	8005132234567	1000
*/

-- ○ TBL_SAWON 테이블에서 이름의 마지막 글자가 『민』인 사원의
--    사원명, 주민번호, 급여 항목을 조회한다.

-- FM대로 가본다
SELECT 사원명, 주민번호, 급여
FROM TBL_SAWON
WHERE 마지막글자 민;

SELECT SANAME 사원명, JUBUN 주민번호, SAL 급여
FROM TBL_SAWON
WHERE SANAME LIKE '__민';
/*
남궁민	0208073234567	2600
홍수민	0005044234567	5200
임소민	9711232234567	5500
*/

SELECT SANAME 사원명, JUBUN 주민번호, SAL 급여
FROM TBL_SAWON
WHERE SANAME LIKE '%민';
/*
남궁민	0208073234567	2600
홍수민	0005044234567	5200
임소민	9711232234567	5500
*/

SELECT SANAME 사원명, JUBUN 주민번호, SAL 급여
FROM TBL_SAWON
WHERE SANAME LIKE '남%민';

-- ○ 추가 데이터 입력(TBL_SAWON)
INSERT INTO TBL_SAWON(SANO, SANAME, JUBUN, HIREDATE, SAL)
VALUES(1016, '이이경', '0603194234567', TO_DATE('2015-01-20', 'YYYY-MM-DD'), 1500);

SELECT *
FROM TBL_SAWON;
/*
1002	서민지	    9505152234567	1999-11-23	4000
1003	이지연	    9905192234567	2006-08-10	3000
1004	이연주	    9508162234567	2007-10-10	4000
1005	오이삭	    9805161234567	2007-10-10	4000
1006	이현이	    8005132234567	1999-10-10	1000
1007	박한이	    0204053234567	2010-10-10	1000
1008	선동렬	    6803171234567	1998-10-10	1500
1009	선우용녀	6912232234567	1998-10-10	1300
1010	선우선	    0303044234567	2010-10-10	1600
1011	남주혁	    0506073234567	2012-10-10	2600
1012	남궁민	    0208073234567	2012-10-10	2600
1013	남진	    6712121234567	1998-10-10	2200
1014	홍수민	    0005044234567	2015-10-10	5200
1015	임소민	    9711232234567	2007-10-10	5500
1016	이이경	    0603194234567	2015-01-20	1500
*/

-- ○ 커밋
COMMIT;
--==>> 커밋 완료.


-- ○ TBL_SAWON 테이블에서 사원의 이름에 『이』라는 글자가
--    하나라도 포함되어 있다면 그 사원의
--    사원번호, 사원명, 급여 항목을 조회한다.
SELECT 사원번호, 사원명, 급여
FROM TBL_SAWON
WHERE 이름에 이 하나라도 포함되어;

SELECT SANO 사원번호, SANAME 사원명, SAL 급여
FROM TBL_SAWON
WHERE 이름에 이 하나라도 포함되어;

SELECT SANO 사원번호, SANAME 사원명, SAL 급여
FROM TBL_SAWON
WHERE SANAME LIKE '%이%';
/*
1003	이지연	3000
1004	이연주	4000
1005	오이삭	4000
1006	이현이	1000
1007	박한이	1000
1016	이이경	1500
*/

-- ○ TBL_SAWON 테이블에서 사원의 이름이 『이』라는 글자가
--    연속으로 두 번 들어있는 사원의
--    사원번호, 사원명 급여 항목을 조회한다.

SELECT SANO, SANAME, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%이이%';
--==>> 1016	이이경	1500

-- ○ TBL_SAWON 테이블에서 사원의 이름이 『이』라는 글자가 두 번 들어있는 사원의
--    사원번호, 사원명, 급여 항목을 조회한다.

SELECT SANO, SANAME, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '%이%이%';
/*
1006	이현이	1000
1016	이이경	1500
*/

-- ○ TBL_SAWON 테이블에서 사원 이름의 두 번재 글자가 『이』인 사원의
--    사원번호, 사원명, 급여 항목을 조회한다.

SELECT SANO, SANAME, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '_이%';
/*
1005	오이삭	4000
1016	이이경	1500
*/

-- ○ TBL_SAWON 테이블에서 사원 성씨가 『선』인 사원의
--    사원번호, 사원명, 급여 항목을 조회한다.
SELECT SANO, SANAME, SAL
FROM TBL_SAWON
WHERE SANAME LIKE '선%';
/*
1008	선동렬	    1500
1009	선우용녀	1300        --????? 『선우』 씨
1010	선우선	    1600
*/

-- ※ 데이터베이스 설계 과정에서
--    성과 이름을 분리하여 처리해야 할 업무 계획이 있다면
--    테이블에서 성 컬럼과 이름 컬럼을분리하여 구성해야 한다.

-- ○ TBL_SAWON 테이블에서 여직원들의
--    사원명, 주민번호, 급여 항목을 조회한다.

SELECT 사원명, 주민번호, 급여
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 LIKE '______2______'
      OR
      JUBUN LIKE '______4______';      

SELECT SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE JUBUN LIKE  '______2%' OR  JUBUN LIKE '______4%';

-- ○ 테이블 생성(TBL_WATCH)
CREATE TABLE TBL_WATCH
( WATCH_NAME    VARCHAR2(20)
, BIGO          VARCHAR2(100)
);

INSERT INTO TBL_WATCH(WATCH_NAME, BIGO)
VALUES ('금시계', '순금 99.99% 함유된 최고급 시계');
--==>> 1 행 이(가) 삽입되었습니다.

INSERT INTO TBL_WATCH(WATCH_NAME, BIGO)
VALUES ('은시계', '고객 만족도 99.99점을 획득한 멋진 시계');
--==>> 1 행 이(가) 삽입되었습니다.

SELECT *
FROM TBL_WATCH;
/*
금시계	순금 99.99% 함유된 최고급 시계
은시계	고객 만족도 99.99점을 획득한 멋진 시계
*/

COMMIT;
--==>> 커밋 완료

-- ○ TBL_WATCH 테이블의 BIGO(비고) 컬럼에
--    『99.99%』라는 글자가 포함된(들어있는) 행(레코드)의 데이터를
--    조회한다.

SELECT *
FROM TBL_WATCH
WHERE BIGO LIKE '%99.99%%';
/*
금시계	순금 99.99% 함유된 최고급 시계
은시계	고객 만족도 99.99점을 획득한 멋진 시계
*/

SELECT *
FROM TBL_WATCH
WHERE BIGO LIKE '%99.99\%%' ESCAPE '\';
--==>> 금시계	순금 99.99% 함유된 최고급 시계

SELECT *
FROM TBL_WATCH
WHERE BIGO LIKE '%99.99$%%' ESCAPE '$';
--==>> 금시계	순금 99.99% 함유된 최고급 시계

-- ※ ESCAPE 로 정한 문자의 다음 한 글자를 와일드카드에서 탈출시켜라
--    일반적으로 사용 빈도가 낮은 특수문자(특수기호)를 사용한다.

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

-- ■■■ COMMIT / ROLLBACK■■■ --
SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
*/

-- ○ 데이터 입력
INSERT INTO TBL_DEPT VALUES(50, '개발부', '서울');
--==>> 1 행 이(가) 삽입되었습니다.
SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
50	개발부	    서울
*/
-- 50번 개발부 서울...
-- 이 데이터는 TBL_DEPT 테이블이 저장되어 있는
-- 하드디스크 상에 물리적으로 적용되어 저장된 것이 아니다.
-- 메모리(RAM)상에 입력된 것이다.

-- ○ 롤백
ROLLBACK;

-- ○ 다시 확인
SELECT * 
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
*/
--> 50번 개발부 서울.. 에 대한 데이터가 소실되었음을 확인(존재하지 않음)

-- ○ 다시 데이터 입력
INSERT INTO TBL_DEPT VALUES(50, '개발부', '서울');
--==>> 1 행 이(가) 삽입되었습니다.

-- 50번 개발부 서울...
-- 이 데이터는 TBL_DEPT 테이블이 저장되어 있는 하드디스크 상에 저장된 것이 아니라
-- 메모리(RAM)상에 입력된 것이다.
-- 이를 실제 하드디스크 상에 물리적으로 저장하기 위해서는
-- COMMIT 을 수행해야 한다.

SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
50	개발부	    서울
*/

-- ○ 커밋
COMMIT;
--==>> 커밋 완료.

-- ○ 커밋 이후 다시확인

SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
50	개발부	    서울
*/

-- ○ 커밋 이후 다시 롤백
ROLLBACK;
--==>> 롤백 완료.

SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
50	개발부     	서울
*/
--> 롤 백을 수행했음에도 불구하고
--  50번 개발부 서울.. 의 행 데이터는 소실되지 않았음을 확인

-- ※ COMMIT 을 실행한 이후로 DML 구문(INSERT, UPDATE, DELETE)을 통해
--    변경된 데이터를 취소할 수 있는 것일뿐
--    DML 구문을 사용한 후 COMMIT 을 하고 나서 ROLLBACK 을 실행해봐야
--    아무런 소용이 없다.

-- ○ 데이터 수정(UPDATE → TBL_DEPT)
UPDATE TBL_DEPT
SET DNAME='연구부', LOC='경기'
WHERE DEPTNO = 50;
--==>> 1 행 이(가) 업데이트되었습니다.

-- ○ 확인
SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
50	연구부	    경기
*/

-- ○ 롤백
ROLLBACK;
--==>> 롤백 완료.

-- ↓↓↓↓↓↓  개발부 - (업데이트)연구부 - (롤백)개발부

-- ○ 다시 확인
SELECT *
FROM TBL_DEPT;
/*
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	    CHICAGO
40	OPERATIONS	BOSTON
50	개발부	    서울
*/

-- ○ 데이터 삭제(DELETE → TBL_DEPT)
DELETE TBL_DEPT
WHERE DEPTNO = 50; -- 원래 구문

SELECT *
FROM TBL_DEPT
WHERE DEPTNO=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	개발부	    서울
*/

--------------------------------------------------------------------------------
-- ■■■ ORDER BY 절 ■■■ --

SELECT ENAME "사원명", DEPTNO "부서번호", JOB "직종", SAL "급여"
       , SAL*12 + NVL(COMM, 0) "연봉"
FROM EMP;       
/*
SMITH	20	CLERK	     800 	 9600
ALLEN	30	SALESMAN	1600	19500
WARD	30	SALESMAN	1250	15500
JONES	20	MANAGER	    2975	35700
MARTIN	30	SALESMAN	1250	16400
BLAKE	30	MANAGER 	2850	34200
CLARK	10	MANAGER	    2450	29400
SCOTT	20	ANALYST	    3000	36000
KING	10	PRESIDENT	5000	60000
TURNER	30	SALESMAN	1500	18000
ADAMS	20	CLERK	    1100	13200
JAMES	30	CLERK	     950	11400
FORD	20	ANALYST 	3000	36000
MILLER	10	CLERK	    1300	15600

*/

SELECT ENAME "사원명", DEPTNO "부서번호", JOB "직종", SAL "급여"
       , SAL*12 + NVL(COMM, 0) "연봉"
FROM EMP 
ORDER BY DEPTNO ASC;    -- DEPTNO → 정렬 기준
/*
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 EMP 
ORDER BY DEPTNO;
/*
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
*/
--> ASC 오름차순 : 생략가능(디폴트가 오름차순)

SELECT ENAME "사원명", DEPTNO "부서번호", JOB "직종", SAL "급여"
       , SAL*12 + NVL(COMM, 0) "연봉"
FROM EMP 
ORDER BY DEPTNO 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 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
*/

SELECT ENAME "사원명", DEPTNO "부서번호", JOB "직종", SAL "급여"
       , SAL*12 + NVL(COMM, 0) "연봉"
FROM EMP 
ORDER BY 2;   -- 부서번호 오름차순(디폴트)  → SELECT 에서 파싱한 
                                             -- 컬럼 순서의 인덱스(2, 부서번호)
                                             -- 를 기준으로 정렬한다.
                                             
--> EMP 테이블이 갖고있는 테이블의 고유한 컬럼 순서(2→ ENAME, 사원명)가
--  아니라, SELECT 처리되는 두번째 컬럼(2→DEPTNO)로 정렬기준이 설정됨
--  ASC 생략된 상태, 오름차순 정렬 즉 『ORDER BY 2』 = 『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
*/

SELECT ENAME, DEPTNO, JOB, SAL
FROM EMP
ORDER BY 2, 4;
/*
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 EMP
ORDER BY 2, 3, 4 DESC;
-- ① 2 → DEPTNO(부서번호) 기준 오름차순 정렬
-- ② 3 → JOB(직종명) 기준 오름차순 정렬
-- ③ 4 → SAL(급여) 기준 DESC(내림차순 정렬)
--    (3차정렬 수행)
/*
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()
SELECT ENAME || JOB "COL1"
    ,  CONCAT(ENAME, JOB) "COL2"
FROM 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
*/
-- 문자열 결합기능 함수 CONCAT()
-- 오로지 2개의 문자열만 결합시켜줄 수 있다.
SELECT ENAME || JOB || DEPTNO "COL1"
      , CONCAT(ENAME, JOB, DEPTNO) "COL2"
FROM EMP;
--==>> 에러 발생
--     ORA-00909: invalid number of arguments

SELECT ENAME || JOB || DEPTNO "COL1"
      , CONCAT(ENAME, CONCAT(JOB, DEPTNO)) "COL2"
FROM EMP;
/*
SMITHCLERK20	    SMITHCLERK20
ALLENSALESMAN30	    ALLENSALESMAN30
WARDSALESMAN30	    WARDSALESMAN30
JONESMANAGER20	    JONESMANAGER20
MARTINSALESMAN30	MARTINSALESMAN30
BLAKEMANAGER30  	BLAKEMANAGER30
CLARKMANAGER10  	CLARKMANAGER10
SCOTTANALYST20  	SCOTTANALYST20
KINGPRESIDENT10 	KINGPRESIDENT10
TURNERSALESMAN3    	TURNERSALESMAN30
ADAMSCLERK20	    ADAMSCLERK20
JAMESCLERK30    	JAMESCLERK30
FORDANALYST20   	FORDANALYST20
MILLERCLERK10   	MILLERCLERK10
*/
--> 내부적으로 형변환을 해준다.... 결합수행 
-- CONCAT()은 문자열과 문자열을 결합시켜주는 함수이지만
-- 내부적으로 숫자나 날짜를 문자로 바꾸어주는 과정이 포함되어 있다.

/*
obj.substring()
---
 |
 문자열.substring(n, m);
                --------
                n부터 m-1 까지...(인덱스는 0부터)
*/

-- ○ SUBSTR() 추출 갯수기반 / SUBSTRB() 추출 바이트기반

SELECT ENAME "COL1"
      , SUBSTR(ENAME, 1, 2) "COL2"
FROM EMP;
--> 문자열을 추출하는 기능을 가진 함수
-- 첫 번째 파라미터 값은 대상 문자열(추출대상 TARGET)
-- 두 번째 파라미터 값은 추출을 시작하는 위치(인덱스는 1부터 시작)
-- 세 번째 파라미터 값은 추출할 문자열의 갯수(생략 시.. 끝까지)
/*
SMITH	SM
ALLEN	AL
WARD	WA
JONES	JO
MARTIN	MA
BLAKE	BL
CLARK	CL
SCOTT	SC
KING	KI
TURNER	TU
ADAMS	AD
JAMES	JA
FORD	FO
MILLER	MI
*/

-- ○ TBL_SAWON 테이블에서 성별이 남성인 사원만
--    사원번호, 사원명 주민번호 급여 항목을 조회
--    단 SUBSTR() 함수를 활용할 수 있도록 한다.

SELECT 사원번호, 사원명 주민번호 급여
FROM TBL_SAWON
WHERE 성별이 남성인 사원만;

SELECT SANO, SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SUBSTR(JUBUN, 7, 1) = '1' OR SUBSTR(JUBUN, 7, 1) = '3';
/*
1001	김민성	9707251234567	3000
1005	오이삭	9805161234567	4000
1007	박한이	0204053234567	1000
1008	선동렬	6803171234567	1500
1011	남주혁	0506073234567	2600
1012	남궁민	0208073234567	2600
1013	남진	6712121234567	2200
*/

SELECT SANO, SANAME, JUBUN, SAL
FROM TBL_SAWON
WHERE SUBSTR(JUBUN, 7, 1) IN('1', '3');
/*
1001	김민성	9707251234567	3000
1005	오이삭	9805161234567	4000
1007	박한이	0204053234567	1000
1008	선동렬	6803171234567	1500
1011	남주혁	0506073234567	2600
1012	남궁민	0208073234567	2600
1013	남진	6712121234567	2200
*/

-- ○ LENGTH() 글자 수 / LENGTHB() 바이트 수
SELECT ENAME "COL1"
     , LENGTH(ENAME) "COL2"
     , LENGTHB(ENAME) "COL3"
FROM EMP;
/*
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;
/*
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
*/

-- ○ INSTR()
SELECT 'ORACLE ORAHOME BIORA' "COL1"
      , INSTR('ORACLE ORAHOME BIORA', 'ORA', 1, 1) "COL2" -- 1
      , INSTR('ORACLE ORAHOME BIORA', 'ORA', 1, 2) "COL3" -- 8
      , INSTR('ORACLE ORAHOME BIORA', 'ORA', 2, 1) "COL4" -- 8
      , INSTR('ORACLE ORAHOME BIORA', 'ORA', 2) "COL5"    -- 8  
      , INSTR('ORACLE ORAHOME BIORA', 'ORA', 2, 3) "COL6" -- 0     
      , INSTR('ORACLE ORAHOME BIORA', 'ORA', -3) "COL7"   -- 18   
      , INSTR('ORACLE ORAHOME BIORA', 'ORA', -4) "COL8"   -- 8 
      , INSTR('ORACLE ORAHOME BIORA', 'ORA', -4, 2) "COL9"-- 1      
FROM DUAL;
--> 첫 번째 파라미터 값에 해당하는 문자열에서..(대상 문자열, TARGET)
--  두 번째 파라미터 값을 통해 넘겨준 문자열이 등장하는 위치를 찾아라!
--  세 번째 파라미터 값은 찾기 시작하는(스캔을 시작하는) 위치(→음수일 경우 뒤에서부터 스캔)
    -- 스캔만 역순으로하고, 인덱스는 원래 인덱스를 따라간다.
--  네 번째 파라미터 값은 몇 번째 등장하는 값을 찾을 것인지에 대한 설정
--    (1은 생략 가능)
--  
-- ORACLE ORAHOME BIORA	1	8	8	8	0

SELECT '나의오라클 집으로오라 합니다.' "COL1"
      , INSTR('나의오라클 집으로오라 합니다.', '오라', 1) "COL2"   --3
      , INSTR('나의오라클 집으로오라 합니다.', '오라', 2) "COL3"   --3
      , INSTR('나의오라클 집으로오라 합니다.', '오라', 10) "COL4"  --10
      , INSTR('나의오라클 집으로오라 합니다.', '오라', 11) "COL5"  --0
FROM DUAL;
--==>> 나의오라클 집으로오라 합니다.	3	3	10	0
--> 마지막 파라미터 값을 생략한 형태로 사용 → 마지막 파라미터 → 1

-- ○ REVERSE()
SELECT 'ORACLE' "COL1"
      , REVERSE('ORACLE') "COL2"
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\CC\SALES.DOC');
INSERT INTO TBL_FILES VALUES (2, 'C:\AAA\PANMAE.XXLS');
INSERT INTO TBL_FILES VALUES (3, 'D:\RESERACH.PPT');
INSERT INTO TBL_FILES VALUES (4, 'C:\DOCUMENTS\STUDY.HMP');
INSERT INTO TBL_FILES VALUES (5, 'C:\DOCUMENTS\TEMP\SQL.TXT');
INSERT INTO TBL_FILES VALUES (6, 'D:\SHARE\F\TEST.PNG');
INSERT INTO TBL_FILES VALUES (7, 'E:\STUDY\ORACLE.SQL');

COMMIT;

SELECT FILENO, FILENAME
FROM TBL_FILES;
/*
파일번호 파일명
-------- ------------------
    1	C:\AAA\BBB\CC\SALES.DOC
    2	C:\AAA\PANMAE.XXLS
    3	D:\RESERACH.PPT
    4	C:\DOCUMENTS\STUDY.HMP
    5	C:\DOCUMENTS\TEMP\SQL.TXT
    6	D:\SHARE\F\TEST.PNG
    7	E:\STUDY\ORACLE.SQL
*/

-- ○ TBL_FILES 테이블을
--    다음과 같이 조회될 수 있도록 쿼리문을 구성한다.
/*
파일번호 파일명
-------- ------------------
    1	SALES.DOC
    2	PANMAE.XXLS
    3	RESERACH.PPT
    4	STUDY.HMP
    5	SQL.TXT
    6	TEST.PNG
    7	ORACLE.SQL
*/

SELECT FILENO "파일번호", 
       SUBSTR(FILENAME, INSTR(FILENAME, '\', -4)+1) "파일명"
FROM TBL_FILES;
/*
1	SALES.DOC
2	PANMAE.XXLS
3	RESERACH.PPT
4	STUDY.HMP
5	SQL.TXT
6	TEST.PNG
7	ORACLE.SQL
*/

SELECT FILENO "파일번호", FILENAME "파일명"
FROM TBL_FILES
WHERE FILENO =1;
--==>> 1	C:\AAA\BBB\CC\SALES.DOC

SELECT FILENO "파일번호" 
       ,SUBSTR(FILENAME, 15, 9) "파일명"
FROM TBL_FILES
WHERE FILENO =1;
--==>> 1	SALES.DOC

SELECT FILENO "파일번호" 
       ,REVERSE(FILENAME) "파일명거꾸로"
FROM TBL_FILES;
/*
1	COD.SELAS   \CC\BBB\AAA\:C
2	SLXX.EAMNAP \AAA\:C
3	TPP.HCARESER    \:D
4	PMH.YDUTS   \STNEMUCOD\:C
5	TXT.LQS     \PMET\STNEMUCOD\:C
6	GNP.TSET    \F\ERAHS\:D
7	LQS.ELCARO  \YDUTS\:E
*/

SELECT FILENO "파일번호" 
       , FILENAME "경로포함파일명"
       , REVERSE(FILENAME) "거꾸로된경로및파일명"
       , SUBSTR(대상문자열, 추출시작위치, 최초『\』의 등장위치-1)
FROM TBL_FILES;

SELECT FILENO "파일번호" 
       , FILENAME "경로포함파일명"
       , REVERSE(FILENAME) "거꾸로된경로및파일명"
       , SUBSTR(REVERSE(대상문자열, 추출시작위치, 최초『\』의 등장위치-1))
FROM TBL_FILES;

-- 최초 『\』의 등장위치
-- → INSTR(REVERS(FILENAME), '\', 1)     -- 마지막 매개변수 1 생략 가능
SELECT FILENO "파일번호" 
       , FILENAME "경로포함파일명"
       , REVERSE(FILENAME) "거꾸로된경로및파일명"
       , SUBSTR(REVERSE(FILENAME), 1 , INSTR(REVERSE(FILENAME), '\', 1)-1)
FROM TBL_FILES;
/*
1	C:\AAA\BBB\CC\SALES.DOC	    COD.SELAS\CC\BBB\AAA\:C     	COD.SELAS
2	C:\AAA\PANMAE.XXLS  	    SLXX.EAMNAP\AAA\:C	           SLXX.EAMNAP
3	D:\RESERACH.PPT         	TPP.HCARESER\:D             	TPP.HCARESER
4	C:\DOCUMENTS\STUDY.HMP	    PMH.YDUTS\STNEMUCOD\:C      	PMH.YDUTS
5	C:\DOCUMENTS\TEMP\SQL.TXT	TXT.LQS\PMET\STNEMUCOD\:C   	TXT.LQS
6	D:\SHARE\F\TEST.PNG	        GNP.TSET\F\ERAHS\:D	            GNP.TSET
7	E:\STUDY\ORACLE.SQL	        LQS.ELCARO\YDUTS\:E         	LQS.ELCARO
*/

SELECT FILENO "파일번호" 
       , REVERSE(SUBSTR(REVERSE(FILENAME), 1 , INSTR(REVERSE(FILENAME), '\', 1)-1)) "파일명"
FROM TBL_FILES;
/*
1	SALES.DOC
2	PANMAE.XXLS
3	RESERACH.PPT
4	STUDY.HMP
5	SQL.TXT
6	TEST.PNG
7	ORACLE.SQL
*/

-- ○ LPAD()
--> Byte 를 확보하여 왼쪽부터 문자로 채우는 기능을 가진함수
SELECT 'ORACLE' "COL1"
      , LPAD('ORACLE', 10, '*') "COL2"
FROM DUAL;
--> ① 2번째 파라미터 값에 의해 10Byte 공간을 확보한다.
--> ② 1번째 파라미터 값에 의해 확보한 공간에 'ORACLE'문자열 담는다.  
--> ③ 3번째 파라미터 값을 남은 Byte 공간에 채운다
--     (LPAD : 왼쪽부터) 
--  ④ 최종결과값 반환 
--     ORACLE	****ORACLE


-- ○ RPAD()
--> Byte 를 확보하여 오른쪽부터 문자로 채우는 기능을 가진함수
SELECT 'ORACLE' "COL1"
      , RPAD('ORACLE', 10, '*') "COL2"
FROM DUAL;
--> ① 2번째 파라미터 값에 의해 10Byte 공간을 확보한다.
--> ② 1번째 파라미터 값에 의해 확보한 공간에 'ORACLE'문자열 담는다.  
--> ③ 3번째 파라미터 값을 남은 Byte 공간에 채운다
--     (RPAD : 오른쪽부터) 
--  ④ 최종결과값 반환 
--     ORACLE	ORACLE****

-- ○ LTRIM()
SELECT 'ORAORAORACLEORACLE' "COL1"
      , LTRIM('ORAORAORACLEORACLE', 'ORA') "COL2"
      -- CLEORACLE
      , LTRIM('AAAAAAAAAAAAORAORAORACLEORACLE', 'ORA') "COL3"
      -- CLEORACLE
      , LTRIM('ORAoRAORACLEORACLE', 'ORA') "COL4"
      -- oRAORACLEORACLE
      , LTRIM('ORAORA ORACLEORACLE', 'ORA') "COL5"
      -- ORACLEORACLE
      , LTRIM('                   ORACLE', ' ') "COL6"
      -- ORACLE       (공백제거)
      , LTRIM('                   ORACLE') "COL7"
      -- ORACLE       (공백제거, 2번째파라미터 생략)
FROM DUAL;
/*
ORAORAORACLEORACLE	
CLEORACLE	
CLEORACLE	
oRAORACLEORACLE	 
ORACLEORACLE	
ORACLE	
ORACLE
*/
--> 첫 번재 파라미터 값에 해당하는 문자열을 대상으로
--  왼쪽부터 연속적으로 등장하는 두 번째 파라미터 값에서 지정한 글자와
--  같은 글자가 등장할 경우 이를 제거한 결과값을 반환한다.
--  단, 완성형으로 처리되지 않는다.


SELECT LTRIM('이김신이김신이김신이김신신신이김김김이신김신이박이김신', '이김신') "RESULT"
FROM DUAL;
--==>> 박이김신

-- ○ RTRIM()
--> 첫 번재 파라미터 값에 해당하는 문자열을 대상으로
--  오른쪽부터 연속적으로 등장하는 두 번째 파라미터 값에서 지정한 글자와
--  같은 글자가 등장할 경우 이를 제거한 결과값을 반환한다.
--  단, 완성형으로 처리되지 않는다.


-- ○ TRANSLATE()
--> 1:1로 바꿔준다.
SELECT TRANSLATE('MY ORACLE SERVER'
                 , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                , 'abcdefghijklmnopqrstuvwxyz') "RESULT"
FROM DUAL;
--==>> my oracle server

SELECT TRANSLATE('010-4139-4969'
                 , '0123456789'
                 , '영일이삼사오육칠팔구') "RESULT"
FROM DUAL;
--==>> 영일영-사일삼구-사구육구


-- ○ REPLACE()
SELECT REPLACE('MY ORACLE SERVER ORAHOME', 'ORA', '오라') "RESULT"
FROM DUAL;
--==>> MY 오라CLE SERVER 오라HOME
728x90