반응형



오늘은 치환변수에 대해 알아보겠습니다!



스크립트 작성시


SQL문에서 & 치환을 사용하면 값을 입력하도록 요구할 수 있습니다.


동일한 컬럼을 데이터만 바꿔서 검색하거나 입력해야할 때,


앤퍼센드 치환변수를 사용하면 SQL문의 재사용성 및 범용성을 높일 수 있습니다.




[고객 테이블]


고객이름

 나이

  주소 

 총구매액

 전화번호

 추천인

 A

 24

 서울

 30000

 010-0123-4567

 null

 B

 29

 서울

 10000

 010-1234-5678

 A

 C

 26

 파주

 25000

 010-2345-6789

 A

 D

 27

 제주

 1000

 010-3456-7891

 B




예제1. &치환변수를 이용하여 이름을 입력받아

고객 정보를 조회하세요



     SQL1> SELECT 고객이름, 나이, 전화번호

                     FROM 고객

                     WHERE 고객이름 = '&고객이름';

 


(&고객이름을 싱글 쿼테이션마크(')로 감싸준 이유는

입력받을 값이 CHAR이기 때문입니다)


결과:



SLQPLUS에서 위의 예제 코드를 입력하면

'ENTER VALUE FOR 고객이름:' 옆에 커서 부분이 나옵니다.


(JAVA의 SCANNER와 같은 방법이라고 생각하면 됩니다.)




A를 입력하면

WHERE절에 A를 넣은 쿼리와 같은 결과를 얻을 수 있습니다.




예제2. 회원가입을 위해 고객이름, 나이, 주소, 전화번호, 추천인을 입력받으세요.

(단, 고객이름은 무조건 입력받고 싶습니다.)


 

      SQL1> INSERT INTO (SELECT 고객이름, 나이, 주소, 전화번호, 추천인

                     FROM 고객

                     WHERE 고객이름 IS NOT NULL

                     WITH CHECK OPTION)

                 VALUES('&고객이름', &나이, '&주소', '&전화번호', '&추천인');




with check option을 사용하면

WHERE절의 조건에 위배되지 않는 값만 입력하게 할 수 있습니다.

(view옵션에서 잠시 언급한 적이 있습니다.)


 가능한 응용프로그램이 아닌 SQL문에서

위와같이 작동되도록 만드는 것이 성능에 좋다고 합니다.

(IF문으로 안해도 )



오늘은 여기까지


내일은 다중 INSERT문으로 다시 돌아올께요~



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



반응형

'SQL' 카테고리의 다른 글

ORACLE | 정규식 함수(regular expression)  (0) 2018.04.18
ORACLE | 다중 INSERT문 4가지 방법  (0) 2018.04.17
ORACLE | 인덱스 (INDEX)  (2) 2018.04.12
ORACLE | VIEW(뷰)  (0) 2018.04.11
ORACLE | SQL제약조건(데이터 정제하기)  (0) 2018.04.10
반응형

안녕하세요! 


오늘은

인덱스에 대해 알아보겠습니다.



책에는 목차, 즉 인덱스가 있습니다.

우리는 책의 내용을 찾을 때 이 인덱스를 이용하죠~


SQL 인덱스는 책의 목차와 같은 기능을 합니다.


따라서 인덱스를 검색 속도를 높이기 위해 사용할 수 있습니다.


예제를 통해 인덱스에 대해 알아보도록 하겠습니다.


예제를 위한 테이블입니다.


[ 고객 테이블 ]


고객이름

 나이

  주소 

 총구매액

 전화번호

 추천인

 A

 24

 서울

 30000

 010-0123-4567

 null

 B

 29

 서울

 10000

 010-1234-5678

 A

 C

 26

 파주

 25000

 010-2345-6789

 A

 D

 27

 제주

 1000

 010-3456-7891

 B




우선 인덱스 생성 방식은 2가지 방법이 있습니다.



     자동으로 생성:


        테이블 정의에서 primary key 또는 unique 제약 조건을

        정의하면 공의 인덱스가 자동으로 생성됩니다.



     수동으로 생성:


         행에 엑세스하는 속도를 높이기 위해 유저가

         열의 비고유 인덱스를 생성할 수 있습니다.




예제1. 고객이름 컬럼에 인덱스를 생성하세요.




여기서 잠깐!

인덱스를 생성할 때 주의할 점이 있습니다.


우선 인덱스는 검색할 때 꼭 필요한 컬럼에만 인덱스를 걸어줘야 합니다.


자주 사용되는 컬럼에 인덱스를 생성하면 좋겠죠?



하지만


테이블에 인덱스가 많은 경우,

또한 자주 생성, 갱신, 삭제되는 테이블의 경우


인덱스를 생성하면


DML작업 후에 모든 인덱스를 갱신해야하므로

서버의 부담이 늘어납니다.



예제2. 고객 이름, 나이, 주소, 전화번호를 검색할 때 인덱스를 이용하세요.




인덱스를 사용하는 SQL 작성 방법 2가지가 있습니다.



     1. WHERE절 검색에 사용되는 컬럼에 인덱스가 존재하는지

         확인해야한다.


     2. WHERE절 검색에 사용되는 컬럼을 가공하면

         FULL TABLE SCAN을 한다.


     3. WHERE절 검색에 사용되는 컬럼이 가공되지 않았는데도

        인덱스를 엑세스하지 못하는 경우에 암시적 형변환 여부를

        확인해봐야 한다.



인덱스를 생성한 후


쿼리문에서 인덱스를 활용하기위해서는


WHERE절 검색에 인덱스가 존재하는 컬럼을 명시해주어야 합니다.



예제3. 고객이름, 총구매액, 추천인을 검색하는데

총구매액이 가장 높은 고객을 검색하세요.




위와 같이 두가지 또는 세가지의 쿼리의 방법이 있습니다.


과연 어떤 방법이 가장 빠를까요?


여기서 각 쿼리별 시간을 추적해보겠습니다.


 저는 SQLPLUS를 사용하는데요


SQLPLUS명령창에 SET TIMING ON이라는 명령어를 사용하면 시간을 추적할 수 있습니다.


<SQL3 쿼리 시간>




<SQL4_2 쿼리 시간>




<SQL4_3 쿼리 시간>




위의 테이블은 예제를 위해 사용한 테이블과 동일한 DATA를 가진 고객 테이블입니다.


00:00:00.03 의 시간차이를 사소하다고 생각할 수 있습니다.


하지만


빅데이터라면?


만약 천만배, 백만배 이상의 데이터가 존재한다면 그 시간의 차이는 어마어마할 것입니다.



빅데이터를 다루는 분석가는


특히 데이터의 검색 속도를


높일 수 있는 쿼리를 사용해야한답니다~




오늘은 여기까지!


검색의 속도를 높이는 하나의 강력한 방법! 인덱스에 대해 알아보았습니다~



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


#빅데이터분석 #SQL #오라클 #인덱스 #서브쿼리 #검색속도 #빠른검색 #HINT #SET_TIMING_ON

반응형

'SQL' 카테고리의 다른 글

ORACLE | 다중 INSERT문 4가지 방법  (0) 2018.04.17
ORACLE | 치환변수(&) 사용하는 방법  (0) 2018.04.16
ORACLE | VIEW(뷰)  (0) 2018.04.11
ORACLE | SQL제약조건(데이터 정제하기)  (0) 2018.04.10
ORACLE | MERGE문 (DML)  (0) 2018.04.09
반응형

추출, 정제하기




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


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

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


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


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

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

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
반응형




안녕하세요~ 오늘은 DML로 돌아왔습니다~



DML이란,

(DATA MANIPULATION LANGUAGE)


데이터 조작언어는 데이터베이스 사용자 또는 응용 프로그램 소프트웨어가 컴퓨터 데이터베이스에 대해 데이터 검색, 등록, 삭제, 갱신을 위한 데이터베이스 언어 또는 데이터베이스 언어 요소입니다.


출처: WIKIPEDIA


< DML의 종류 >



SELECT: DATA 검색


INSERT: DATA 삽입


UPDATE: DATA 갱신


DELETE: DATA 삭제


MERGE


 

오늘은 이 중 MERGE에 대해 알아보겠습니다.



MERGE, 섞다출처 _ booleanstrings.com



merge문


insert, update, delete를 한번에 수행하는 명령어 입니다.


(잘 사용할 줄 안다면 굉장히 편리하고 유용한 방법입니다!)



<예제를 위한 테이블>


[ 고객 테이블 ]


고객이름

 나이

  주소 

 총구매액

 추천인

 A

 24

 서울

 30000

 null

 B

 29

 서울

 10000

 A

 C

 26

 파주

 25000

 A

 D

 27

 제주

 1000

 B



[ 등급 테이블 ]


고객등급 

 최소구매액

 최대구매액

 1

 0

 9999

 2

 10000

 19999

 3

 20000

 30000




예제1.

고객이름, 총구매액, 등급을 새로운 고객_등급 테이블로 저장하고 싶습니다.




STEP1. 우선 고객테이블에서 필요한 데이터를 선택하여 서브쿼리를 이용해 새로운 TABLE인 고객_등급 테이블을 생성합니다. (CREATE문은 DDL입니다.)


STEP2. 고객_등급 테이블에 등급 컬럼을 추가합니다. ( ALTER문은 DDL입니다)


STEP3. MERGE를 이용해 고객_등급 테이블의 등급 테이블에 DATA를 UPDATE할 수 있습니다.



< 고객_등급 테이블 결과 >


 고객이름

 총구매액

 등급

 A

 30000

 3

 B

 10000

 2

 C

 25000

 3

 D

 1000

 1





< 이때 UPDATE대신 MERGE를 쓰는 이유! >


만약 고객_등급 테이블에 고객DATA가 약 100만 건이라면?



UPDATE문의 경우 DATA를 하나씩 대조하며 등급 DATA를 업데이트합니다.


100만건의 데이터를 모두 대조해보겠죠?


0.01초에 하나씩 검사를 진행한다고 해도 과연 .. 




MERGE문의 경우 DATA를 한번에 DATA를 업데이트합니다.


따라서 훨씬 빠르게 결과를 얻을 수 있습니다.

(참고로 index를 가진 데이터는 더욱 빠르답니다~)






예제2.

고객테이블에서 총구매액에 변화가 생기면 고객_등급 테이블을 자동적으로 UPDATE가 될까요?






예제3.

(MERGE를 이용해)

고객테이블의 총구매액의 변화를 고객_등급 테이블의 총구매액에 반영하고 싶습니다.




(설명)


합치겠다.


고객_등급 테이블과 고객 테이블과


ON 조건절로


MATCH된다면


SET과 같이 UPDATE하겠다




참고) group함수를 사용하는 경우에는

using절에서 서브쿼리로 사용할 수 있다.



오늘은 여기까지!


DML은 아주 기본적이고도 중요합니다!


특히 빅데이터 분석가를 꿈꾸는 저와 많은 응용 프로그래머들에게는 더더욱! 많이 사용하는 부분이지 않을까 싶습니다!


SELECT 문을 모르신다면 여기로!

반응형

+ Recent posts