[MYSQL] Temporary Table의 특성과 프로시저 결과를 Temp 테이블에 넣기


   각 DB마다 임시테이블의 사용방법 등은 조금씩 다르므로 정리 해둘 필요가 있다. 프로시저안에서 다른 프로시저를 호출 하여 임시테이블에 넣을 수 는 없을까? 아래 예제를 참고 하자.


1. 관련예제

   - Temporary Table의 특성과 사용법

   - 프로시저를 호출 하여 임시테이블에 넣자(SELECT into #T1 execute ('execute ' + @SQLString )

저작자 표시 비영리 변경 금지
신고

[MYSQL] 동적 컬럼 만들기, mysqld_safe 실행으로 패스워드 재지정 등


   업무를 개발 하다보면 동적으로 테이블의 항목을 만들어야 할 경우가 있다. 이럴 경우 sql 스토어드 프로시저를 이용하여 작업을 할 수 있다. 테이블의 항목이 될 리스트가 있는 테이블과 메인테이블 2개의 테이블을 이용한다. 물론 이러한 내용들은 선배님들의 업적을 참고하면 쉽게 만들어 낼 수 있다.


1. 동적으로 컬럼 사용하기

   - http://stackoverflow.com/questions/12598120/mysql-pivot-table-query-with-dynamic-columns

   - http://stackoverflow.com/questions/12004603/mysql-pivot-row-into-dynamic-number-of-columns


2. MYSQL ROOT 패스워드 분실시 대처   - http://zetawiki.com/wiki/MySQL_root_%ED%8C%A8%EC%8A%A4%EC%9B%8C%EB%93%9C_%EB%B6%84%EC%8B%A4


3. Access denied for user ''@'localhost' (using password: YES) 대처법

   - http://wickedmagic.tistory.com/323


4. 프로시저에서 Insert 성공여부 확인 방법

   - ROW_COUNT() 함수를 통하여 확인 할 수 있다.

저작자 표시 비영리 변경 금지
신고

[MYSQL] 10년치 날짜 데이터 테이블 만들기, 달력 쿼리 등


    DB관련 쿼리는 얼마나 많은 함수를 아느냐와 활용도도 중요하지만 얼마나 많이 찾아보고 과거 히스트리를 잘 응용하느냐도 중요한것 같다. 그러므로 나는 후자로서 활용 하길 원한다. 매일 매일 쿼리를 사용하지 않으면 독창적인 쿼리는 쉽게 나오지 않으므로... 남의 것을 가져다 쓰거나 응용 하는 것이 현재로서 최상 아닐까 싶다.


1. MYSQL의 쿼리쿼리쿼리!!!

    - 10년치의 날짜를 1월 1일부터 12월 31일까지 넣는 방법

create table t (n int);

 
insert into t values (1);
 
insert into t select * from t; -- 이걸 13번 반복하면 4096행이 생성됨. 10년치 데이터라면 대략 3650일이므로 이정도면 충분
 
create table date_t (d date, ds char(8)); -- 날짜를 저장할 테이블
 
insert into date_t
select d, date_format(d, '%Y%m%d') from (
  select @rnum:=@rnum+1 as rownum, date(adddate('2009-01-01', interval @rnum day)) as d
  from (select @rnum:=-1) r, t
  ) t
where year(d) < 2019;
 

참고로, 날짜는 date 타입에 저장하는 것이 yyyymmdd형식의 문자열로 저장하는 것보다 좋습니다.

    

     - 쿼리로 달력을 만들어보자!!( 와우!! )

SELECT dt + INTERVAL lv-1 DAY dt
  FROM (-- connect by level 대신 시스템정보 테이블 columns 를 이용
        SELECT ordinal_position lv
             , CONCAT('201507', '01') dt
          FROM information_schema.columns
         WHERE table_schema = 'mysql'
           AND table_name = 'user'
        ) a
 WHERE lv <= DAY(LAST_DAY(dt))

;


    - 쿼리로 달력을 만들어보자 02

SELECT ym
     , MIN(CASE dw WHEN 1 THEN d END) Sun
     , MIN(CASE dw WHEN 2 THEN d END) Mon
     , MIN(CASE dw WHEN 3 THEN d END) Tue
     , MIN(CASE dw WHEN 4 THEN d END) Wed
     , MIN(CASE dw WHEN 5 THEN d END) Thu
     , MIN(CASE dw WHEN 6 THEN d END) Fri
     , MIN(CASE dw WHEN 7 THEN d END) Sat
  FROM (SELECT date_format(dt,'%Y%m') ym
             , Week(dt) w
             , Day(dt) d
             , DayofWeek(dt) dw
          FROM (SELECT CONCAT(y, '0101') + INTERVAL a*100 + b*10 + c DAY dt
                  FROM (SELECT 0 a
                        UNION ALL SELECT 1
                        UNION ALL SELECT 2
                        UNION ALL SELECT 3
                        ) a
                     , (SELECT 0 b
                        UNION ALL SELECT 1
                        UNION ALL SELECT 2
                        UNION ALL SELECT 3
                        UNION ALL SELECT 4
                        UNION ALL SELECT 5
                        UNION ALL SELECT 6
                        UNION ALL SELECT 7
                        UNION ALL SELECT 8
                        UNION ALL SELECT 9
                        ) b
                     , (SELECT 0 c
                        UNION ALL SELECT 1
                        UNION ALL SELECT 2
                        UNION ALL SELECT 3
                        UNION ALL SELECT 4
                        UNION ALL SELECT 5
                        UNION ALL SELECT 6
                        UNION ALL SELECT 7
                        UNION ALL SELECT 8
                        UNION ALL SELECT 9
                        ) c
                     , (SELECT '2015' y) d
                 WHERE a*100 + b*10 + c < DayOfYear(CONCAT(y, '1231'))
                ) a
        ) a
 GROUP BY ym, w

;


    - mysql에서 현재 날짜와 date_format 사용 방법

    - mysql에서 날짜 포맷 변화 date_format 사용 방법


    


저작자 표시 비영리 변경 금지
신고

[MYSQL] DB 백업 받고 복원하기 및 CentOS Mysql 설치


  이번에 서버호스팅을 다른곳으로 옮기며 알아두면 좋을거 같은 내용을 기록해 놓아 본다. 리눅스 서버는 한번 세팅하면 몇달 몇년이 되도록 다시 설치 하는 경우가 많으니 모든게 새롭다 ㅠㅠ.


백업 및 복원 방법 : http://blog.naver.com/insane_915?Redirect=Log&logNo=220000065192

CentOS에 Mysql설치 : http://blog.naver.com/cloudinno?Redirect=Log&logNo=120202869807


저작자 표시 비영리 변경 금지
신고

[DB] 힌트절(HINT)


출처 : http://blog.naver.com/thesot?Redirect=Log&logNo=70130641019

힌트란? 

힌트는 SQL을 실행계획을 제어하는 도구이다. 데이터베이스의 실행계획을 주도하는 옵티마이저에게 원하는 실행 계획으로

유도하도록 사용된다. 이와 같은 힌트는 옵티마이저에의해 선택될 수도 있고 버려질 수도 있다.

 

 

 힌트의 특징 네가지!

1. 실행 계획을 제어한다.

  - SQL이 우리가 원하는 실행 계획이 생성되지 않은 경우 여러가지 방법으로 우리는 실행계획을 제어할수 있다.

 새로운 인덱스를 생성하는 경우도 있고, SQL에 힌트를 설정하여 옵티마이저에게 올바른 실행 계획을 생성하도록 유도할 수 있다.

따라서 힌트는 실행계획을 원하는 방향으로 유도하기 위해 사용하는 한가지 방법이다.

 

2. 에러가 발생하지 않는다.

 - 힌트는 잘못 작성하여도 해당 SQL은 에러를 발생시키지 않는다.

  물론 힌트의 시작 /*+ 와 끝 */ 은 문법에 맞게 작성되어야한다. 힌트를 잘못 사용해도 에러가 발생하지 않기 때문에 힌트가 잘못되었는지 항상 확인해야 한다.

 

3. 선택 또는 취사될 수 있다.

  - 힌트의 문법이 올바르더라도 힌트는 옵티마이저에의해 버려질수도 있고 선택되어질 수도 있다. (힌트의 취사선택)

 

4. 다양한 종류가 존재한다.

 - 매우 다양한 종류의 힌트가 있으며 버전업이 될때마다 계속 추가된다.

 

 트의 종류

 1. 옵티마이저 관련 힌트

    비용기반 옵티마이저  : 테이블 또는 인덱스의 통계 정보를 이용하여 SQL의 실행계획 생성

    규칙기반 옵티마이저  : SQL의 문법과 인덱스의 구성 컬럼등을 기준으로 실행계획 작성 (현재는 지원중지 고려대상X)

 

  비용기반 옵티마이저 관련 힌트

 

 

 

 2. 조인 순서 관련 힌트

테이블의 엑세스 순서는 조인의 성능을 좌우할 정도로 매우 중요함

조인의 순서만으로 조인의 SQL을 최적화 할수 있을 정도로 중요하다.

 

 

 

 3. 조인 방식 관련 힌트

조인은 순서만이 성능을 좌우하는것이 아니다.

조인을 수행하는 두 테이블 사이에 어떤 방식을 사용하는가에 따라서 조인의 성능이 좌우된다.

 

 

 

 

중첩 루프 조인 (NESTED LOOP JOIN)

  드라이빙 테이블의 처리범위를 하나씩 엑세스 하면서 그 추출된 값으로 연결할 INNER 테이블을 조인하는 방식

 

해쉬 조인

 대용량 데이터를 처리하기 위해 사용하며 메모리에 해쉬 영역을 사용하여 조인을 수행

 

소트 머지 조인

양쪽 테이블을 각자 엑세스하여 처리 범위를 줄이고, 조인컬럼 순으로 데이터를 SORT 한 후에 조인하는 방식

 

 

4. PARALLEL 관련 힌트

 

 여러개의 프로세스를 이용하여 작업을 수행하기 위해 사용하는 힌트이다.

 

 

 

 

 PARALLEL - 테이블을 여러개의 프로세스로 엑세스하는 경우 또는 여러 프로세스로 DML을 수행하는 경우 사용가능하다.

테이블 이름과 PARALLEL PROCESSING 개수를 변수로 설정하여 사용한다.

 

NOPARALLEL - PARALLEL PROCESSING 을 사용하지 않는 힌트이다. (수행 방지)

 

APPEND - 해당 힌트는 PARALLEL PROCESSING 관련 힌트는 아니지만, INSERT 작업 시 직접 로딩을 수행하는 경우

 사용하는 힌트이며 대용량의 데이터 INSERT 작업 에는 탁월한 성능을 보장하는 힌트이다.

INSERT 시에 PARALLEL 힌트를 설정하게 되면 해당 INSERT 작업은 기본적으로 APPEND 힌트를 포함하게 된다.

 

 

5. 인덱스 관련힌트

 

 인덱스의 실행계획이 많았던것처럼 인덱스 관련 힌트 종류도 많으며 가장 많이 사용된다.

 

 

6. SQL 의 변형 관련 힌트 (쿼리 트랜스폼 관련)

 

 SQL 변형 힌트는 앞에서 살펴봤던 옵티마이저 의한 쿼리 변환을 유도하는 힌트이다.

 내용이 어렵고 쓰기 어렵지만 잘 숙지해서 사용한다면 매우 유용한 힌트이다.

 



[출처] 9. 힌트의 사용|작성자 따개비


저작자 표시 비영리 변경 금지
신고

Windows Server 2003 + Oracle 8i 설치시 무반응 이슈


   비단 2003뿐만 아니라 아마 다른 윈도우 계열 OS도 같으리라 생각된다. 오라클 8i를 설치 할 때 원격 데스크탑으로 설치 할 경우 설치가 제대로 되지 않는다. 완료 단계인 NET8 Configuration Assistant에서 반응을 보이지 않으며 중지하고 넘어가면 제대로 설치 되지 않아 윈도우-관리도구-서비스에 보면  OracleService 서비스가 보이지 않고 Tns Listener만 서비스로 등록 되어 있다. 제대로 설치 하려면 윈도우 데스크탑 연결이 아닌 다른 원격 프로그램을 인스톨 해서 사용하거나 로컬로 설치 하기 바란다. 이미 오라클8i는 구하기조차 어려우므로 나 자신을 위해 남겨 놓는다. 휴식 시간 4시간 날린거 생각하면 빡친다. 아래 사이트에 감사를 표한다.


http://www.allsoft.co.kr/bbs/board.php?bo_table=tip_tech&wr_id=170

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

Workarounds 

Workaround 1: 
1. Create a temporary directory on your server. 

2. Copy the entire contents of the Oracle RDBMS Server CD 
to the temporary directory created in step 1. 

3. Search the directory structure created in Step 1 for the existence of 
the filename symcjit.dll. 

4. Rename each copy of the symcjit.dll to symcjit.old. 
C:\oracle\Oraclient8.1.7\stage\Components\oracle.swd.jre\
1.1.7.30\1\DataFiles\Expanded\jre\win32\bin\symcjit.dll

5. Run the setup.exe from the install\win32 directory (under the
directory 
on your hard disk used in Step 1) and install Oracle 8.1.x and related
products. 

Workaround 2: 
1. Create a temporary directory on your server. 

2. Copy the entire contents of the Oracle RDBMS Server CD 
to the temporary directory created in step 1. 3. Search the directory structure created in Step 1 for the existence of 
the filename symcjit.dll. 

4. Rename each copy of the symcjit.dll to symcjit.old. 
C:\oracle\Oraclient8.1.7\stage\Components\oracle.swd.jre\
1.1.7.30\1\DataFiles\Expanded\jre\win32\bin\symcjit.dll

5. Run the setup.exe from the install\win32 directory (under the
directory on your hard disk used in Step 1) and install Oracle 8.1.x and related
products. 

Navigate to the \install directory and open the 'oraparam.ini' file
for editing. 

Please note this file is write-protected, and the properties of the
file must be 
changed to allow writing before editing. 

Disable "Read Only" for C:\oracle\Oraclient8.1.7\install\oraparam.ini
and edit the file like this:

6. Change the JRE_MEMORY_OPTIONS parameter to 

JRE_MEMORY_OPTIonS=-nojit -ms64m -mx128m 

5. Save the oraparam.ini file. 

6. Navigate to the win32 subdirectory, under the directory you usedin
Step 1, and run the 
setup.exe program. 

If you have tried Workarounds 1 and 2 and still experience problems, please 
do the following: 

Workaround 3: 
1. Navigate to: Start> Settings > Control Panel > System 

2. Select the "Advanced" tab 

3. Click the "Environment Variables" button 

4. Highlight the PATH entry and click "Edit..." 

5. Copy down the current PATH setting. 

6. Remove any entries that refer to previous JRE directories 

Note: Care should be taken when editing the system path. Incorrect

edits can prevent Windows or other applications from
starting properly. 

7. If any entries were removed, repeat Workaround 1 or 2.


# 설치 중 "windows 시작메뉴나 windows 데스크탑에 항목을 작성할 수 없습니다." 라고 메세지가 나오나 "무시"하고 진행하여도 무방합니다.

# 8i 설치 시 리모트로 설치하지말고 로컬에서 작업해야함. (터미널과 오라클 8i 와의 문제로 보임)

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


저작자 표시 비영리 변경 금지
신고

[오라클] START WITH CONNECT BY, CONNECT BY LEVEL


START WITH CONNECT BY  : 

http://blog.naver.com/hiam11?Redirect=Log&logNo=70021899008



CONNECT BY LEVEL :

http://donatm.blog.me/20133117593


인터넷에 더 많은 정보가 널렷으니 찾아보자.

저작자 표시 비영리 변경 금지
신고

[오라클] TIMESTAMP, COMMIT 후 이전 데이터 값을 보자


SELECT * FROM [테이블명] AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '5' HOUR)


   위와 같은 방법으로 사용이 가능하다. HOUR은 DAY, MINUTE 등으로 바꾸어 사용 할 수 있다. 

위의 의미는 5시간 전의 데이터를 보여달라는 의미이다. WHERE절도 넣을 수 있다. 


오라클의 버퍼나 사용 설정에 따라 사용이 불가능 한 경우도 있으니 COMMIT 전엔 항상 제대로 UPDATE, DELETE를 했는지 확인하는 습관을 가지도록 하자.

저작자 표시 비영리 변경 금지
신고

[오라클] ANSI SQL 사용, INNER QUERY 사용시 상위 테이블 접근 시


   ANSI SQL 사용, INNER QUERY 사용시 조인절에선 상위의 테이블에 접근 할 수 없고 WHERE에서 접근해야한다. 오라클에서만 이런것인지 모르겠지만 일단 오라클에선 안되는것을 확인 했다.


SELECT  ( SELECT COLUMN_01 FROM TABLE_02 B  INNER JOIN TABLE_03 C ON A.AA = B.AA 

                    AND B.AA = C.AA ) AS COLUMN_01

 FROM TABLE_01 A


위의 굻게 표시된것 처럼 사용 할 수 없다. A.AA = B.AA 라는 문장을 WHERE  밑으로 내려야 한다.


SELECT  ( SELECT COLUMN_01 FROM TABLE_02 B  INNER JOIN TABLE_03 C ON B.AA = C.AA

                 WHERE A.AA = B.AA  ) AS COLUMN_01

 FROM TABLE_01 A

저작자 표시 비영리 변경 금지
신고

[DB] Select Into 와 Insert Into Select [펌]


출처 : http://blog.naver.com/lhs860226?Redirect=Log&logNo=156326619

  [출처] [MS SQL] Select Into 와 Insert Into Select|작성자 홈런왕둘리  



1. Insert Into ... Select

Insert Into ... Select 구문은 Select 절에서 조회한 데이터의 결과를

Insert Into 절에서 지정한 테이블에 넣어주는 구문이다.

이 구문은 조회된 데이터를 기존 테이블에 추가하는 기능이기 때문에 테이블이 존재해야 가능하다.

 

구문을 보면

Insert Into 데이터를 저장할 대상 테이블명

Select 조회하고자 하는 데이터

From 데이터를 검색할 테이블명

Where 조회 조건

 

이렇게 구성돼며 Insert Into Select 문은 동일 스키마에서만 동작이 가능하다.

 

아래 사진은 peotbl 테이블과 itemtbl 테이블에서 데이터를 조회하고

미리 생성돼어 있는 wogongTbl 테이블을 조회결과를 입력해주는 과정이다.


 

2. Select Into

Select Into 구문은 Select절의 검색결과를 Into절에서 새롭게 생성된 테이블에 데이터를 넣어줄때 사용한다. 따라서 테이블은 존재하지 않고, 해당정보는 입력이 돼어 있는 상태여야 가능하다.

구문을 보면...

 

Select 조회하고자 하는 데이터

into 새롭게 생성하고 조회결과로 채워줄 테이블명

From 데이터를 검색할 테이블명

Where 조회 조건

 

이렇게 구성되며, Select Into구문을 사용하여 생성된 테이블에 키는 복사되지 않는다.

 

아래 사진은 peotbl 테이블과 itemtbl 테이블에서 데이터를 조회하고

wogongTbl 테이블을 생성하여 조회결과를 입력해주는 과정이다.



 

뭐.. 간단히 차이점을 보면 ...

Insert Into ... Select 의 경우는 조회된 데이터를 기존테이블에 넣을때쓰고

Select Into 의 경우는 조회된 데이터를 새롭게 생성한 테이블에 넣을때 사용한다..

이정도인거 같다.

저작자 표시 비영리 변경 금지
신고

[DB] MSSQL, ORACLE, MYSQL 자료형[펌]


출처 : http://cafe.naver.com/itea11

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


1. 자료형의 종류

 

   [mssql2000]

        bigint           8바이트    64비트    부호 있음

        int               4바이트    32비트       "

        smallint        2바이트    16비트       "

        tinyint          1바이트     8비트        "

        decimal(p,s)   실수표현    p: 전체자리수 , s는 소수점 부분의 길이

        numeric(p,s)    "

        money         8바이트   64비트  통화 단위  1/10000의 정확성을 가짐

        smallmoney  4바이트 32비트    "

   [oracle]

        number          10바이트   80비트 부호있음  , 기본이 10바이트

        number(n)      바이트 지정, n은 바이트 숫자 

        number(p, s)  실수표현   p: 전체자리수, s는 소수점 부분의 길이

 

   [mysql]  : 가장 많음 .ㅠ.ㅠ

        tinyint            1바이트   정수

        smallint          2바이트   정수

        mediumint       3바이트   정수

        int, integer      4바이트   정수

        bigint             8바이트   정수

        float               4바이트   부동소수점 표현

        double           8바이트   부동소수점 표현

        real                double과 같음

        decimal(p,s)  실수표현   p: 전체자리수, s는 소수점 부분의 길이

        numeric(p,s)   decimal과 같음

        bit(n)             n비트 정수 표현

       

2. 자료형의 선언

   

    테이블을 만들 때 이 자료형에 대해서 선언 하는 방법을 알아보자. 대부분 다 비슷하다.

   다만 몇가지  () 안에 옵션에 있는 것만 알아보면 될 것이다.

 

    [mssql2000]

        create table test (

             aaa bigint,

             bbb decimal(10, 2) not null

        )

 

    [oracle]

        create table test (

             aaa number(8),

             bbb number,

             ccc number(10, 2)

        )

 

    [mysql]

         create table test (

              aaa bigint,

              bbb double,

              ccc decimal(10, 2)

         )

 

    위와 같은 형태로 테이블을 생성 할 때 우리는 자료형을 지정할 수 있다.

 

3. 숫자형에 대한 몇가지 옵션

 

   [mssql2000]

       mssql에서는 정수형에 대해서 identity 라는 옵션을 걸어 줄 수 있다.

       이것은 그 필드에 숫자를 자동으로 채우줌으로써.. 유일안 키값을 생성 할 수 있다.

 

   [oracle]

       오라클에서는 따로 옵션은 없다.

 

   [mysql]

       mysql에서는 auto_increment 라는 옵션으로 identity와 같은 역할을 하게끔 할 수 있다.

       mysql은 unsigned와 zerofill을 가지고 있다. unsigned는 부호없는 숫자를 만들어서 좀 더 넓은 범위의 숫자를 사용

       할 수 있게 하고 zerofill은 현재 필드의 값을 0으로 모두 채우는 옵션이다.

 

   다만 주의 해야 할 것은 mysql 에서는 auto_increment가 되면 그 필드는 기본키가 되어야 하지만 mssql에서는 identity가 되어도

   기본키가 되지 않아도 된다. 다만 대부분 기본적으로 그 필드를 기본키로 걸 뿐이다.

 

4. 이기종 디비간의 호환성

   대부분의 디비는 정수형에 대해서 가지고 있다. 하지만 몇가지 충족되지 않는 자료형을 가지고 있기 때문에

   숫자형에 대해서는

 

   mssql : int, decimal(p,s)

   oracle : number, number(p,s)

   mysql : int, decimal(p,s)

 

 

출처 :

1. 문자열 형의 종류

 

    [mssql]

        char(n)         최대 8000자, 유니코드 아님, 고정길이      

        varchar(n)     최대 8000자, 유니코드 아님, 가변길이      

        text               최대 2^31-1 자, 유니코드 아님, 가변길이       (32비트)

 

        nchar(n)         최대 4000자, 유니코드 아님, 고정길이      

        nvarchar(n)     최대 4000자, 유니코드 아님, 가변길이      

        ntext               최대 2^30-1 자, 유니코드 아님, 가변길이       (32비트)

 

        binary           최대 8000바이트, 고정길이, 이진문자열(비트 스트링)

        varbinary       최대 8000바이트, 고정길이, 이진문자열(비트 스트링)

        image           최대 2^31-1 바이트, 고정길이, 이진문자열(비트 스트링)

 

    [oracle]

       char(n)          최대 2000 바이트

       varchar2(n)      최대 4000 바이트

 

       nchar(n)         최대 2000 바이트

       nvarchar2(n)      최대 4000 바이트

 

       CLOB            1바이트 문자열, 최대 4GB

       BLOB            이진 문자열, 최대 4GB

       BFILE            바이너리 데이타 외부화일로 저장, 최대 4GB

 

       LONG           가변길이 문자열, 최대 2GB

       LONG RAW    가변길이 이진 데이타, 최대 2GB

       RAW             가변길이 이진 데이타, 최대 2000 바이트

 

    [mysql]

       char(n)          최대 255 바이트 까지

       varchar(n)      최대 255 바이트 까지

 

       binary(n)        이진데이타, 바이트 지정한만큼, 고정길이

       varbinary(n)    이진데이타, 바이트 지정한만큼, 가변길이

 

       tinyblob           이진데이타, 최대 255 바이트  (2^8)

       blob                이진데이타, 최대 65535 바이트  (2^16)

       mediumblob      이진데이타, 최대 2^24 바이트

       longblob          이진데이타, 최대 2^32 바이트,

 

       tinytext           1바이트 문자열, 최대 255 자  (2^8)

       text                1바이트 문자열, 최대 65535 자(2^16)

       mediumtext      1바이트 문자열, 최대 2^24 자

       longtext          1바이트 문자열, 최대 2^32 자

 

손수 다 적을려니 너무 빡시네. .ㅋㅋ 암튼 대충 이런 문자열 타입들이 있네요...

 

전체적으로 크게 보면

 

    일반 문자열 데이타, 유니코드 문자열 데이타, 대용량 이진 데이타, 대용량 문자열 데이타 등 으로 나눌 수 있는데요.

    실제로 코딩 할 때 쓰는건 몇 개 없네요..ㅋㅋ 암튼 이것으로 다들 잘 해봅시다.

 

2. 자료형의 선언

 

    [mssql]

     create table test (

        aaaa varchar(200)

     )

 

    [oracle]

     create table test (

        aaaa varchar2(300)

     )

 

    [mysql]

     create table test (

        aaaa varchar(400)

     )

 

    기본적으로 바이트 선언하는 형태는 너무나도 간단합니다. 특정 자료형과 길이만 적어 주기 때문에.. ^^

 

3.  이기종간의 디비 호환성

 

    일반적으로 문자열은 varchar 를 많이 씁니다.

    물론 속도 줄인다고 char 쓰시는 분들도 계시는데 이건 디비에 따라서 일정길이 이상이 되면 내부적으로 varchar로 돌아가기 때문에

    그냥 varchar 쓰시는게 더 좋을 듯 합니다.. 그리고 속도 차이도 거의 없구여..

 

    대부분의 디비에 들어가는 형태는 가변길이 문자열입니다. 그래서

   

    varchar, nvarchar, 오라클은 varchar2 등을 쓰게 됩니다.

 

    다만 조금씩 차이 나는 부분이  대용량의 글을 적을 때가 문제인데요...

 

    mssql : text

    oracle : clob

    mysql : text 관련 타입

 

    등으로 보편화 될 수가 있겠습니다..

 

    그래서 varchar(varchar2) 나 text(clob) 등으로 문자열에 대한 데이타를 정의해주시면 되겠구여..

 

    가끔씩 이미지를 통째로 필드에 넣는 경우가 있습니다. 그럴경우는 이진데이타 자료형으로 해서 넣어줄 수 있는데요..

 

    mssql : varbinary

    oracle : blob, bfile

    mysql : blob 관련 타입

 

    등을 많이 사용하게 됩니다.

 

    하지만 아직까지는 그런 대용량 이미지 데이타 들은 디비에 넣지 않고 그냥 파일로 복사하고 링크만 저장하는 방식이 선호가

    되고 있습니다. 나중에 디비 성능이 좀더 좋아지고 하드웨어, 네트워크 성능이 더 좋아지면 그때는 데이타베이스에서 모든 것을

    처리하는 때가 오겠죠? ^^ 그 때를 기대해봅니다.

 

 

출처 : http://cafe.naver.com/itea11


저작자 표시 비영리 변경 금지
신고

[오라클] NULL관련 이슈 모음 및 관련 쿼리문 시 사용시 주의 사항


   LIKE시 NULL 안나오는 것은 대부분 사람들이 다 알것이다. 관련해서 오늘 검색해본 내용을 정리해 놓는다~ 미래를 위해서 ^^ 뭐라도 찾아 봤으면 포스팅해서 내것으로 만드는게 좋지 아니한가?!


널포함해서 검색하기 : http://blog.daum.net/j02sin/14


오라클에서 NULL이란( 아주 알찬내용들이니 꼭 보자! ) :

http://blog.naver.com/jhjl023?Redirect=Log&logNo=110029888512


오라클에서 쿼리 사용시 주의 사항 : 

http://blog.naver.com/etruelove?Redirect=Log&logNo=140038229759


저작자 표시 비영리 변경 금지
신고

[오라클] 날짜계산 SQL


출처 : http://cafe.naver.com/pentaeduclub/2125


select months_between(sysdate,to_date('2006-12-22','yyyy-mm-dd')) from dual;
  --  '2006-12-22' 과 당일 사이의 달의 수를 NUMBER형 타입으로 반환
  -- months_between(A,B) = A-B/30
select add_months(sysdate,4)  from dual;
  -- 특정일의 달수 더한 날
select next_day(sysdate,'friday')  from dual;
  -- 특정일의 다음주 요일
select last_day(sysdate)  from dual;
  -- 특정일의 해당 월의 마지막 날
select round(sysdate,'dd')  from dual;
  -- 특정일의 반올림(오후면 다음날..)
select trunc(sysdate,'ww')  from dual;
  -- 특정일의 전주 토요일(해당 전주의 마지막 날)에해당하는 날짜
select trunc(sysdate,'D')  from dual;
  -- 특정일의 주 일요일(해당 주의 첫째 날)에해당하는 날짜
select trunc(add_months(:adb_input_date, -1),'mm') from dual;


 where 조건에 날짜칼럼을 기준으로 함.
 /* 어제 */ 날짜칼럼
                BETWEEN TRUNC(SYSDATE-1) AND TRUNC(SYSDATE-1)+0.99999421
/* 오늘 */ 날짜칼럼
               BETWEEN TRUNC(SYSDATE) AND TRUNC(SYSDATE) + 0.99999421
/* 내일 */ 날짜칼럼
               BETWEEN TRUNC(SYSDATE+1) AND TRUNC(SYSDATE+1)+0.99999421
/* 금주 */ 날짜칼럼
               BETWEEN TRUNC(SYSDATE+1)-TO_CHAR(SYSDATE,'D')
                        AND TRUNC(SYSDATE+1)-TO_CHAR(SYSDATE,'D')+6.99999421
/* 차주 */ 날짜칼럼
               BETWEEN TRUNC(SYSDATE+8)-TO_CHAR(SYSDATE, 'D')
                        AND TRUNC(TRUNC(SYSDATE)+14.99999421)-TO_CHAR(SYSDATE, 'D')
/* 금월 */ 날짜칼럼
               BETWEEN TRUNC(SYSDATE+1)-TO_CHAR(SYSDATE,'DD')
                        AND TRUNC(LAST_DAY(SYSDATE))+0.99999421
/* 전월 */ 날짜칼럼
               BETWEEN TRUNC(ADD_MONTHS(SYSDATE,-1)+1)-TO_CHAR(SYSDATE,'DD')
                        AND TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE, -1)))+0.99999421
/* 차월 */ 날짜칼럼
               BETWEEN ADD_MONTHS(TRUNC(SYSDATE),1)-TO_CHAR(SYSDATE,'DD')+1
                        AND LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE),1)+0.99999421)


# 특정일 까지의 간격을 년, 개월, 일로 표현하기
SELECT
  TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('20060101', 'YYYYMMDD'))/12) "년",
  TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('20060101', 'YYYYMMDD')) -
  TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('20060101', 'YYYYMMDD'))/12) * 12) "개월",
  TRUNC((MONTHS_BETWEEN(SYSDATE,TO_DATE('20060101', 'YYYYMMDD')) -
  TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('20060101', 'YYYYMMDD')))) * 30.5) "일"
FROM DUAL;


# 당월의 주차 구하기..
SELECT
'20040511' as "날짜"
, ceil((to_number(substrb('20040511', -2, 2)) + 7 - to_number(TO_CHAR(TO_DATE('20040511','YYYYMMDD'),'D')))/7) as "월별 주차"
from dual;


# 시간 계산 SQL
SELECT TRUNC(TO_DATE('20060502223443','YYYYMMDDHH24MISS')-TO_DATE('20060501213344','YYYYMMDDHH24MISS')) || ' day ' ||
      TRUNC(MOD((TO_DATE('20060502223443','YYYYMMDDHH24MISS')-TO_DATE('20060501213344','YYYYMMDDHH24MISS')),1)*24)|| ' hour ' ||
      TRUNC(MOD((TO_DATE('20060502223443','YYYYMMDDHH24MISS')-TO_DATE('20060501213344','YYYYMMDDHH24MISS'))*24,1)*60)|| ' minute ' ||
      TRUNC(ROUND(MOD((TO_DATE('20060502223443','YYYYMMDDHH24MISS')-TO_DATE('20060501213344','YYYYMMDDHH24MISS'))*24*60,1)*60))|| ' sec '
       " Time Interval "
FROM DUAL ;

저작자 표시 비영리 변경 금지
신고

[오라클] 오라클 날짜 관련 함수 및 참고자료


원문 : http://www.zetswing.com/bbs/board.php?bo_table=ORACLE_TIP&wr_id=20&page=2


1. Oracle에서의 날짜 특징

 

*oracle은 세기,년,월,일,시간,분,초의 내부숫자 형식으로 날짜를 저장합니다.

*디폴트 날짜형식은 'DD-MON-YY' 입니다.

*SYSDATE는 현재의 날짜와 시간을 리턴하는 함수입니다.(date타입)

ex : 2007-01-07 오후 10:34:00

*DUAL은 SYSDATE를 보기위해 사용된 dummy table입니다.

 

2.oracle에서의 날짜연산

 

* 날짜에서 숫자(날수)를 빼거나 더하여 날짜 결과를 리턴합니다. 결과는 날짜형식

* 날짜 사이의 일수를 알기 위하여 2개의 날짜를 뺍니다.

* 시간을 24로 나누어 날짜에 더합니다.

날짜 + 숫자 : 날짜 특정한 날로부터 몇일 후의 날짜 계산

날짜 - 숫자 : 날짜 특정한 날로부터 몇일 전의 날짜 계산

날짜 - 날짜 : 숫자 두 날짜 사이의 차이를 숫자로 계산 

 

3.oracle에서의 날짜 컬럼데이타형

 

date 형

 

4. 월과 일을 문자로 출력시 한글로 나오는거 영문으로 나오게 하기

 

오라클 환경 설정에 따라 아래 쿼리를 실행시키면 "7월" 이라고 나올수 있다.

SELECT TO_CHAR(SYSDATE,'mon') FROM DUAL;

 

오라클 환경 설정에 따라 아래 쿼리를 실행시키면 "월요일" 이라고 나올수 있다.

SELECT TO_CHAR(sysdate,'day') FROM DUAL;

 

영문("Jul")으로 출력시키려면 아래 명령으로 환경설정을 변경한다.

ALTER SESSION SET NLS_LANGUAGE = 'AMERICAN';

 

※ 월요일, 화요일 형식이 아닌 월, 화 형식으로 나타내기

SELECT TO_CHAR(sysdate,'day') FROM DUAL;

 

5.날짜의 순서결과 데이타형

 

날짜 - 날짜 = 숫자 
숫자 + 날짜 = 날짜 
(날짜 - 날짜) + 날짜 = 날짜 
날짜 + 날짜 = error

 

※ trunc함수를 날짜데이타에 사용하기

 

select sysdate from dual;
--2006-02-08 오전 12:11:05

 

select trunc(sysdate) from dual;
select trunc(sysdate,'dd') from dual;
--단지 시간을 없애고 날짜만 나오게 한다.
--2006-02-08

 

select trunc(sysdate,'d') from dual;
--시간을 없애고 일을 가장최근에 지난 일요일 일로 초기화합니다.(권장)
--2006-02-05

 

select trunc(sysdate,'d')+1  from dual;
--시간을 없애고 일을 가장최근에 지난 월요일 일로 초기화합니다.

select trunc(sysdate,'d')-1  from dual;
--시간을 없애고 일을 가장최근에 지난 토요일 일로 초기화합니다.

 

select trunc(sysdate,'ww') from dual;
--시간을 없애고 일을 가장최근에 지난 일요일 일로 초기화합니다.
--2006-02-05

 

select trunc(sysdate,'mm') from dual;
--시간을 없애고 일을 1로 초기화합니다.
--2006-02-01

 

select trunc(sysdate,'Y') from dual;
select trunc(sysdate,'YY') from dual;
select trunc(sysdate,'YYY') from dual;
select trunc(sysdate,'YYYY') from dual;
--시간을 없애고 년도는 올해 년도와 월과 일을 모두 1 로 변경하여 출력합니다.

ex. 2006-01-01

 

SELECT TO_CHAR(SYSDATE,'YYYYMMDD') FROM DUAL;

SELECT TO_CHAR('20070715') FROM DUAL;

-- 현재 날짜를 YYYYMMDD 형식으로 출력한다.(자주사용)

 

8자리일자와 6자리시간을 문자열로 출력

select

to_char(sysdate, 'yyyymmdd') ,

to_char(sysdate, 'hh24miss')

from dual

 

6.날짜 관련 쿼리 예제

 

해당일이 그달의 몇째주인지 알아내기(w)

SELECT to_char(to_date('20061224', 'yyyymmdd'), 'w') FROM dual;

 

해당년도의 전체 일수 구하기

SELECT to_date('20001231', 'YYYYMMDD') - to_date('20000101', 'YYYYMMDD') from dual  
SELECT TO_CHAR (TO_DATE (:yyyy || '1231'), 'ddd') ilsu FROM DUAL 
-- 위의 쿼리는 년도를 변수로 사용하였다.

 

UPDATE tab1 SET logdate = sysdate, ismodify = 1 WHERE logdate < sysdate-7

--기록된 날짜(LOGDATE)가 현재날짜(SYSDATE)로부터 일주일이 지났으면

--SYSDATE를LOGDATE에 쓰고 날짜가 바뀌었다는 기록을 남기는(ISMODYFY = 1) 쿼리

 

UPDATE tab1 SET logdate = sysdate, ismodify = 1 WHERE logdate < TRUNC(sysdate,'d')

기록된 날짜(LOGDATE)가 일요일이 한번이라도 지났다면, 즉 이번주 일요일부터 토요일간의 기록이라면 그대로 두고 그 이상 오래된 경우 현재날짜(SYSDATE)를 LOGDATE에 남기는 쿼리

 

select ename,job,hiredate from emp where hiredate between '1981-02-20' and '1981-05-01';
--1981년02월20일부터 1985년05월01일까지의 레코드를 검색한다.(꼭옛날날짜에서최근날짜로검색)

 

select ename,(sysdate - hiredate)/7 week from emp;
--sysdate함수로 현재 날짜시간에서 입사날짜(hiredate)를 빼면 일수가나오고 거기서 7을 나누어

--근무한 주수를 알수있습니다.

 

select * from emp where hiredate='1980/12/17';
--날짜 비교는 ''을 이용하여 비교합니다.

 

select months_between(sysdate,hiredate)/12 ,hiredate from emp;
--오늘날짜에서 입사날짜를 빼서 달수를 구한후 12을 나누어 근무한 년수를 구할수있다.

 

select months_between(to_date(20011129,'yyyymmdd'),to_date(20020228,'yyyymmdd')) from dual;

--첫번째 날짜에서 두번째 날짜를 빼서 달수로 구한다.

 

select round(months_between(sysdate,hiredate)/12) ,hiredate from emp;
--소수점이 있는 결과에서 반올림합니다.

select trunc(months_between(sysdate,hiredate)/12) ,hiredate from emp;
--소수점이 있는 결과에서 버림합니다.

 

ADD_MONTHS 함수예제

 

SELECT ADD_MONTHS(HIREDATE,2) FROM EMP;

-- HIREDATE값에 2달를 더하여 출력

 

SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-1), 'YYYYMMDD'),

TO_CHAR(SYSDATE-30, 'HH24MIDD') FROM DUAL;

-- DATE형 현재 날짜시간에서 1달을 뺀후 출력

 

SELECT TO_CHAR(ADD_MONTHS(TO_DATE('20060907230000','YYYYMMDDHH24MISS'),

-1),'YYYYMMDDHH24MI') FROM DUAL;

-- CHAR형 현재 날짜시간에서 1달을 뺀후 출력

 

select add_months(to_date('200706'||'01','yyyymmdd'),-1) from dual

-- 20070601에서 한달을 뺍니다.

 

select add_months(hiredate,-2) from emp;
--입사날짜에서 2달을 빼서 출력합니다.

 

select hiredate+100 from emp;
--입사날짜에서 100일을 더합니다.

 

select hiredate-100 from emp;
--입사날짜에서 100일을 뺍니다.

 

LAST_DAY() 함수

해당 날짜에 달에 마지막 일의 날짜를 출력한다.

사용예제

SELECT LAST_DAY('2006-05-05') FROM DUAL;
--2006-05-31

SELECT LAST_DAY(SYSDATE) FROM DUAL;
--2006-05-31 오후 10:35:51

 

※oracle에서는 날짜함수에(sysdate) 산술연산이 가능합니다.

1일->1

1시간->1/24

1분->1/24/60

1초->1/24/60/60

 

select sysdate-1 from dual;
--지금 시간 기준으로 1일전

 

select sysdate-(1/24) from dual;
--지금 시간 기준으로 1시간전

 

select sysdate+1/24/60*1 from dual;
--지금 시간 기주으로 1분전

 

select sysdate+1/24/60*10 from dual;
--지금 시간 기주으로 10분전

 

select to_date(200611210800,'yyyymmdd hh24miss')+ 10/24 from duaL;
--10시간을 더한다.

 

select to_char(to_date('2005-05-05'),'d') from account;
--날짜를 숫자형식의 요일로 출력(1-일요일,7-토요일)

select to_char(to_date('2005-05-05'),'day') from account;
--날짜를 알파벳요일로 출력

select to_char(to_date('2005-05-05'),'year') from account;
--날짜를 알파벳년도로 출력

 

select to_char(to_date('2005-05-05'),'month') from account;
-- 월을 영문으로 완벽하게 출력

 

select to_char(to_date('2005-05-05'),'mon') from account;
-- 월을 영문 앞 3글자만 출력

 

select  decode(to_char(to_date('2005-05-05'),'d'),
              '2','1',
              '3','2',
              '4','3',
              '5','4',
              '6','5',
              '7','6',
              '1','7') "요일"
from   dual;

--날짜의 요일을 숫자로 출력(1-월요일,7-일요일)

 

DATE형 컬럼 비교시

 

SELECT * FROM TABLE_NAME WHERE FDATE < to_date('20070711','YYYYMMDD')

 

6. 프로그래밍 언어에서 날짜 검색시 방법

 

날짜 관련 컬럼은 DATE, CHAR(8), NCHAR(8)을 주지만 DATE는 7바이트이다.

 

DATE형은 아래와 같이 검색 조건을 사용한다.

 

WHERE A_DATE BETWEEN '2005-10-10' AND '2005-10-30';

WHERE A_DATE BETWEEN TO_DATE('2005-10-10') AND TO_DATE('2005-10-30');

 

CHAR(8), NCHAR(8)형은 아래와 같이 검색조건을 사용한다.

 

WHERE A_DATE BETWEEN '20051010' AND '20051030';

 

두가지의 장단점을 알아보자

 

7. 해당 시간이 현재 24시간이 지났는지 알수 있는 쿼리

 

SELECT CASE WHEN SYSDATE - TO_DATE('20070727','YYYYMMDD') >= 1

THEN 'Y' ELSE 'N' END RESUAL FROM DUAL;

※ SYSDATE가 날짜형이므로 빼주는 값도 날짜형이어야 합니다.

 

SELECT round(to_date('95/05/25'),'DAY') 
FROM dual
1995/05/28 00:00:00

SELECT TRUNC(TO_DATE('95/05/25'), 'DAY') 
FROM dual
1995/05/21 00:00:00

 

문제는 day 함수에 있습니다. 
day함수는 요일을 나타내죠. 
따라서 to_date('95/05/25')를 day로 표시하면 수요일이 나옵니다. 
위에 쿼리는 그걸 반올림하였으니 그 주에 가장 큰 28일이 나왔구요, 
아래 쿼리는 그걸 잘라내버렸으니 그 주에 가장 작은 21일이 나온 겁니다.

 

SELECT SYSDATE +  2/24 FROM DUAL;

-- 현재시간의 2시간후에 시간을 출력

SELECT SYSDATE -  2/24 FROM DUAL;

-- 현재시간의 2시간전의 시간을 출력

 

select  to_char(trunc(sysdate), 'rrrr/mm/dd') A from dual;
select  to_char(trunc(sysdate), 'yyyy/mm/dd') A from dual;

YYYY포맺은 현재를 기준으로 합니다.

RRRR기준은 .년도의 뒷자리를 기준으로
2000년도 기준으로 보면
0-49 년은 after year 35/12/12 ->2055/12/12
50-99 년은 before year 51/12/12 ->1951/12/12
가 됨니다.

 

8. 날짜 관련 함수

 

SYSDATE 함수

? 현재 시스템 날짜를 출력

SELECT SYSDATE FROM DUAL;

-- ORACLE 10g XE 에서 출력되는 날짜형식

-- 2008-05-17 오후 5:15:17

 

LAST_DAY 함수

? 해당 날짜의 달에서 마지막 일을 출력

SELECT LAST_DAY(SYSDATE) FROM DUAL;

--2008-05-31 오후 5:16:54

저작자 표시 비영리 변경 금지
신고

[SQL] OUTER JOIN시 T-SQL과 ANSI SQL의 차이의 경우


http://blog.naver.com/eyelee22?Redirect=Log&logNo=70033481407  


T-SQL의 경우는 조인후 WHERE이 있더라도 조인 이전에 WHERE절을 수행해서 결과값이 더 많이 나오는 경우가


나올수있다.


ANSI SQL을 사용하면 ON 뒤에 쓰면 조인 이전에 filter가 되고 WHERE에 놓으면 JOIN 이후에 Filter 되어진다.



저작자 표시 비영리 변경 금지
신고