반응형

추출, 정제하기




빅데이터 분석을 하기 위한 과정 중 시간이 가장 많이 드는 과정이 어떤 과정일까요?


안타깝게도.. 데이터 분석을 하는 시간보다

데이터를 정제하는 시간이 더 많이 든다고 합니다!


더 좋은, 명확한, 유용한 결과를 추출하기 위해서죠!


데이터 정제시간을 줄이기 위해,

데이터의 품질을 높이기 위해

DB에서 미리 제약조건으로 데이터를 CONTROL 합니다!


제약조건이란?


테이블의 데이터를 구체화하는 규칙입니다.


출처: 타위키


<제약조건의 종류>


 

     1. PRIMARY KEY: 중복된 데이터와 null값이 입력되지 않게 막는다.

 

     2. UNIQUE: 중복된 데이터가 입력되지 않게 막는다.


     3. NOT NULL: null값이 입력되지 않게 막는다.


     4. CHECK: 미리 정의된 데이터만 입력되도록 막는다.


     5. FOREIGN KEY: 참조하는 컬럼에 거는 제약




<제약조건을 생성하는 시점>


1. 테이블이 생성되는 시점


2. 테이블 생성 후


주의!

테이블 생성후 제약조건을 사용하기 위해서는

기존에 존재하는 데이터 중 제약에 위반된 데이터가 없어야 합니다.




( 테이블 생성시 )


1. PRIMARY KEY 제약조건 주기


조건: 고객테이블을 생성하며

column은 고객번호, 고객이름, 나이, MOBILE, 주소로 만든다.

PK: 고객번호


      

     SQL1> CREATE TABLE 고객

              ( 고객번호  number(10) PRIMARY KEY,

                고객이름  varchar2(20),

                나이        number(3),

                mobile     varchar2(13),

                email       varchar2(20),

                주소        varchar2(40) );




(테이블 생성 후)


2. UNIQUE 제약조건 주기


조건: 고객테이블에서 mobile 컬럼에 unique 제약조건(customer_mobile_un)을 준다.



     SQL2> ALTER TABLE 고객

               ADD CONSTRAIN customer_mobile_un

               UNIQUE(mobile);

 



(테이블 생성 후)


3. NOT NULL 제약조건 주기


조건: 중요한 데이터로, 꼭 입력받아야하는 데이터인 고객이름에

not null제약조건(customer_cname_nn)을 준다.


 

      SQL3> ALTER TABLE 고객

                MODIFY 고객이름 CONSTRAIN

                customer_cname_nn NOT NULL;




(테이블 생성 후)


4. CHECK 제약조건 주기


조건: email에 @과 .을 포함하는 데이터만 입력 또는 수정되게 한다.

(customer_email_ck)



     SQL4> ALTER TABLE 고객

               ADD CONSTRAIN customer_email_ck

               CHECK (email LIKE '%@%.%');

 



(테이블 생성시 & 테이블 생성 후)


5. FOREIGN KEY 제약조건 주기


조건:  구매 테이블에는 고객번호, 구매품목, 갯수 COLUMN을 가진 구매 테이블을 만든다.

구매 테이블의 고객번호는 고객테이블의 고객번호를 참조한다.




     SQL5_1> CREATE TABLE 구매

                ( 고객번호  number(10),

                 구매품목  varchar2(30),

                 갯수        number(5) );


     SQL5_2> ALTER TABLE 구매

                 ADD CONSTRAIN order_cname_fk

                 FOREIGN KEY(고객번호) REFERENCES 고객(고객번호);

 



<제약조건 이름>


위에서 계속 제약조건의 이름을 지정하였습니다.

order_cname_fk와 같이 말이죠.


그 이유는

이 제약 조건을 나중에 필요가 없어서 제거(DROP)하거나

잠시 중지(DISABLE)시킬 때

제약조건 이름을 사용하기 때문입니다.

 

물론 제약조건의 이름을 주지 않은

고객번호와 같이 제약조건을 준 경우


ORACLE에서 자동으로 SYS_Cn형식으로 이름을 생성합니다.


제약 조건을 확인하는 방법도 있습니다.



     SQL> SELECT table_name, constraint_name, 

                        constraint_type, status

               FROM user_constraints

               WHERE table_name = '테이블명';

 


하지만 조금 귀찮겠죠..?



오늘은 여기까지!!


뿅!

반응형

'SQL' 카테고리의 다른 글

ORACLE | 인덱스 (INDEX)  (2) 2018.04.12
ORACLE | VIEW(뷰)  (0) 2018.04.11
ORACLE | MERGE문 (DML)  (0) 2018.04.09
ORACLE | 서브쿼리 2탄 - MULTIPLE COLUMN SUBQUERY  (0) 2018.04.06
ORACLE | 서브쿼리 1탄 - SINGLE / MULTI ROW SUBQUERY & EXISTS  (0) 2018.04.06
반응형

DB출처: http://www.thisisgame.com



안녕하세요!


오늘은 '날짜형변환' 에 대해 다뤄보도록 하겠습니다.




날짜형이란 무엇일까요?



우선, 데이터 유형의 변환은 크게 2가지 암시적 형변환과 명시적 형변환으로 나뉩니다.



암시적형변환은  오라클 데이터베이스의 장점이자 단점이라고 볼 수 있습니다.



문제1. 과연, 아래의 SQL문은 과연 실행이 될까요?


 Slect ename, sal

           From 테이블명

           Where sal like '35%';


힌트) 


sal은 연봉을 의미하며 숫자 data가 들어있습니다.


'35%'는 ' ' 싱글쿼테이션으로 감싸져 있으니 문자형이라는 것을 쉽게 알아챌 수 있으셨겠죠?


( 만약 LIKE문을 모르신다면 여기에서 확인하시고 돌아오셔도 됩니다.)





위와 같은 경우를 암시적 형변환이라고 합니다.


어떤 DB에서는 위와같은 경우 형이 맞지 않는 data끼리를 비교하였기 때문에 오류가 발생합니다.


하지만, 오라클의 경우에는 오류가 나지 않기 때문에 형변환으로 많은 시간이 걸린다는 단점이 있습니다.





다음으로 명시적 형변환이 있습니다. 이는 우리가 임의로 데이터 유형을 변경시키는 것입니다.



명시적 형변환은 3가지가 있습니다.


1. to_char: 문자형으로 형변환하는 함수


2. to_number: 숫자형으로 형변환하는 함수


3. to_date: 날짜형으로 형변환하는 함수



오늘은 앞서 언급한 것과 같이 날짜형을 변환하는 방법에 대해 알아보겠습니다.




문제2. 81년 9월 10일에 입사한 사원들의 이름(ename)과 입사일(hiredate)을 알고싶습니다.






그럼 여기서 궁금증이 생깁니다.


과연 어떤 방법이 제일 간단하면서 빠를까요?




사실 그 질문보다 먼저 해야하는 질문이 있습니다.


과연 어떤 방법이 제일 성능이 떨어지는 방법인가요?



그것은 바로 좌변을 가공하는 이와같은 방법입니다.


 SELECT ename, hirdate

FROM 테이블이름

WHERE to_char(hiredate, 'RR/MM/DD') = '81/09/10';



이것은 강제로 날짜 형식을 변경시켜서 찾는 여러 방법 중


실제로 많이 사용하지만 SQL 속도면에서 가장 좋지 않은 방법이라고 할 수 있습니다.




WHERE 조건에서 좌변을 가공하면 인덱스가 사용되지 않습니다. 


즉 처음부터 끝까지 비교를 해야하는거죠 (FULL TABLE SCAN을 하게됩니다.)

출처: 한국데이터진흥원


다음으로 새로 DB에 접속할 때마다 날짜형을 변환하는 다음과 같은 방법이 있겠죠.


 ALTER SESSION SET nls_date_format = 'RR/MM/DD';



그것도 귀찮다면!



아래와 같이 날짜형 데이터의 형변환을 하는 습관을 들이시는 것은 어떨까요?


SELECT ename, hiredate

FROM 테이블명

       WHERE hiredate = to_date('81/09/10') 






오늘도 수고하셨습니다.


매일매일 SQL을 공부하며 성장하는 으니입니다!


앞으로도 화이팅합시다!!



만약 위포스팅에서 잘못된 부분이 있다면 댓글로 알려주세요~



이 글이 도움되셨다면 아래 공감 꾹~ 





반응형

+ Recent posts