반응형

1. 무결성에는 개체 무결성(Entity Integrity)

              참조 무결성(Relational Integrity)

              도메인 무결성(Domain Integrity) 이 있다.


2. 개체 무결성

   개체 무결성은 릴레이션에서 저장되는 튜플(tuple)의

   유일성을 보장하기 위한 제약조건이다.

   

3. 참조 무결성

   참조 무결성은 릴레이션 간의 데이터 일관성을

   보장하기 위한 제약조건이다.

   

4. 도메인 무결성

   도메인 무결성은 허용 가능한 값의 범위를

   지정하기 위한 제약조건이다.

  

5. 제약조건의 종류


   1) Primary key(pk:p)

      해당 컬럼의 값은 반드시 존재해야 하며, 유일해야 한다.

      (not null 과 unique 가 결합된 형태)

    

   2) Foreign key(fk:f:r)

      해당 컬럼의 값은 참조되는 테이블의 컬럼 데이터 중 하나와

      일치하거나 null을 가진다.

      

   3) Unique(uk:u)

      테이블 내에서 해당 컬럼의 값은 항상 유일해야 한다.

      

   4) Not null(nn:ck:c)

      해당 컬럼은 null을 포함할 수 없다.

      

   5) Check(ck:c)

      해당 컬럼에 저장 가능한 데이터의 조건이나 값의 범위를 지정한다.


테이블 레벨에서 제약조건 부여  -> 권장!!

컬럼 레벨에서 제약조건 부여

반응형

'Database' 카테고리의 다른 글

[SQL 튜닝] 1. 실행계획(Execution plan)  (2) 2019.04.22
오라클 다중 WHERE조건  (0) 2018.06.25
JOIN (조인)  (0) 2018.01.12
오라클 SQL Developer 2018.01.09  (0) 2018.01.09
오라클 SQL Developer 2018.01.05  (0) 2018.01.09
반응형

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

                        --■■■ JOIN (조인) ■■■--

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

-- 덩치가 큰 테이블은 무겁고 효율적이지 않기 때문에 테이블을 나눈다

-- 나누는 행위를 정규화를 통해 실시함


-- 1. SQL 1992 CODE

SELECT *

FROM EMP;


SELECT *

FROM DEPT;



SELECT *

FROM EMP,DEPT;

--> CROSS JOIN → 수학에서 말하는 데카르트 곱(Cartersian Product)

--  두 테이블을 합친 모든 경우의 수. 자주 사용되지는 않는다.


SELECT COUNT(*)

FROM EMP;

--==>> 14


SELECT COUNT(*)

FROM DEPT;

--==>> 4


SELECT COUNT(*)

FROM EMP,DEPT;

--==>> 56 = 14*4


-- Equi Join : 서로 정확히 같은 것끼리 결합

SELECT *

FROM EMP, DEPT

WHERE EMP.DEPTNO = DEPT.DEPTNO;


SELECT *

FROM EMP E, DEPT D

WHERE E.DEPTNO=D.DEPTNO;

--TABLE명에 별칭을 붙여 사용할 수 있다.


-- Non Equi join : 범위 안에 적합한 것들 끼리 결합

SELECT *

FROM SALGRADE;


SELECT *

FROM EMP;


SELECT *

FROM EMP E, SALGRADE S

WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

--EMP TABLE의 급여가 SALGRADE TABLE의 LOW~HIGH까지의 범위안에 있는 것들만 보여줌



INSERT INTO EMP(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM) 

VALUES(7966,'RAY', 'CLERK', 7839, SYSDATE, 1000, 1000)

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


COMMIT;


-- Equi join 시 (+) 사용방법

SELECT *

FROM EMP E, DEPT D

WHERE E.DEPTNO=D.DEPTNO (+);

--==>>7966 RAY CLERK 7839 2018-01-10 1000 1000



SELECT *

FROM EMP E, DEPT D

WHERE E.DEPTNO(+)=D.DEPTNO;

--==>> 40 OPERATIONS BOSTON



--※ (+) 가 없는 쪽 테이블의 데이터를 모두 먼저 메모리에 퍼올린 후 

--   (+) 가 있는 쪽 테이블의 데이터와 짝을 구성하는 과정을 통해 조회 결과를 종합.


SELECT *

FROM EMP E, DEPT D

WHERE E.DEPTNO(+)=D.DEPTNO(+);

--> 이와 같은 구문은 존재하지 않는다.

--==>>에러발생


--(+)가 없는쪽이 주인공 (+)가 없는 테이블 내용을 다 뿌린다음에 (+) 있는 것을 나열한다

--연결고리가 없을 시에는 NULL로 표시



-- 2. SQL 1999 CODE


-- CROSS JOIN

SELECT *

FROM EMP CROSS JOIN DEPT;



-- INNER JOIN

SELECT *

FROM EMP INNER JOIN DEPT

ON EMP.DEPTNO=DEPT.DEPTNO;


SELECT *

FROM EMP E JOIN DEPT D

ON E.DEPTNO=D.DEPTNO;

-->INNER JOIN의 경우 INNER의 키워드를 생략할 수 있다.

-->기존 조건을 작성하던 WHERE를 ON으로 대체


SELECT *

FROM EMP E JOIN SALGRADE S

ON E.SAL BETWEEN S.LOSAL AND S.HISAL;



-- OUTER JOIN

SELECT *

FROM EMP E LEFT OUTER JOIN DEPT D

ON E.DEPTNO=D.DEPTNO;


--> (+)가 오른쪽에 붙어 있는 결과와 같음


SELECT *

FROM EMP E RIGHT OUTER JOIN DEPT D

ON E.DEPTNO=D.DEPTNO;


--> (+)가 왼쪽에 붙어 있는 결과와 같음


SELECT *

FROM EMP E FULL OUTER JOIN DEPT D

ON E.DEPTNO=D.DEPTNO;


--> (+)를 양쪽에 붙인 결과 새로 생긴 문법 

-- OUTER JOIN도 OUTER 키워드를 생략할 수 있다.


SELECT *

FROM EMP E FULL JOIN DEPT D

ON E.DEPTNO=D.DEPTNO;


-- 위와 같이 조회한 결과에서

-- 직종이 MANAGER와 CLERK만 조회하고자 한다.


SELECT *

FROM EMP E JOIN DEPT D

ON E.DEPTNO=D.DEPTNO

AND JOB IN ('MANAGER','CLERK');

--  쿼리문을 이렇게 구성해도 조회는 가능하지만 권장하지 않는다.


SELECT *

FROM EMP E JOIN DEPT D

ON E.DEPTNO=D.DEPTNO                  -- JOIN(결합) 조건

WHERE JOB IN ('MANAGER','CLERK');     -- 레코드의 선택 조건


--○ 퀴즈

-- EMP 테이블과 DEPT 테이블을 활용하여

-- 직종이 MANAGER와 CLERK인 사원들의 

-- 부서번호, 부서명, 사원명, 직종명, 급여 항목으로 조회한다.

SELECT *

FROM EMP;


SELECT *

FROM DEPT;


--연결고리가 DEPTNO임을 알 수 있음


SELECT D.DEPTNO,D.DNAME,E.ENAME,E.JOB,E.SAL

FROM EMP E JOIN DEPT D

ON E.DEPTNO=D.DEPTNO

AND JOB IN ('MANAGER','CLERK');


--증복 컬럼과 같은 경우는 소속을 명시해주어야 한다.

--소속을 명시해 줄때는 부모 테이블것을 명시해 주어야한다.

--관계형 데이터베이스에서 부모와 자식을 결정짓는 것은 1 : 다 관계이다

--하나가 여럿을 담당하고 있을때 그 하나가 부모이다.


--중복컬럼이 아닌 나머지 컬럼들인 한가지 테이블에 존재하는 것들도 소속을 명시해주는 것이 바람직함

--소속테이블을 명시해주지 않으면 컬럼이 존재하더라도 나머지 테이블도 조회해야 하기 때문에

--리소스 소모가 심하다.



SELECT D.DEPTNO,D.DNAME,E.ENAME,E.JOB,E.SAL

FROM EMP E RIGHT JOIN DEPT D

ON E.DEPTNO=D.DEPTNO;

/*

10 ACCOUNTING CLARK MANAGER 2450

10 ACCOUNTING MILLER CLERK 1300

10 ACCOUNTING KING PRESIDENT 5000

20 RESEARCH JONES MANAGER 2975

20 RESEARCH SMITH CLERK 800

20 RESEARCH SCOTT ANALYST 3000

20 RESEARCH FORD ANALYST 3000

20 RESEARCH ADAMS CLERK 1100

30 SALES WARD SALESMAN 1250

30 SALES TURNER SALESMAN 1500

30 SALES ALLEN SALESMAN 1600

30 SALES JAMES CLERK 950

30 SALES MARTIN SALESMAN 1250

*/

SELECT E.DEPTNO,D.DNAME,E.ENAME,E.JOB,E.SAL

FROM EMP E RIGHT JOIN DEPT D

ON E.DEPTNO=D.DEPTNO;

/*

10 ACCOUNTING CLARK MANAGER 2450

10 ACCOUNTING MILLER CLERK 1300

10 ACCOUNTING KING PRESIDENT 5000

20 RESEARCH JONES MANAGER 2975

20 RESEARCH SMITH CLERK 800

20 RESEARCH SCOTT ANALYST 3000

20 RESEARCH FORD ANALYST 3000

20 RESEARCH ADAMS CLERK 1100

30 SALES WARD SALESMAN 1250

30 SALES TURNER SALESMAN 1500

30 SALES ALLEN SALESMAN 1600

30 SALES JAMES CLERK 950

30 SALES MARTIN SALESMAN 1250

30 SALES BLAKE MANAGER 2850

OPERATIONS

*/


--■■■ SELF JOIN (자기 조인) ■■■--


--○ EMP테이블의 정보를 다음과 같이 조회할 수 있도록 한다.


/*

사원번호   사원명    직종    관리자번호   관리자명    관리자직종명

  7369      SMITH     CLER      7902        FORD        ANALYST

  

*/

SELECT *

FROM EMP;


SELECT E.EMPNO"사원번호",E.ENAME"사원명",E.JOB"직종",E.MGR"관리자번호",EM.ENAME"관리자명",EM.JOB"관리자직종명"

FROM EMP E JOIN EMP EM

ON E.MGR = EM.EMPNO;



/*

  TBL_SAWON 테이블을 대상으로 다음과 같이 조회할 수 있도록 한다

  사원번호, 사원명, 주민번호, 성별, 현재나이, 입사일, 정년퇴직일, 근무일수, 남은일수, 급여, 보너스

  단 현재나이는 한국나이 계산법에 따라 연산을 수행한다.

  또한, 정년퇴직일은 해당 직원의 나이가 한국나이로 60세가 되는 해의 그 직원의 입사 월, 일로 한다.

  그리고 보너스는 1000일 이상 2000일 미만 근무한 사원은 그 사원이 받는 급여의 30%로 하고

  2000일 이상 근무한 사원은 그 사원이 받는 급여의 50%로 한다.

  */


SELECT *

FROM TBL_SAWON;


SELECT SANO "사원번호", SANAME"사원명", JUBUN"주민번호"

    , DECODE(SUBSTR(JUBUN,7,1), '1','남자','4','남자', '여자') "성별"


    , CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1', '2') 

                    THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN, 1, 2)) + 1899)

                    WHEN SUBSTR(JUBUN, 7, 1) IN ('3', '4')

                    THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN, 1, 2)) + 1999)

                    ELSE 0

               END"현재나이"

    , HIREDATE "입사일"

    , TO_CHAR(ADD_MONTHS(SYSDATE,(60-(CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1', '2') 

                    THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN, 1, 2)) + 1899)

                    WHEN SUBSTR(JUBUN, 7, 1) IN ('3', '4')

                    THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN, 1, 2)) + 1999)

                    ELSE 0

               END))*12) ,'YYYY')||'-'||TO_CHAR(HIREDATE,'MM-DD') "정년퇴직일"    

    , TRUNC(SYSDATE - HIREDATE)"근무일수"


    , TRUNC(TO_DATE(TO_CHAR(ADD_MONTHS(SYSDATE,(60-(CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1', '2') 

                    THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN, 1, 2)) + 1899)

                    WHEN SUBSTR(JUBUN, 7, 1) IN ('3', '4')

                    THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN, 1, 2)) + 1999)

                    ELSE 0

               END))*12) ,'YYYY')||'-'||TO_CHAR(HIREDATE,'MM-DD'), 'YYYY-MM-DD') - SYSDATE) "남은일수"

    , SAL"급여"

    , CASE WHEN TRUNC(SYSDATE-HIREDATE)=2000 THEN SAL*0.5

           WHEN TRUNC(SYSDATE-HIREDATE)=1000 THEN SAL*0.3

     ELSE 0

      END "보너스"

FROM TBL_SAWON;


--○ 문제

--  EMPLOYEES, DEPARTMENTS, JOBS, LOCATIONS, COUNTRIES, REGIONS


--  이 6개의 테이블을 대상으로 직원들의 정보를 다음과 같이 조회한다.

--  FIRST_NAME, LAST_NAME, JOB_TITLE, DEPARTMENT_NAME, CITY, COUNTRY_NAME, REGION_NAME



SELECT EM.FIRST_NAME, EM.LAST_NAME, JOBS.JOB_TITLE, DE.DEPARTMENT_NAME, LO.CITY, COUN.COUNTRY_NAME, RE.REGION_NAME

FROM EMPLOYEES EM LEFT JOIN DEPARTMENTS DE

ON EM.DEPARTMENT_ID = DE.DEPARTMENT_ID

  JOIN JOBS

  ON EM.JOB_ID=JOBS.JOB_ID

  LEFT JOIN LOCATIONS LO

  ON DE.LOCATION_ID=LO.LOCATION_ID

  LEFT JOIN COUNTRIES COUN

  ON COUN.COUNTRY_ID=LO.COUNTRY_ID

  LEFT JOIN REGIONS RE

  ON RE.REGION_ID=COUN.REGION_ID

     ;

반응형

'Database' 카테고리의 다른 글

오라클 다중 WHERE조건  (0) 2018.06.25
무결성 (Integrity)  (0) 2018.01.12
오라클 SQL Developer 2018.01.09  (0) 2018.01.09
오라클 SQL Developer 2018.01.05  (0) 2018.01.09
데이터베이스와 DBMS 개요  (0) 2018.01.09
반응형

SELECT USER

FROM DUAL;


--○ TBL_EMP 테이블에서 모든 사원들의 

--   사원번호, 사원명, 급여, 커미션, 연봉 정보를 조회한다.

--   단, 급여(SAL)는 매월 지급한다.

--   수당(COMM)은 1회/년 지급한다.


ALTER TABLE TBL_EMP

ADD MONEY NUMBER(10);


ALTER TABLE TBL_EMP DROP COLUMN MONEY;


SELECT EMPNO 사원번호, ENAME 사원명, SAL 급여, COMM 커미션, (SAL*12)+(COMM) 연봉

FROM TBL_EMP;

--> 이와 같이 연봉을 연산하여 조회할 경우 수당(COMM)이 NULL인 직원들은 연봉까지도 NULL로 연산되는 것을

--  확인 할 수 있다.


SELECT EMPNO 사원번호, ENAME 사원명, SAL 급여, COMM 커미션, (SAL*12) 연봉

FROM TBL_EMP;

--> 그렇다고 수당(COMM)을 연산 대상에서 제외시키거나 

--  0으로 가정하고 연산을 수행할 경우 수당(COMM)이 존재하는 직원들의 연산 결과가 잘못되어 처리된다.


-- ○NVL() 함수


SELECT NULL "①", NVL(NULL,0)"②",NVL(2,0)"③"

FROM DUAL;

--==>> (NULL) 0 2

--> 첫 번째 파라미터 값이 NULL 이면, 두 번째 파라미터 값을 적용한다.

--  첫 번째 파라미터 값이 NULL 이 아니면, 그 값을 그대로 적용한다.


SELECT ENAME, NVL(COMM,0)

FROM TBL_EMP;


SELECT EMPNO 사원번호, ENAME 사원명, SAL 급여, NVL(COMM,0) 커미션, (SAL*12)+(NVL(COMM,0)) 연봉

FROM TBL_EMP;

--==>>

/*

7369 SMITH 800 0 9600

7499 ALLEN 1600 300 19500

7521 WARD 1250 500 15500

7566 JONES 2975 0 35700

7654 MARTIN 1250 1400 16400

7698 BLAKE 2850 0 34200

7782 CLARK 2450 0 29400

7788 SCOTT 3000 0 36000

7839 KING 5000 0 60000

7844 TURNER 1500 0 18000

7876 ADAMS 1100 0 13200

7900 JAMES 950 0 11400

7902 FORD 3000 0 36000

7934 MILLER 1300 0 15600

*/


--○ NVL2()

SELECT NVL2(NULL,10,20)"①" , NVL2(0,10,20)"②"

FROM DUAL;

--==>>20 10


/*

첫 번째 인자 값이 NULL이면 세 번째 인자 값을 반환하고

첫 번째 인자 값이 NULL이 아니면 두번째 인자 값을 반환한다.


즉 COMM이 NULL인 직원들은 10만큼 추가 수당을 지급

이라는 조건이 붙은 상황일때 사용한다.


*/


--○ TBL_EMP 테이블에서 COMM 컬럼의 값이 NULL 이 아니면 3000,

--   NULL이면 4000으로 특별 수당을 지급하는 상황이다.

--   이에 대한 연산 결과를 조회할 수 있도록 한다.

--   사원명 급여, 수당, 특별수당 항목을 조회한다.


SELECT ENAME "사원명", SAL "급여", NVL(COMM,0) "수당", NVL2(COMM,3000,4000) "특별수당"

FROM TBL_EMP;


/*

SMITH 800 0 4000

ALLEN 1600 300 3000

WARD 1250 500 3000

JONES 2975 0 4000

MARTIN 1250 1400 3000

BLAKE 2850 0 4000

CLARK 2450 0 4000

SCOTT 3000 0 4000

KING 5000 0 4000

TURNER 1500 0 3000

ADAMS 1100 0 4000

JAMES 950 0 4000

FORD 3000 0 4000

MILLER 1300 0 4000

*/




--○ TBL_EMP 테이블에서 모든 사원들의 

--   사원번호, 사원명, 급여, 커미션, 연봉 정보를 조회한다.

--   단, 급여(SAL)는 매월 지급한다.

--   수당(COMM)은 1회/년 지급한다.

--   또한, NVL2() 함수를 활용하여 처리한다.


--○ NVL2()를 이용해서 연봉 구하기

--  첫 번째 매개변수가 NULL이면 세번째 매개변수를 반환

--  첫 번재 매개변수가 NULL이 아니면 두 번째 매개변수를 반환


SELECT EMPNO 사원번호, ENAME 사원명, SAL 급여, NVL(COMM,0) 커미션, (SAL*12)+(NVL2(COMM,COMM,0)) 연봉

FROM TBL_EMP;


/*

==========================================

■■■ NVL / NVL2 정리 ■■■

==========================================

-- NVL(매개변수1, 매개변수2)

   매개변수1이 NULL이면 매개변수2를 반환

   매개변수1이 NULL이 아니면 매개변수1을 반환


-- NVL2(매개변수1, 매개변수2, 매개변수3)

   매개변수1이 NULL이면 매개변수3을 반환

   매개변수1이 NULL이 아니면 매개변수2를 반환

*/


--○ COALESCE()  NULL처리 함수

--> 맨 앞부터 차례로 값이 NULL 이 아니면 적용(반환)하고

--  NULL 인 경우에는 다음 파라미터를 확인하는 연산으로 넘어간다.


SELECT COALESCE(NULL,NULL,NULL,NULL,10)"첫 번째 컬럼"

      , COALESCE(10,20,30)"두 번째 컬럼"

FROM DUAL;



-- ※모든 경우의 수를 확인할 수 있다.

-- TBL_EMP 테이블 데이터 수정


UPDATE TBL_EMP 

SET SAL=NULL

WHERE EMPNO=7521;

--==>1행이 업데이트 되었습니다.


SELECT *

FROM TBL_EMP;


COMMIT;

--==>커밋 완료.


--○ TBL_EMP 테이블에서 연봉에 대한 연산 결과가 NULL 이 나오는 경우는

--   급여(SAL)가 NULL, 혹은 수당(COMM)이 NULL, 또는 둘 다 NULL

--   모든 경우를 고려하여 연봉을 조회할 수 있도록 쿼리문을 구성한다.

--   COALESECE() 함수를 사용하여 사원번호, 사원명, 급여, 수당, 연봉을 조회한다.

--   단 연봉은 급여*12+수당 으로 연산처리 한다.


SELECT EMPNO "사원번호", ENAME "사원명", COALESCE(SAL,0) "급여", COALESCE(COMM,0) "수당", COALESCE(SAL*12,0)+COALESCE(COMM,0) "연봉"

FROM TBL_EMP;


SELECT EMPNO "사원번호", ENAME "사원명", COALESCE(SAL,0) "급여", COALESCE(COMM,0) "수당", COALESCE(SAL*12+COMM,SAL*12,COMM,0) "연봉"

FROM TBL_EMP;


--둘 중에 하나가 NULL이라고 가질 수 있는 모든 경우의 수를 생각하여

--하나씩 경우의 수를 풀어나간다.

--즉 SAL*12가 NULL일 경우 / COMM이 NULL일 경우 / 둘다 NULL일 경우를 생각!



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


--※ 날짜에 대한 세션 설정 변경


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

--○ 현재 시간(날짜)을 조회하는 함수

SELECT SYSDATE, CURRENT_DATE, LOCALTIMESTAMP

FROM DUAL;

--사용 빈도는 SYSDATE가 가장 높음

--==>>2018-01-09 10:05:01



--○ 컬럼과 컬럼의 연결(『||』)

SELECT '김선규'||'생선대갈'

FROM DUAL;



SELECT '김선규'||10||SYSDATE

FROM DUAL;

--==>>김선규102018-01-09 10:11:15

--내부적으로 오라클이 형변환을 문자열로 변환해서 문자열끼리 이어주고 출력해줌

--즉 문자열 || 숫자 || 날짜 를

--   문자열 || 문자열 || 문자열 타입으로 변환하여 컬럼끼리 연결해줌


--※ 오라클에서는 문자열로 형 변환의 과정 없이

--   『||』만 넣어주면 간단히 컬럼과 컬럼을 연결하는 것이 가능하다.

--    MSSQL 에서는 모든 문자열을 CONVERT 해야한다.


SELECT *

FROM TBL_EMP;


--○ TBL_EMP 테이블의 정보를 활용하여

--   EX) SMITH의 현재 연봉은 9600인데 희망 연봉은 19200이다.

--       ALLEN의 현재 연봉은 19500인데 희망 연봉은 39000이다.

--   이와 같은 형식으로 조회할 수 있도록 한다.

SELECT ENAME||'의 현재 연봉은'||COALESCE(SAL*12+COMM,SAL*12,COMM,0)||'인데 희망 연봉은'||COALESCE(SAL*12+COMM,SAL*12,COMM,0)*2||'이다.'

FROM TBL_EMP;


DESC TBL_EMP;


ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD';


SELECT ENAME, HIREDATE

FROM TBL_EMP;


SELECT ENAME||'의 입사일은 '||HIREDATE||'입니다. 그리고 급여는 '||NVL(SAL,0)||'입니다.'

FROM TBL_EMP;

/*

SMITH의 입사일은 1980-12-17입니다. 그리고 급여는 800입니다.

ALLEN의 입사일은 1981-02-20입니다. 그리고 급여는 1600입니다.

WARD의 입사일은 1981-02-22입니다. 그리고 급여는 0입니다.

JONES의 입사일은 1981-04-02입니다. 그리고 급여는 2975입니다.

MARTIN의 입사일은 1981-09-28입니다. 그리고 급여는 1250입니다.

BLAKE의 입사일은 1981-05-01입니다. 그리고 급여는 2850입니다.

CLARK의 입사일은 1981-06-09입니다. 그리고 급여는 2450입니다.

SCOTT의 입사일은 1987-07-13입니다. 그리고 급여는 3000입니다.

KING의 입사일은 1981-11-17입니다. 그리고 급여는 5000입니다.

TURNER의 입사일은 1981-09-08입니다. 그리고 급여는 1500입니다.

ADAMS의 입사일은 1987-07-13입니다. 그리고 급여는 1100입니다.

JAMES의 입사일은 1981-12-03입니다. 그리고 급여는 950입니다.

FORD의 입사일은 1981-12-03입니다. 그리고 급여는 3000입니다.

MILLER의 입사일은 1982-01-23입니다. 그리고 급여는 1300입니다.

*/



/*

SMITH'S 입사일은 1980-12-17입니다. 그리고 급여는 800입니다.

ALLEN'S 입사일은 1981-02-20입니다. 그리고 급여는 1600입니다.

WARD'S 입사일은 1981-02-22입니다. 그리고 급여는 0입니다.

                      :

와 같이 출력하라.

*/


SELECT ENAME||'''s 입사일은 '||HIREDATE||'입니다. 그리고 급여는 '||NVL(SAL,0)||'입니다.'

FROM TBL_EMP;


--※ 오라클은 문자열 영역 안에서 『'』(홑따옴표) 두개가 하나를 표현하는 구조로 기능한다.


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


--○ 오라클에서 데이터의 값 만큼은 반드시 대소문자 구분을 엄격하게 처리한다.



SELECT EMPnO, EnAME, joB

FROM Tbl_EmP

WHERE job='CLERK';

/*

7369 SMITH CLERK

7876 ADAMS CLERK

7900 JAMES CLERK

7934 MILLER CLERK

*/


SELECT EMPnO, EnAME, joB

FROM Tbl_EmP

WHERE job='CLerk';

--==>>조회 결과 없음



--○ UPPER() , LOWER(), INITCAP() 첫글자만 대문자로 처리


SELECT 'oRAcLE',UPPER('oRAcLE'),LOWER('oRAcLE'),INITCAP('oRAcLE')

FROM DUAL;


--주로 WHERE조건절에서 사용되곤 한다


SELECT EMPnO, EnAME, joB

FROM Tbl_EmP

WHERE UPPER(job)=UPPER('CLerk');



SELECT EMPnO, EnAME, joB

FROM Tbl_EmP

WHERE LOWER(job)=LOWER('CLerk');


SELECT EMPnO, EnAME, joB

FROM Tbl_EmP

WHERE INITCAP(job)=INITCAP('CLerk');



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

--○ TBL_EMP테이블에서 입사일이 1981년 9월 28일 입사한 직원의

--   사원명, 직종명, 입사일 항목을 조회한다.


SELECT ENAME "사원명",JOB "직종명",HIREDATE "입사일"

FROM TBL_EMP

WHERE HIREDATE='1981-09-28';

--==>>MARTIN SALESMAN 1981-09-28

--상황에 따라 여건에 따라 형변환이 달라지기 때문에 믿으면 안된다

--따라서 이러한 쿼리문은 잘못된 것이다.


DESC TBL_EMP;

--==>>HIREDATE   DATE         


SELECT ENAME "사원명",JOB "직종명",HIREDATE "입사일"

FROM TBL_EMP

WHERE HIREDATE=TO_DATE('1981-09-28','YYYY-MM-DD');


--'1981-09-28' -> '1981-09-28'의 문자열

--TO_DATE('1981-09-28','YYYY-MM-DD')안에 넣어주면 -> 1981년 9월 28일이라는 날짜형


--'2018-01-09 10:47:10' -> '2018-01-09 10:47:10'의 문자열

-- TO_DATE('2018-01-09 10:47:10','YYYY-MM-DD HH24:MI;SS') -> 2018년 1월 9일 10시 47분 10초라는 날짜형


--○ TBL_EMP 테이블에서 입사잉ㄹ이 1981년 9월 28일 이후로 입사한 직원의

--   사원번호 직원명 입사일 항목을 조회한다.


SELECT EMPNO, ENAME, HIREDATE

FROM TBL_EMP

WHERE HIREDATE>=TO_DATE('1981-09-28','YYYY-MM-DD');


--○ TBL_EMP 테이블에서 입사일이 1981년 4월 2일부터 1981년 9월 28일 사이에 입사한 직원의

--   사원번호, 사원명, 입사일 항목을 조회한다.


SELECT EMPNO, ENAME, HIREDATE

FROM TBL_EMP

WHERE HIREDATE>=TO_DATE('1981-04-02','YYYY-MM-DD') AND HIREDATE<=TO_DATE('1981-09-28','YYYY-MM-DD');


--○ 컬럼명 BETWEEN a(조건) AND b(조건)

--   숫자 / 문자 에도 통용된다!

SELECT EMPNO, ENAME, HIREDATE

FROM TBL_EMP

WHERE HIREDATE BETWEEN TO_DATE('1981-04-02','YYYY-MM-DD') AND TO_DATE('1981-09-28','YYYY-MM-DD');

/*

7566 JONES 1981-04-02

7654 MARTIN 1981-09-28

7698 BLAKE 1981-05-01

7782 CLARK 1981-06-09

7844 TURNER 1981-09-08

*/

SELECT *

FROM TBL_EMP

WHERE SAL BETWEEN 2000 AND 3000;

/*

7566 JONES MANAGER 7839 1981-04-02 2975 20

7698 BLAKE MANAGER 7839 1981-05-01 2850 30

7782 CLARK MANAGER 7839 1981-06-09 2450 10

7788 SCOTT ANALYST 7566 1987-07-13 3000 20

7902 FORD ANALYST 7566 1981-12-03 3000 20

*/


SELECT *

FROM TBL_EMP

WHERE ENAME BETWEEN 'C' AND 'S';

-->S까지만 검색을한다 

-- 그래서 SCOTT등은 검색이 안됨. 이름이 S이면 거기까지 검색이된다

-- 왜냐하면 사전식배열이기 때문이다.

-- 내부적으로는 ASCII코드 기반으로 변환되기 때문에 대소문자도 주의해야한다.


/* 

※ BETWEEN a AND b 는 날짜, 숫자, 문자 모두에 적용된다

   하지만 문자일 경우 아스키 코드 순서를 따르기 때문에 대문자가 앞에 있고 

   소문자가 뒤에있다는 배열과정의 순서를 주의해야 한다.

   또한, BETWEEN a AND b는 수행되는 시점에서 오라클 내부적으로는

   부등호 연산자의 형태로 바뀌어 연산된다.

   마지막으로 문자일 경우 사전식 배열과정의 순서를 주의해야한다.

*/

SELECT *

FROM TBL_EMP;

/*

7566 JONES MANAGER 7839 1981-04-02 2975 20

7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30

7782 CLARK MANAGER 7839 1981-06-09 2450 10

7839 KING PRESIDENT 1981-11-17 5000 10

7900 JAMES CLERK 7698 1981-12-03 950 30

7902 FORD ANALYST 7566 1981-12-03 3000 20

7934 MILLER CLERK 7782 1982-01-23 1300 10

*/



--○ ASCII()

SELECT ASCII('A'), ASCII('Z'), ASCII('a'), ASCII('z')

FROM DUAL;

--==>>65 90 97 122


--○ TBL_EMP 테이블에서 직종이 SALESMAN과 CLERK인 사원의

--   사원명 직종명, 급여 항목을 조회한다.


SELECT ENAME, JOB , SAL

FROM TBL_EMP

WHERE JOB ='SALESMAN' OR JOB='CLERK';


SELECT ENAME, JOB , SAL

FROM TBL_EMP

WHERE JOB IN('SALESMAN'  ,'CLERK');



SELECT ENAME, JOB , SAL

FROM TBL_EMP

WHERE JOB =ANY('SALESMAN'  ,'CLERK');

--  =ANY는 OR연산자와 같다.

--  =ALL은 AND연산자와 같음.


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


--○ 테이블 생성(TBL_SAWON)


CREATE TABLE TBL_SAWON

( SANO      NUMBER(4) PRIMARY KEY

, SANAME    VARCHAR2(40)

, JUBUN     CHAR(13)

, HIREDATE  DATE DEFAULT SYSDATE  --자동으로 현재 시간을 입력

, SAL       NUMBER    --길이를 명시하지 않으면 숫자표현의 최대값 사용

);

--CHAR를 단위를 쓰지 않고 표현하면 문자의 최소값 즉 1개만 사용

--CHAR에서 최대값을 쓰려면 CHAR(2000)이라 써야함

--즉 NUMBER와 CHAR 매개변수를 생략하면 의미가 반대가 된다.

--==>>Table TBL_SAWON이(가) 생성되었습니다.


--○데이터 입력

INSERT INTO TBL_SAWON VALUES(1001, '명소희', '9302272234567', TO_DATE('2017-03-02','YYYY-MM-DD'), 4000000);

INSERT INTO TBL_SAWON VALUES(1002, '임미영', '9310092234567', TO_DATE('2017-03-02','YYYY-MM-DD'), 4000000);

INSERT INTO TBL_SAWON VALUES(1003, '조태희', '9010271234567', TO_DATE('2017-03-02','YYYY-MM-DD'), 4000000);

INSERT INTO TBL_SAWON VALUES(1004, '김선규', '9202231234567', TO_DATE('2017-11-13','YYYY-MM-DD'), 4000000);

INSERT INTO TBL_SAWON VALUES(1005, '서운성', '9307151234567', TO_DATE('2017-11-13','YYYY-MM-DD'), 4000000);

INSERT INTO TBL_SAWON VALUES(1006, '박기범', '9002271234567', TO_DATE('2017-11-13','YYYY-MM-DD'), 4000000);

INSERT INTO TBL_SAWON VALUES(1007, '최진규', '9105071234567', TO_DATE('2017-11-13','YYYY-MM-DD'), 4000000);

INSERT INTO TBL_SAWON VALUES(1008, '김준협', '9212101234567', TO_DATE('2017-11-13','YYYY-MM-DD'), 4000000);

INSERT INTO TBL_SAWON VALUES(1009, '정승우', '9304211234567', TO_DATE('2017-11-13','YYYY-MM-DD'), 4000000);

INSERT INTO TBL_SAWON VALUES(1010, '오승우', '9112271234567', TO_DATE('2017-11-13','YYYY-MM-DD'), 4000000);

INSERT INTO TBL_SAWON VALUES(1011, '선동렬', '0212273234567', TO_DATE('2018-01-02','YYYY-MM-DD'), 2000000);

INSERT INTO TBL_SAWON VALUES(1012, '선우용녀', '0301024234567', TO_DATE('2018-01-02','YYYY-MM-DD'), 2000000);

INSERT INTO TBL_SAWON VALUES(1013, '선우선', '0405064234567', TO_DATE('2018-01-02','YYYY-MM-DD'), 2000000);

INSERT INTO TBL_SAWON VALUES(1014, '스윙스', '0505053234567', TO_DATE('2018-01-02','YYYY-MM-DD'), 2000000);


SELECT *

FROM TBL_SAWON;


COMMIT;

--==>>커밋 완료.


--○ TBL_SAWON 테이블에 존재하는 『최진규』사원의 정보를 조회한다.


SELECT *

FROM TBL_SAWON

WHERE SANAME='최진규';

--==>>1007 최진규 9105071234567 17/11/13 4000000

SELECT *

FROM TBL_SAWON

WHERE SANAME LIKE '최진규';


--※ LIKE 동사 : 좋아하다

--        부사 : ~~처럼 / ~~와 같이


--※ WILD CHARACTER --> 『%』

--   『LIKE』 키워드와 함께 사용되는 『%』 는 모든 글자를 의미하고

--   『LIKE』 키워드와 함께 사용되는 『_』 는 아무 글자 1개를 의미한다.


--○ TBL_SAWON 테이블에서 성이 『김』씨인 사원들의

--   사원명, 주민번호, 급여를 조회한다.


SELECT SANAME, JUBUN, SAL

FROM TBL_SAWON

WHERE SANAME = '김';

--==>> 조회결과 없음


SELECT SANAME, JUBUN, SAL

FROM TBL_SAWON

WHERE SANAME = '김__';

--> 이름이 김__인 사원을 찾아라 존재하지 않음!


SELECT SANAME, JUBUN, SAL

FROM TBL_SAWON

WHERE SANAME LIKE '김__';

--> 김 ㅇ ㅇ 이름이 총 3글자인 사원만 검색된다

--==>>김선규 9202231234567 4000000

--==>>김준협 9212101234567 4000000


SELECT SANAME, JUBUN, SAL

FROM TBL_SAWON

WHERE SANAME LIKE '김%';

--> 김 ~~ 인 김씨인 모든 사원이 검색된다(글자수 제한이 없음) 김 도 찾아짐

--==>>김선규 9202231234567 4000000

--==>>김준협 9212101234567 4000000


--○ TBL_SAWON 테이블에서 이름이 『승우』인 사원의

--   사원명, 주민번호, 급여 항목을 조회한다.

SELECT SANAME, JUBUN, SAL

FROM TBL_SAWON

WHERE SANAME LIKE '%승우';



--○ TBL_SAWON 테이블에서 이름의 두 번째 글자가 『선』인 사원의

--   사원명, 주민번호, 급여 항목을 조회한다.

SELECT SANAME, JUBUN, SAL

FROM TBL_SAWON

WHERE SANAME LIKE '_선%';



--○ TBL_SAWON 테이블에서 이름에서 성이 『선』인 사원의

--   사원명, 주민번호, 급여 항목을 조회한다.


/*

=========================================================

                ■■■■ 결론 ■■■■

=========================================================

결론부터 말하면 불가능하다.

※ 데이터베이스 설계 시 성과 이름을 분리해서 처리해야 할 업무 계획이 있다면

테이블 구성(생성) 과정에서 성 컬럼과 이름 컬럼을 분리하여 구성해야 한다!

*/



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

SELECT SANAME, JUBUN, SAL

FROM TBL_SAWON

WHERE JUBUN LIKE '______2%' OR JUBUN LIKE '______4%';



SELECT SANAME, JUBUN, SAL

FROM TBL_SAWON

WHERE SUBSTR(JUBUN,7,1) LIKE '2' OR SUBSTR(JUBUN,7,1) LIKE '4';


--○ 테이블 생성

CREATE TABLE TBL_WATCH

( WATCHNAME   VARCHAR2(40)

, BIGO        VARCHAR2(100)

);

--==>>Table TBL_WATCH이(가) 생성되었습니다.


INSERT INTO TBL_WATCH VALUES('금시계', '순금 99.9% 함유된 최고급 시계');

INSERT INTO TBL_WATCH VALUES('은시계', '고객 만족도 99.99점 획득 시계');

--==>>2 행 이(가) 삽입되었습니다

--○ 커밋

COMMIT;



UPDATE TBL_WATCH

SET BIGO='순금 99.99% 함유된 최고급 시계'

WHERE BIGO='순금 99.9% 함유된 최고급 시계';


--○ TBL_WATCH 테이블의 BIGO(비고) 컬럼에 

--   『99.99%』라는 글자가 들어있는 행의 정보를 조회한다.

SELECT *

FROM TBL_WATCH

WHERE BIGO LIKE'%99.99%%';

-->쿼리문에 사용한 모든 %를 WILD CHARACTER로 인식하기 때문에

-- 원하는 결과를 얻을 수 없는 상황이다.

-- 즉, BIGO 컬럼의 데이터 중 문자열에 99.99가 포함된 행의 정보 조회



SELECT *

FROM TBL_WATCH

WHERE BIGO LIKE '%99.99/%%' ESCAPE '/';


SELECT *

FROM TBL_WATCH

WHERE BIGO LIKE '%99.99#%%' ESCAPE '#';



--※ ESCAPE로 설정한 문자는 와일드 캐릭터에서 탈출시켜라!

--   즉 탈출시키고 싶은 문자 앞에 붙인다!

--   일반적으로 ESCAPE로 설정하는 한 문자는 

--   사용 빈도가 비교적 적은 특수문자로 설정한다!




--■■■ 정렬(ORDER BY) ■■■--

/*

FROM

WHERE

GROUP BY

HAVING

SELECT

ORDER BY

순으로 파싱이 일어남


ORDER BY는 리소스 소모가 크므로 사용할 때 주의해야 한다.

ASC : 오름차순(DEFAULT 값이므로 생략가능)

DESC : 내림차순(생략 불가능)

*/


SELECT ENAME"사원명",DEPTNO"부서번호",JOB"직종",SAL"급여",

       (SAL*12)+NVL(COMM,0)"연봉"

FROM EMP;



SELECT ENAME"사원명",DEPTNO"부서번호",JOB"직종",SAL"급여",

       (SAL*12)+NVL(COMM,0)"연봉"

FROM EMP

ORDER BY DEPTNO ASC;   -- 정렬 기준 컬럼 : DEPTNO(부서번호)

                       -- ASC : 오름차순(생략가능 DEFAULT 값) 

SELECT ENAME"사원명",DEPTNO"부서번호",JOB"직종",SAL"급여",

       (SAL*12)+NVL(COMM,0)"연봉"

FROM EMP

ORDER BY DEPTNO DESC;  -- DESC : 내림차순



DESC EMP; --DESC는 위치가 어디에 쓰이는 지에 따라 다르게 사용된다.


SELECT ENAME"사원명",DEPTNO"부서번호",JOB"직종",SAL"급여",

       (SAL*12)+NVL(COMM,0)"연봉"

FROM EMP

ORDER BY 부서번호 DESC;  -- DESC : 내림차순


SELECT ENAME"사원명",DEPTNO"부서번호",JOB"직종",SAL"급여",

       (SAL*12)+NVL(COMM,0)"연봉"

FROM EMP

ORDER BY 2 DESC;  -- 2번째 컬럼을 의미(부서번호) 오라클은 1부터 시작

                  --※ 테이블을 구성하는 컬럼 순서가 아닌 

                  --   SELCET문에서의 2번째 컬럼을 의미한다

                  

--> ORDER BY절보다 SELECT가 먼저 실행되기 때문에

--  컬럼명 대신 ALIAS(별칭)을 사용하는 것도 가능하고,

--  SELECT 되는 컬럼의 순서를 사용하는 것도 가능하다.


SELECT ENAME"사원명",DEPTNO"부서번호",JOB"직종",SAL"급여",

       (SAL*12)+NVL(COMM,0)"연봉"

FROM EMP

ORDER BY 2,4;

--> 부서번호 내에서 급여가 오름차순 정렬


SELECT ENAME, DEPTNO, JOB,SAL

FROM EMP

ORDER BY 2,3,4 DESC;

--> DESC가 적용되는 것은 4번째 컬럼만 적용된다

--> 부서번호별 오름차순 -> 직종별 오름차순 -> 급여별 내림차순


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

            ---■■■ 문자열 처리 함수 ■■■---

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


--○ CONCAT()

-->  2개의 문자열을 연결하는 기능을 가진 함수(문자열 결합 함수)

--   단, 오직 두 개만 연결할 수 있다.


SELECT ENAME||JOB , CONCAT(ENAME,JOB)

FROM EMP;


SELECT CONCAT(CONCAT(ENAME,JOB),SAL)

FROM EMP;


--> 파이프와 마찬가지로 내부적인 형 변환이 일어나서 연결시켜준다.

--  CONCAT()은 문자열과 문자열을 연결하는 기능을 가진 함수이지만,

--  내부적으로 숫자나 날짜를 문자로 바꾸는 과정이 포함되어 있는 것이다.


--○ SUBSTR()

--> 문자열을 추출하는 기능을 가진 함수

--  첫 번째 파라미터 값은 대상 문자열(추출의 대상)

--  두 번째 파라미터 값은 추출을 시작하는 위치(1번째 인덱스부터 시작)

--  세 번째 파라미터 값은 추출할 문자열의 갯수

--  생략이 가능하며, 생략시 시작 위치부터 해당 문자열의 길이만큼! 추출한다)


SELECT ENAME, SUBSTR(ENAME,1,2)

FROM EMP;


--○ SUBSTRB()

--   바이트로 끊어서 문자열을 추출하는 함수

--   한글은 2바이트 이므로 주의해야한다!

--   인코딩 방식에도 주의할 것!!


SELECT SANAME, SUBSTRB(SANAME,1,2), SUBSTRB(SANAME,1,3)

FROM TBL_SAWON;


SELECT PARAMETER, VALUE

FROM SYS.NLS_DATABASE_PARAMETERS

WHERE PARAMETER = 'NLS_CHARACTERSET';

--==>>NLS_CHARACTERSET AL32UTF8

--기본적으로 사용하는 것은 UTF8


SELECT *

FROM TBL_SAWON;

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


SELECT SANAME, JUBUN, SAL

FROM TBL_SAWON

WHERE SUBSTR(JUBUN,7,1)='1' OR SUBSTR(JUBUN,7,1)='3';

--> SUBSTR은 문자열을 추출하는 것이므로 비교 대상도 문자열이여야지 정확하다!

--> 문자열 처리를 안해도 같은 값이 나오는 것은 자동 형변환때문


SELECT SANAME, JUBUN, SAL

FROM TBL_SAWON

WHERE SUBSTR(JUBUN,7,1) IN ('1','3');


--○ LENGTH(), LENGTHB()

SELECT LENGTH(ENAME), LENGTHB(ENAME)

FROM EMP;


--○ INSTR()

--> 첫 번재 파라미터 값에 해당하는 문자열에서(대상 문자열)

--  두 번째 파라미터 값에서 정의한 문자열이 등장하는 위치를 검색

--  세 번재 파라미터 값은 스캔을 시작하는 위치

--  네 번째 파라미터 값은 몇 번째 등장하는 지를 결정(1일때는 생략가능)


SELECT INSTR('oracle orahome biora','ora',1,1) --첫문자부터에서 1번째 ora가 등장하는 위치

      ,INSTR('oracle orahome biora','ora',1,2) --첫문자부터에서 2번째 ora가 등장하는 위치

      ,INSTR('oracle orahome biora','ora',2,1) --두번째문자에서 1번째 ora가 등장하는 위치

      ,INSTR('oracle orahome biora','ora',2)   --두번째문자에서 1번째 ora가 등장하는 위치(1은 생략 가능)

      ,INSTR('oracle orahome biora','ora',2,2) --두번째문자에서 2번째 ora가 등장하는 위치 문자열 처음부터 스캔한 값을 반환

FROM DUAL;



SELECT INSTR('나의 오라클 집으로오라 합니다','오라',1) --첫문자부터에서 1번째 ora가 등장하는 위치

      ,INSTR('나의 오라클 집으로오라 합니다','오라',2) --첫문자부터에서 2번째 ora가 등장하는 위치

      ,INSTR('나의 오라클 집으로오라 합니다','오라',10) --두번째문자에서 1번째 ora가 등장하는 위치

      ,INSTR('나의 오라클 집으로오라 합니다','오라',11)   --두번째문자에서 1번째 ora가 등장하는 위치(1은 생략 가능)

      ,INSTR('나의 오라클 집으로오라 합니다','오라',12) --두번째문자에서 2번째 ora가 등장하는 위치 문자열 처음부터 스캔한 값을 반환

FROM DUAL;


--> 한글과 상관없이 문자열 위치 기반으로 반환


-- INSTAR('대상문자열','찾을문자열',검색시작위치,몇 번째 등장하는지)


--○ REVERSE()

-- 문자열을 거꾸로 처리한 결과값을 반환한다.

-- 단, 한글은 사용할 수 없다.

SELECT 'ORACLE', REVERSE('ORACLE')

FROM DUAL;


SELECT '오라클', REVERSE('오라클')

FROM DUAL;

-->비트 연산 기반이므로 한글은 처리가 되지 않음.



/*

테이블명 : TBL_FILES

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

FILENO                   FILENAME

1                         C:\AAA\BBB\CCC\SALES.XXLS

2                         C:\AAA\STUDY.HWP

3                         C:\RESEARCH\WORK\WORK.TXT

4                         C:\TEST.PPTX

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


조회 결과


파일 번호       파일명

1               SALES.XXLS

2               STUDY.HWP

3               WORK.TXT

4               TEST.PPTX

*/



CREATE TABLE TBL_FILES

( FILENO      NUMBER

, FILENAME    VARCHAR2(100)

);



INSERT INTO TBL_FILES VALUES(1,'C:\AAA\BBB\CCC\SALES.XXLS');

INSERT INTO TBL_FILES VALUES(2,'C:\AAA\STUDY.HWP');

INSERT INTO TBL_FILES VALUES(3,'C:\RESEARCH\WORK\WORK.TXT');

INSERT INTO TBL_FILES VALUES(4,'C:\TEST.PPTX');


COMMIT;


--내 풀이

SELECT FILENO "파일번호", REVERSE(SUBSTR(REVERSE(FILENAME),1,INSTR(REVERSE(FILENAME),'\',1)-1)) "파일 명"

FROM TBL_FILES;



SELECT FILENO "파일번호", REVERSE(FILENAME)"거꾸로된 파일명"

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

FROM TBL_FILES;




--○ LPAD(), RPAD()

-->  BYTE 수를 확보하여 왼쪽(오른쪽)부터 문자열로 채우는 기능을 가진 함수

SELECT 'ORACLE', LPAD('ORACLE',10,'*')

FROM DUAL;

--① 10BYTE 공간을 확보한다.( 두 번재 파라미터 값에 의해)

--② 확보한 공간에 'ORACLE'(첫번째 파라미터 값) 문자열을 담는다.

--③ 남아있는 BYTE 공간에 왼쪽부터(오른족부터) '*'(세번째 파라미터 값)로 채운다.


SELECT 'ORACLE', RPAD('ORACLE',10,'*')

FROM DUAL;

--==>>ORACLE ORACLE****


--○ LTRIM(), RTRIM()

SELECT 'ORAORAORACLEORACLE'

      , LTRIM('ORAORAORACLEORACLE','ORA')

      , LTRIM('ORAoRAORACLEORACLE','ORA')

      , LTRIM('ORAARAORACLEORACLE','ORA')

      , LTRIM('ORA ORAORACLEORACLE','ORA')

FROM DUAL;

--==>>ORAORAORACLEORACLE CLEORACLE oRAORACLEORACLE CLEORACLE ORAORACLEORACLE

--> 첫 번째 파라미터값에 해당하는 문자열을 대상으로

--  왼쪽부터(오른쪽부터) 연속적으로 두 번재 인자값과

--  같은 글자가 등장할 경우 제거한다.

--  완성형으로 처리되지 않는다. O 또는 R 또는 A가 있으면 잘라낸다.

--  실무적으로 공백을 제거할 대 많이 사용된다.


--○ TRANSLATE()

--   1 : 1로 바꿔준다!!

--   첫번째 매개변수에 대해 두번째 매개변수에 해당하는 순서에 맞게 세번째 매개변수로 바꿔준다(1:1)로

--   두번재 매개변수에 존재하지 않으면 바꾸지 않는다.


SELECT TRANSLATE('MY ORACLE SERVER', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')

FROM DUAL;

--==>>my oracle server


SELECT '010-2546-5187', TRANSLATE('010-2546-5187','0123456789','공일이삼사오육칠팔구')

FROM DUAL;

--==>>010-2546-5187 공일공-이오사육-오일팔칠



--○ REPLACE()

--   TRANSLATE와 다르게 뭉텅이로 바꿔주는 구조

--   일대일로 치환하지 않는다. 즉 완성형으로 처리

SELECT REPLACE('MY ORACLE SERVER','ORA','오라')

FROM DUAL;

--   대소문자 구분을 명확히 하며, 완성형으로 처리된다.

--   1 : 1로 사상되는 TRANSLATE() 함수와 비교해서 정리하자!



--■■■ 숫자형 함수 ■■■--


--○ ROUND()

-->  반올림을 처리하는 함수

-- 첫번째 인자값은 반올림할 숫자

-- 두번재 인자값은 표현할 자릿수!

--> 두번째 인자값이 2이면 소수점 2번째 자리까지 표현하라! -> 3번째에서 반올림

SELECT 48.678, ROUND(48.678,2)

              ,ROUND(48.678,0)  --정수부까지 표현 0은 생략가능!!

              ,ROUND(48.678)    --정수부까지 표현

              ,ROUND(48.678,-1) --10의자리까지 유효한 숫자를 표현

              ,ROUND(48.678,-2) --100의자리까지 유효한 숫자를 표현

FROM DUAL;


--○ TRUNC()

-->  절삭하는 함수


SELECT 48.678, TRUNC(48.678,2)

              ,TRUNC(48.678,0)

              ,TRUNC(48.678,-1)

FROM DUAL;


--○ MOD() 나머지 연산자(%)

SELECT MOD(5,2)   --5를 2로 나눈 나머지

FROM DUAL;

--==>1



--○ POWER() 제곱(^)

SELECT POWER(5,3)   --5^3

FROM DUAL;



--○ SQRT() 루트

SELECT SQRT(2)    --ROOT 2

FROM DUAL;



--○ LOG() 로그 함수 --> 오라클은 상용로그만 지원

--MSSQL은 자연로그까지 지원

SELECT LOG(2,100)

FROM DUAL;


--○ 삼각함수

--SIN(), COS(), TAN()

SELECT SIN(1), COS(1), TAN(1)

FROM DUAL;


--○ 삼각함수의 역함수(범위 : -1 ~ 1 )

SELECT ASIN(0.5),ACOS(0.5),ATAN(0.5)

FROM DUAL;


--○ SIGN() 부호, 서명, 특징

--> 연산 처리에 대한 결과값이 양수이면 1, 0이면 0, 음수이면 01을 반환한다.

SELECT SIGN(5-2), SIGN(5-5), SIGN(2-5)

FROM DUAL;


--○ ASCII(), CHR()

-- CHR은 아스키코드값을 문자로 반환해줌

SELECT ASCII('A'), CHR(65)

FROM DUAL;

--==>>65 A

--결과값에서 오른쪽 정렬이면 숫자

--결과값에서 왼쪽 정렬이면 문자


--■■■ 날짜 연산 ■■■--


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

--==>>Session이(가) 변경되었습니다.


--※ 날짜연산의 기본단위는 DAY(일수)이다.

-- (2018-01-09 16:48:27) + 2  더하면 기본적으로 날자에 더해야한다


SELECT SYSDATE, SYSDATE+1 , SYSDATE-2

FROM DUAL;

--==>>2018-01-09 16:50:01  2018-01-10 16:49:40 2018-01-07 16:49:40


--시간 단위 연산

SELECT SYSDATE, SYSDATE+1/24, SYSDATE-2/24

FROM DUAL;

--==>>2018-01-09 16:50:41 2018-01-09 17:50:41 2018-01-09 14:50:41



--○ 문제

/*

  현재 시간과, 1일 2시간 3분 4초 후를 조회(출력)한다.

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

         현재 시간        |          연산 후 시간

    2018-01-09 16:50:41       2018-01-10 18:53:40


*/


SELECT SYSDATE "현재 시간", SYSDATE+1+2/24+3/(24*60)+4/(24*60*60)

FROM DUAL;




COMMIT;














반응형

'Database' 카테고리의 다른 글

오라클 다중 WHERE조건  (0) 2018.06.25
무결성 (Integrity)  (0) 2018.01.12
JOIN (조인)  (0) 2018.01.12
오라클 SQL Developer 2018.01.05  (0) 2018.01.09
데이터베이스와 DBMS 개요  (0) 2018.01.09

+ Recent posts