DB/Oracle

OracleDB4_ DUAL테이블, 문자조작함수, 숫자조작함수, 날짜조작함수, 데이터타입변환, NVL함수

Codezoy 2019. 9. 17. 22:49


Goals
Oracle 함수 --> 고급 쿼리
관계형 데이터베이스 배우기 전 예제, 함수, 단일 행 함수와 여러 행 함수

<단일 행 함수>

  • 더미 테이블 : DUAL ( 듀얼 )
  • UPPER / LOWER / INITCAP
  • 문자 조작 함수 :  CONCAT, SUBSTR, LENGTH, INSTR, LPAD, RPAD, REPLACE, TRIM
  • 숫자 함수 : ROUND, TRUNC, MOD, CEIL, FLOOR
  • 날짜 조작 함수 :  SYSDATE, ADD_MONTHS, MONTHS_BETWEEN, ROUND, TRUNC
  • 데이터 타입 변환 함수 : TO_NUMBER ( 1,000 , '9,999'), TO_CHAR ( SYSDATE, '원하는 YYMMDD 표시형식' ), TO_DATE ( 문자열, 문자열의 날짜형식)
  • NVL 함수(NULL값 제거), NEXT_DAY



Notes

table--> 열 : desc 명령어의 내용을 보여줌.
        --> 데이터 : select * from table 내용을 보여줌.




Ctrl + Enter : 문장 하나만 실행
F5 : 스크립트 전체 실행







SQL 워크시트 만들기
도구 -> 워크시트 만들기    (Alt + F10)






가로줄 / 세로줄
● DBMS:                                                                                    records / fields
● 통계:                                                                 observations(관측치) / variables(변수)
● Data-mining, Machine-learning:                               examples(예제) / attributes(특성)

                                                                       가로줄(행) : 개별 데이터 / 세로줄(열) : 분류
                                                                                                 Row       /      Column








데이터 검색

(1) 컬럼 별로 검색 - 프로젝션 (projection)

(2) 행 별로 검색 - 셀렉션 (selection)


>> 컬럼별 검색하기(projection)

     select 컬럼이름 1, 컬럼이름 2, ... from 테이블이름;


-- 사원 테이블(emp)에서 사번(empno)과 사원이름(ename)을 검색

    select empno, ename from emp;

--> 나열 순서는 관계 없음. 출력 순서가 바뀐다.


-- 테이블에서 모든 컬럼을 검색 :  select *

     select * from emp;

-- 컬럼 이름을 변경하기 (별명) :   AS

     select  컬럼이름 as 별명이름, ... from 테이블이름;

     select empno as employeenumber, ename as employname from emp;




-- 월급을 연봉으로 바꿔주자 : select 칼럼 * 숫자

-- Null 을 처리하는 방법 --> 나중에 설명?

-- 중복된 행을 제거하고 검색 : select distinct 칼럼 from ~ ,
                                                  distinct의 범위는 select의 대상 컬럼 전체그룹(&&조건).
                                                   (a, b) 가 쌍으로 달라야만 distinct 한 것.
                                                  개별적으로 적용 불가능. (논리상)







>> 행별로 검색하기(selection)

     
      조건에 맞는 레코드를 검색하는 방법. >>  Where

     SELECT 컬럼이름, … FROM 테이블이름 WHERE 조건;

     같다에 '등호 하나'
     

         AND
         SELECT * from emp WHERE sal>=1000 and sal<2000;

         BETWEEN --> 앞(최소값) 뒤(최대값) 숫자 모두 포함
         SELECT * FROM emp
         WHERE sal BETWEEN 3000 AND 5000;   ==    SELECT * FROM emp WHERE sal>=3000 AND sal<=5000;

         IN : 괄호 안의 숫자 들 중 하나이면 TRUE, 3개 이상 숫자, 문자 포함 가능
         SELECT * FROM emp WHERE deptno = 10 OR  deptno = 20;
         SELECT * FROM emp WHERE deptno IN (10,20);

         SELECT * FROM emp WHERE deptno != 10;
         SELECT * FROM emp WHERE deptno NOT IN (10);
         SELECT * FROM emp WHERE NOT deptno = 10;

        오라클에서 다르다 : !=,  <>, ^=

         SELECT * FROM emp WHERE job = 'CLERK';              -->     문자열 : ""따옴표로 묶어 주어야.

     >> Oracle에서 예약어(select, from, where, update ..) 테이블 이름, 칼럼 이름은 대/소문자 구분 X, 데이터는 대/소문자 구분을 하여야 함. 
            데이터이기 때문.



     >> 문자열의 크기 비교?

           부등호로 비교 가능. UNICODE?

                                              

                문자가 없으면 0.  있으면 0보다 큰 숫자라고 보면 됨.

               MARTIN > KING // A<B<C<D ....


                NOT [ A OR B OR C]  =  [ A and B and C ]



               오라클에서는 '작은 따옴표'만 사용해야 한다.

               컬럼의 별명에서만 "큰따옴표"를 사용한다. --> ""쓸때 AS 생략 가능


             




          LIKE
          ' % ' 글자수 상관 없이 아무 글자나 들어갈 수 있다.
          ' _ '   글자 상관 없이 딱 한글자만 들어갈 수 있다.

          WHERE 칼럼명 LIKE 'A%';




         NULL
         SELECT * FROM emp WHERE comm IS NULL;
         SELECT * FROM emp WHERE comm IS NOT NULL;


         
         
         

>> 집합

       > 합집합(union) : OR , UNION
         
          SELECT empno, ename, deptno FROM emp WHERE deptno = 10
            UNION
          SELECT empno, ename, deptno FROM emp WHERE deptno = 20 ;


           # 집합연산자를 사용할 때 두 개의 select 문장은 같은 컬럼들을 같은 순서로 검색해야 한다.



      >  교집합(intersect) : AND, INTERSECT

             SELECT * FROM emp WHERE ename LIKE '%E%'
                INTERSECT
             SELECT * FROM emp WHERE job LIKE '%E%';

             --> 같다 : SELECT * FROM emp WHERE ename LIKE '%E%' AND job LIKE '%E%';



      >  차집합(minus) : a AND (NOT b), MINUS

            SELECT * FROM emp WHERE job LIKE '%E%'
               MINUS
           SELECT * FROM emp WHERE ename LIKE '%E%';

            --> 같다 : SELECT * FROM emp WHERE job LIKE '%E%' AND (NOT ename LIKE '%E%');