캠핑과 개발

Oracle

 ** 윈도우 서버 HOST명은 제어판 -> 시스템 -> 컴퓨터 이름의 전체 컴퓨터 이름이다.

 SQL*PLUS
  ** 사용자의 생성 및 변경, 권한 부여는 SYS와 SYSTEM 사용자만이 할 수 있다

  사용자
   ** 사용자가 사용할 테이블스페이스를 만든 다음 사용자 생성시 해당 테이블스페이스를 지정한다
      
   SYS/CHANGE_ON_INSTALL AS SYSDBA  /* 오라클 슈퍼 사용자 ID */
   SYSTEM/MANAGER                               /* 오라클 데이타베이스를 유지보수 관리할때 사용하는 사용자 ID */
   SCOTT/TIGER                                       /* SAMPLE 사용자 ID */
   HR/HR                                                   /* SAMPLE 사용자 ID */

   CONNECT 또는 CONNECT 사용자ID/패스워드                   /* 로그온 */

   CREATE USER 사용자명 IDENTIFIED BY 패스워드;   /* 사용자 생성과 패스워드 설정 */
   CREATE USER 사용자명 IDENTIFIED BY 패스워드   /* 사용자 생성시 테이블스페이스 지정 */
   DEFAULT TABLESPACE 테이블스페이스명 
   TEMPORARY TABLESPACE 테이블스페이스명;
   ALTER USER 사용자명 DEFAULT TABLESPACE 테이블스페이스명; /* 사용자 디폴트 테이블스페이스 변경 */
   ALTER USER 사용자명 IDENTIFIED BY 패스워드;   /* 사용자 패스워드 변경 */   
   ALTER USER 사용자명 PASSWORD EXPIRRE;    /* 사용자 패스워드 무효 */
   ALTER USER 사용자명 ACCOUNT LOCK;    /* 사용자 접속 금지 */
   ALTER USER 사용자명 ACCOUNT UNLOCK;    /* 사용자 접속 허용 */
   DROP USER 사용자명      /* 사용자 삭제 */
   DROP USER 사용자명 INCLUDING CONTENTS;    /* 사용자와 관련된 모든 정보 삭제 */

  권한  
   ** 사용자를 만든후 해당 사용자에게 권한을 부여 해야 한다
   ** 오브젝트 권한 ALL(ALTER, DELETE, INDEX, INSERT, REFERENCE, SELECT, UPDATE)을 사용하여
      테이블에 한번에 모든 권한을 부여할 수 있거나 원하는 권한만 부여할 수 있다
      뷰는 DELETE, INSERT, SELECT, UPDATE, 시퀀스는 ALTER, SELECT, 프로시저는 EXECUTE 권한을 줄 수 있다
   ** 120여개나 되는 권한을 일일이 부여하는 단점을 해결하기 위해 ROLE을 사용한다
    GRANT 권한1, 권한2, ... TO 사용자명                    /* 사용자에 권한 부여 */

   GRANT CREATE SESSION TO 사용자명;               /* 데이타베이스에 접속할 수 있는 권한 */
   GRANT CREATE TABLE TO 사용자명;                   /* 테이블을 만들수 있는 권한 */
   GRANT SELECT ON 테이블명 TO 사용자명;           /* 테이블의 SELECT 권한 */
   GRANT ALL ON 테이블명 TO 사용자명;                 /* 테이블에서 처리할 수 있는 모든 권한 */
   GRANT EXECUTE 프로시저명 TO 사용자명;           /* 프로시저를 실행할 수 있는 권한 */
   GRANT SELECT ON A사용자명.테이블명 to B사용자명 /* A사용자 테이블의 SELECT 권한을 B사용자에게 부여 */
   REVOKE 권한1, 권한2, ... FROM 사용자명;             /* 사용자의 권한 취소 */
   REVOKE CREATE SESSION FROM 사용자명;         /* 데이타베이스에 접속할 수 있는 권한 취소 */
   REVOKE CREATE VIEW FROM 사용자명;               /* 뷰를 만들수 있는 권한 취소 */
   
   롤(ROLE)
    CONNECT             /* 데이타베이스에 접속할 수 있는 권한을 가진 롤 */
    RESOURCE            /* 테이블, 인덱스, 뷰등을 생성, 변경, 삭제할 수 있는 권한을 가진 롤 */
    DBA                      /* 데이타베이스를 관리하기 위해 필요한 권한을 가진 롤 */
    RXP_FULL_DATABASE  /* EXPORT 툴을 사용할 수 있는 권한을 가진 롤 */
    IMP_FULL_DATABASE  /* IMPORT 툴을 사용할 수 있는 권한을 가진 롤 */
    SYSDBA               /* 데이타베이스 시작과 종료및 모든 관리를 하기 위한 필요한 권한을 가진 롤 */
    SYSOPER             /* SYSDBA 권한을 포함 데이타베이스를 생성할 수 있는 권한을 가진 롤 */

    GRANT 롤1, 롤2, ... TO 사용자명;                 /* 사용자에게 롤 권한 부여 */
    REVOKE 롤1, 롤2, ... FROM 사용자명;           /* 사용자의 롤 권한 취소 */

  자료 사전(DATA DICTIONARY)
   ** 특정 테이블에 관련된 자료사전이 어떤 것인지 알고 싶을때는 DICTIONARY 테이블의
      COMMENTS 칼럼에 특정 테이블과 관련된 문자열을 찾아보면 된다

   DBA_xxxx        /* DB 전체의 관련된 정보로 SYS, SYSTEM 사용자만 볼 수 있다 */
   ALL_xxxx        /* 자신이나 다른 사용자가 생성한 오브젝트중에 자신이 볼 수 있는 정보 */
   USER_xxxx      /* 자신이 생성한 오브젝트 정보 */
   V$_xxxx          /* DB의 성능 분석, 통계 정보를 제공하면 X$의 뷰 */
   X$_xxxx          /* DB의 성능 분석, 통계 정보 */

   SELECT * FROM DICTIONATY;         /* 모든 상태 정보 */
   SELECT * FROM ALL_USERS;          /* 사용자 ID 리스트 */
   SELECT * FROM USER_USERS;       /* 사용자 정보 */
   SELECT * FROM USER_CONSTRAINTS;    /* 제약 정보 */
   SELECT * FROM USER_TABLESPACES    /* 테이블스페이스 정보 */
   SELECT * FROM USER_TABLES;     /* 테이블 정보 */

   SELECT * FROM DBA_ROLES;                              /* 전체 롤, SYS, SYSTEM에서 사용 */
   SELECT * FROM USER_ROLE_PRIVS;                   /* 현재 사용자에게 부여된 롤 확인 */
   SELECT * FROM ROLE_SYS_PRIVS WHERE ROLE=롤명;    /* 해당 롤이 어떤 권한을 가지고 있는지 확인 */
   SELECT * FROM USER_TAB_PRIVS_RECD;          /* 오브젝트에서 부여 받은 권한 */
   
 TableSpace(테이블스페이스)
  - SYSTEM 테이블스페이스
  ** 사용자2010-05-12 생성시 별도의 테이블스페이스를 지정하지 않으면 시스템으로 지정된다
  시스템이 사용자 데이타 포함을 허용하더라도 사용하지 말아야 한다

   데이타베이스와 함께 생성되고 모든 데이타베이스에서 필요하다
   데이타 딕셔너리 정보를 포함한다
   시스템 실행 취소 세그먼트를 포함한다
  - UNDO 테이블스페이스
   SQL문을 실행한 후 트랜잭션을 ROLLBACK 하기 위해 변경 이전의 데이타를 저장한다
  - TEMP 테이블스페이스
   SQL문을 실행할 때 내부 분류작업(GROUP BY, ORDER BY, ...)을 위해 사용한다
   USERS 테이블스페이스
   사용자가 테스트할 수 있는 저장공간이다
   
  - CREATE TABLESPACE 테이블스페이스명        /* 자동 확장 테이블스페이스를 만들기 */
   DATAFILE 디렉토리와파일명 SIZE 크기
   AUTOEXTEND ON NEXT 크기 MAXSIZE 크기;   /* 자동으로 NEXT 만큼 확장 MAXSIZE는 지정하지 않아도 된다 */
  ALTER TABLESPACE RENAME 테이블스페이스명 TO 새테이블스페이스명;  /* 테이블스페이스명 변경 */
  ALTER TABLESPACE 테이블스페이스명 RENAME           /* 물리적인 데이타 파일 변경 */
   DATAFILE 'c:\oracle\oradata\jerry01.dbf' TO 'c:\oracle\oradata\aaa\jerry01.dbf';
  ALTER USER 사용자명 TEMPORARY TABLESPACE 템프테이블스페이스명;   
  /* 사용자의 기본 템프데이블스페이스 변경 */ 
  DROP TABLESPACE 테이블스페이스명 INCLUDING CONTENTS;
  ** 테이블스페이스를 삭제하더라도 관련 데이타 파일은 삭제되지 않기 때문에
      탐색기에서 직접 삭제해야 한다

  테이블 스페이스 및 사용자 생성
   ** 테이블 스페이스는 저장 영역 및 임시 테이블 스페이스 두개가 필요하지만
      임시 테이블 스페이스는 기본으로 정해져 있는 TEMP TABLESPACE 영역을 사용해도 된다

   1. CREATE TABLESPACE ts_name
       DATAFILE '/home/oracle/data/ts_name.dbf' SIZE 100M
      AUTOEXTEND ON NEXT 10M
   2. CREATE TEMPORARY TABLESPACE ts_name_temp TEMPFILE '/home/oracle/data/ts_name_temp.dbf' SIZE 10M
    EXTENT MANAGEMENT LOCAL UNIFORM SIZE 512K              
   3. CREATE USER 사용자명 IDENTIFIED BY 패스워드
       DEFAULT TABLESPACE ts_name         
       TEMPORARY TABLESPACE ts_name_temp  
   4. GRANT CONNECT, RESOURCE TO 사용자명

 Table(테이블)
  ** 제약 조건에는 PRIMARY KEY, FOREIGN KEY, CHECK, UNIQUE, NOT NULL이 있다

  CREATE TABLE 테이블명 (칼럼 데이타형 제약, ...);          /* 테이블 만들기 */
  CREATE TABLE 테이블명 (칼럼1 데이타형, ...                  /* 기본 키 설정 */
                         CONSTRAINT 이름 RPIMARY KEY (칼럼1));
  ALTER TABLE 테이블명 DROP PRIMARY KEY;                 /* 기본 키 삭제 */
  ALTER TABLE 테이블명 DROP CONSTRAINT 제약명;        /* 제약 조건 삭제 */
  ALTER TABLE 테이블명 MODIFY (칼럼 데이타형, ...);        /* 칼럼의 타입 변경 */
  ALTER TABLE 테이블명 ADD (칼럼 데이타형, ...);              /* 칼럼 추가 */
  ALTER TABLE 테이블명 DROP COLUMN 칼럼;                  /* 칼럼 삭제 */
  ALTER TABLE 테이블명 RENAME COLUMN 칼럼명 TO 새칼럼명   /* 칼럼명 변경 */
  ALTER TABLE 테이블명 MOVE TABLESPACE 테이블스페이스명;  /* 테이블의 테이블스페이스 변경 */
  DROP TABLE 테이블명;                                                 /* 테이블 삭제 */
  RENAME 테이블명 TO 새테이블명;                                  /* 테이블명 변경 */
  TRUNCATE TABLE 테이블명;                                         /* 테이블내의경 데이타 삭제 */

  SELECT * FROM 테이블명;                   /* 현재 사용자인 경우 사용자명은 생략 */
  SELECT * FROM 사용자명.테이블명;      /* 다른 사용자인 경우 해당 사용자명을 지정 */
  SELECT * FROM DBA_CONSTRAINTS   /* 테이블별 CONSTRAINT(제약, PRIMARY KEY, FOREIGN KEY..) */
   WHERE OWNER=사용자명 AND TABLE_NAME=테이블명;
  SELECT USER FROM DUAL;                 /* 현재 사용자명 확인 */
  SELECT SYSDATE FROM DUAL;           /* 오늘 날짜 확인 */
  SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD') FROM DUAL;     
   ** 오라클에서는 테이블없이 SELECT문의 결과를 보고자 할때 DUAL을 사용한다
  DESC 테이블명;                                   /* 테이블 구조 */

 Sequence(시퀀스)
  ** MSSQL, MySql의 자동 증가와 같은 역할을 한다
     SEQUENCE가 한번 증가되면 데이타가 삭제 되어도 다시 사용할 수 없다
  
  CREATE SEQUENCE 시퀀스명 INCREMENT BY n     /* 증가값 */
                           START WITH n                             /* 시작값 */
      MAXVALUE n | NOMAXVALUE                           /* 최대값/최대값 지정하지 않음 */
      MINVALUE n | NOMINVALUE                             /* 최소값/최소값 지정하지 않음 */
      CYCLE | NOCYCLE                                          /* CYCLE은 최대값까지 증가가 완료되면 다시 START로 돌아간다
                                                                                 NOCYCLE은 증가가 완료되면 에러를 발생시킨다 */
      CACHE n | NOCACHE                                       /* 시퀀스를 메모리에서 관리하며 기본값은 20 */
  CREATE TABLE Temp (id number, name varchar(20));
  CREATE SEQUENCE sqe (INCREMENT BY 1, START WITH 1, NOCYCLE, NOCACHE);
  INSERT INTO Temp (id, name) VALUES (seq.NEXTVAL, '홍길동');
  
 Synonym(시노늄)
  ** 이름이 긴 다른 사용자의 객체를(사용자명.테이블명) 요약 해서 사용한다
     PUBLIC 키워드는 데이타베이스내 모든 사용자들이 시노늄을 사용할 수 있게 한다

  CREATE PUBLIC SYNONYM 시노늄명 FOR 사용자명.테이블명;  
  CREATE PUBLIC SYNONYM Emp FOR hr.employee;
  SELECT * FROM Emp;

 View(뷰)
  ** REPLACE 명령을 사용하면 만들거나 수정할때마다 다시 컴파일을 한다

  CREATE OR REPLACE VIEW 뷰명 AS SELECT 칼럼1, 칼럼2, ... FROM 테이블명 WHERE 조건;
  DROP VIEW 뷰명;

 Procedure(프로시저)
  ** IN     실행 환경에서 프로시저로 값 전달
     OUT    프로시저에서 실행 환경으로 값을 리턴
     IN OUT 실행 환경에서 프로시저로 값 전달, 프로시저에서 실행 환경으로 변경된 값 리턴
  ** REPLACE 명령을 사용하면 만들거나 수정할때마다 다시 컴파일을 한다
    
  CREATE OR REPLACE PROCEDURE 프로시저명    /* 프로시저 생성 */
      (파라미터1 데이타타입, 파라미터2 OUT 데이타타입, 파라미터3 IN OUT 데이타타입)
  IS
      변수 선언;
  BEGIN
      프로그램;
  END;
  DROP PROCEDURE 프로시저명;                /* 프로시저 삭제 */



MSSQL 
 ** SQL문은 대소문자를 구분하지 않지만 데이타는 대문자와 소문자를 구분한다
    주석을 다는 방법은 /* 주석 */ 이거나 한줄만 주석 처리를 할 경우는 문장 맨앞에 --를 붙인다
 ** 각각의 데이타베이스의 SYSOBJECTS 테이블에 해당 데이타베이스의 모든 정보가 보관되어 있다
    SYSOBJECTS의 TYPE 칼럼으로 'U'=사용자 테이블, 'P'=저장 프로시저, 'K'=프라이머리 키, 'F'=포린 키,
    'V'=뷰, 'C'=체크 제약등 오브젝트 이름과 정보를 알 수 있다

 데이타 검색
  USE 데이타베이스명     /* USE 문을 사용한 데이타베이스 선택 */
  SELECT * FROM 데이블명     /* 모든 칼럼 불러오기 */
  SELECT TOP n * FROM 테이블명    /* 상위 n개의 데이타만 가져오기 */
  SELECT 칼럼1, 칼럼2, 칼럼3 FROM 테이블명  /* 특정 칼럼 가져오기 */
  SELECT 칼럼1 별명1, 칼럼2 AS 별명2 FROM 테이블명 /* 칼럼에 별명 붙이기 */
  SELECT 칼럼3 '별  명3' FROM 테이블명                    /* 칼럼 별명에 스페이스가 들어갈 경우는 작은따옴표 사용 */
  SELECT DISTINCT 칼럼 FROM 테이블명                      /* 중복되지 않는 데이타만 가져오기 */
   ** 데이타는 오름차순으로 재배열된다
      DISTINCT를 사용하면 재배열이 될때까지 데이타가 리턴되지 않으므로 수행 속도에 영향을 미친다 */
  SELECT * FROM 테이블명 WHERE 조건절                     /* 조건에 해당하는 데이타 가져오기 */
   ** 조건식에 사용하는 비교는 칼럼=값, 칼럼!=값, 칼럼>값, 칼럼>=값, 칼럼<값, 칼럼<=값이 있다
      문자열은 ''(작은따옴표)를 사용한다
      날짜 비교를 할때는 'yy-mm-dd' 형식의 문자열로 한다(날짜='1992-02-02', 날짜>'1992-02-02')
  SELECT * FROM 테이블명 WHERE 칼럼 BETWEEN x AND y       /* 칼럼이 x>=와 y<=사이의 데이타 가져오기 */
  SELECT * FROM 테이블명 WHERE 칼럼 IN (a, b...)          /* 칼럼이 a이거나 b인 데이타 가져오기 */
  SELECT * FROM 테이블명 WHERE 칼럼 LIKE '패턴'           /* 칼럼이 패턴과 같은 데이타 가져오기 */
   ** 패턴에 사용되는 기호는 %, _가 있다
      'k%'(k로 시작되는), '%k%'(중간에 k가 있는), '%k'(k로 끝나는)
      'p_'(p로 시작하는 2자리), 'p___'(p로 시작하는 4자리), '__p'(3자리 데이타중 p로 끝나는)
  SELECT * FROM 테이블명 WHERE 칼럼 IS NULL               /* 칼럼이 NULL인 데이타 가져오기 */
  SELECT * FROM 테이블명 WHERE 칼럼 NOT BETWEEN x AND y   /* 칼럼이 x와 y 사이가 아닌 데이타 가져오기 */
  SELECT * FROM 테이블명 WHERE 칼럼 NOT IN (a, b...)      /* 칼럼이 a나 b가 아닌 데이타 가져오기 */
  SELECT * FROM 테이블명 WHERE 칼럼 NOT LIKE '패턴'       /* 칼럼이 패턴과 같지 않은 데이타 가져오기 */
  SELECT * FROM 테이블명 WHERE 칼럼 IS NOT NULL           /* 칼럼이 NULL이 아닌 데이타 가져오기 */
  SELECT * FROM 테이블명 WHERE 칼럼>=x AND 칼럼<=y       
  SELECT * FROM 테이블명 WHERE 칼럼=a or 칼럼=b
  SELECT * FROM 데이블명 WHERE 칼럼1>=x AND (칼럼2=a OR 칼럼2=b)
   ** 복수 조건을 연결하는 연산자는 AND와 OR가 있다
      AND와 OR의 우선순위는 AND가 OR보다 높은데 우선 순위를 바꾸고 싶다면 ()을 사용한다
  SELECT * FROM 테이블명 ORDER BY 칼럼                    /* 칼럼을 오름차순으로 재배열하기 */
  SELECT * FROM 테이블명 ORDER BY 칼럼 ASC               
  SELECT * FROM 테이블명 ORDER BY 칼럼 DESC               /* 칼럼을 내림차순으로 재배열하기 */
  SELECT * FROM 테이블명 ORDER BY 칼럼1 ASC, 칼럼2 DESC   /* 복수 칼럼 재배열하기 */
  SELECT * FROM 테이블명 ORDER BY 1 ASC, DESC 3           /* 칼럼 순서로 재배열하기 */
          ** 기본적으로 SELECT 문에서는 출력순서가 보증되지 않기 때문에
      데이타의 등록 상태나 서버의 부하 상태에 따라 출력되는 순서가 달라질 수 있다
      따라서 출력하는 경우 되도록이면 ORDER BY를 지정한다
   ** 칼럼 번호는 전체 칼럼에서의 번호가 아니라 SELECT문에서 선택한 칼럼의 번호이고 1부터 시작한다

 연산자
  ** 1순위는 수치 앞에 기술되는 + - 같은 단항 연산자
     2순위는 사칙 연산의 산술 연산자인  * / + -
     3순위는 = > 비교 연산자
     4순위는 AND OR 같은 논리 연산자
     ()을 붙이면 우선 순위를 바꿀수 있다

  1. SELECT 문의 연산
     SELECT 칼럼1, 칼럼2, 칼럼3+칼럼4 AS '별명' FROM 테이블명
  2. ORDER BY 구의 연산
     SELECT 칼럼1, 칼럼2, 칼럼3+칼럼4 AS '별명' FROM 테이블명 ORDER BY 칼럼3+칼럼4 DESC
     SELECT 칼럼1, 칼럼2, 칼럼3+칼럼4 AS '별명' FROM 테이블명 ORDER BY 3 DESC
  3. WHERE 구의 연산
     SELECT 칼럼1, 칼럼2, 칼럼3+칼럼4 AS '별명' FROM 테이블명 WHERE 칼럼2>=(칼럼3+칼럼4)
  4. NULL 연산
     SELECT 칼럼1, 칼럼2, ISNULL(칼럼3, 0) + ISNULL(칼럼4, 0) AS '별명' FROM 테이블명
   ** 수치형 데이타와 NULL값과의 연산 결과는 항상 NULL이다
      만약 NULL 값을 원치 않으면 ISNULL(칼럼, 기준값) 함수를 사용해서 기준값을 변환시킨다
  5. 날짜 연산  
     SELECT GETDATE()                                    /* 서버의 현재 날짜를 구한다 */
     SELECT 날짜칼럼, 날짜칼럼-7 FROM 테이블명
     SELECT 날짜칼럼, 날짜칼럼+30 FROM 테이블명
     SELECT 날짜칼럼, DATEDIFF(day, 날짜칼럼, GETDATE()) FROM 테이블명
   ** 날짜의 가산과 감산은 + -로 할 수 있다
      날짜와 날짜 사이의 계산은 DATEDIFF(돌려주는값, 시작날짜, 끝날짜) 함수를 사용한다
  6. 문자 연산
     SELECT 칼럼1 + 칼럼2 FROM 테이블명
     SELECT 칼럼 + '문자열'  FROM 테이블명
     SELECT 칼럼1 + '문자열' + 칼럼2 FROM 테이블명
   ** 기본 연결은 문자와 문자이고 문자와 숫자의 연결은 CONVERT 함수를 사용해야 한다

 함수
  1. 수치 함수
     ROUND(수치값, 반올림위치)            /* 반올림 및 자르기 */
     ABS(수치 데이타)                     /* 절대값 */   
     SIGN(수치 데이타)                    /* 부호 */
     SQRT(수치값)                         /* 제곱근 */
     POWER(수치값, n)                     /* n승 */
  2. 문자열 함수
     SUBSTRING(문자열, 위치, 문자수)      /* 특정 위치 문자열 추출 */
     LEFT(문자열, 문자수)                 /* 왼쪽부터 지정한 갯수 문자열 추출 */
     RIGHT(문자열, 문자수)                /* 오른쪽부터 지정한 갯수 문자열 추출 */
     LEN(문자열)                          /* 문자열의 문자수 */
     LTRIM(문자열)                        /* 문자열 왼쪽의 스페이스를 삭제 */
     RTRIM(문자열)                        /* 문자열 오른쪽의 스페이스를 삭제 */
     UPPER(문자열)                        /* 대문자로 변환 */
     LOWER(문자열)                        /* 소문자로 변환 */
   ** 위치나 문자수는 한글일 경우 2바이트가 한글자로 취급된다
      SELECT LEN('월abcd화수목')은 8을 돌려준다
  3. 날짜 함수
     GETDATE()                                /* 현재 날짜와 시각 */
     DATEADD(돌려주는값, 기간, 날짜)          /* 날짜 및 시간의 더하기와 빼기 */
     DATEDIFF(돌려주는값, 시작날짜, 끝날짜)   /* 두 날짜와 시간의 차이 */
     DATEPART(돌려주는값, 날짜)               /* 날짜와 시간의 특정값을 돌려준다 */
   ** 돌려주는값(약어)
      Year-yy, Quarter-qq, Month-mm, DayofYear-dy, Day-dd, Week-wk,
      Hour-hh, Minute-mi, Second-ss, Milisecond-ms
      SELECT DATEADD(dd, 7, 날짜칼럼) 
  4. 형변환 함수
     CONVERT(데이타 타입, 칼럼)                 /* 칼럼을 원하는 데이타 타입으로 변환 */
     CONVERT(데이타 타입, 칼럼, 날짜형 스타일)  /* 원하는 날짜 스타일로 변환 */
     CAST(칼럼 AS 데이타 타입)                  /* 칼럼을 원하는 데이타 타입으로 변환 */
   ** 스타일
      1->mm/dd/yy, 2->yy.mm.dd, 3->dd/mm/yy, 4->dd.mm.yy, 5->dd-mm-yy,
      8->hh:mm:ss, 10->mm-dd-yy, 11->yy/mm/dd, 12->yymmdd
      SELECT CONVERT(varchar(10), 날짜칼럼, 2)

 그룹화
  함수
   SELECT COUNT(*) FROM 테이블명               /* 전체 데이타의 갯수 가져오기 */
   SEELECT COUNT(칼럼) FROM 테이블명           /* NULL은 제외한 칼럼의 데이타 갯수 가져오기 */
   SELECT SUM(칼럼) FROM 테이블명              /* 칼럼의 합계 구하기 */
   SELECT MAX(칼럼) FROM 테이블명              /* 칼럼의 최대값 구하기 */
   SELECT MIN(칼럼) FROM 테이블명              /* 칼럼의 최소값 구하기 */
   SELECT AVG(칼럼) FROM 테이블명              /* 칼럼의 평균값 구하기 */
  GROUP BY문
   SELECT 칼럼 FROM 테이블명 GROUP BY 칼럼  
   SELECT 칼럼1, SUM(칼럼2) FROM 테이블명 GROUP BY 칼럼1
   SELECT 칼럼1, COUNT(*) FROM 테이블명 GROUP BY 칼럼1
   SELECT 칼럼1, 칼럼2, MAX(칼럼3) FROM 테이블명 GROUP BY 칼럼1, 칼럼2
    ** GROUP BY를 지정한 경우 SELECT 다음에는 반드시 GROUP BY에서 지정한 칼럼 또는
       그룹 함수만이 올 수 있다
  조건
   SELECT 칼럼1, SUM(칼럼2) FROM 테이블명 GROUP BY 칼럼1 HAVING SUM(칼럼2) < a
   SELECT 칼럼1, SUM(칼럼2) FROM 테이블명 ORDER BY 칼럼1 COMPUTE SUM(칼럼2)
    ** HAVING:        그룹 함수를 사용할 경우의 조건을 지정한다
       HAVING의 위치: GROUP BY의 뒤 ORDER BY의 앞에 지정한다
       COMPUTE:       각 그룹의 소계를 요약해서 보여준다
                      ORDER BY가 항상 선행해서 나와야 한다
  조건절의 서브 쿼리
   ** SELECT 또는 INSERTY, UPDATE, DELETE 같은 문의 조건절에서 SELECT문을 또 사용하는 것이다
      SELECT문 안에 또 다른 SELECT문이 포함되어 있다고 중첩 SELECT문(NESTED SELECT)이라고 한다
   ** 데이타베이스에는 여러명이 엑세스하고 있기 때문에 쿼리를 여러개 나누어서 사용하면 데이타의 값이
      달라질수 있기때문에 트랜잭션 처리를 하지 않는다면 복수의 쿼리를 하나의 쿼리로 만들어 사용해야 한다
    SELECT 칼럼1, 칼럼2 FROM 테이블명 WHERE 칼럼2 = (SELECT 칼럼2 FROM 테이블명 WHERE 조건)
    SELECT 칼럼1, 칼럼2 FROM 테이블명 WHERE 칼럼1 IN (SELECT 칼럼1 FROM 테이블명 WHERE 조건)
   ** 서브 쿼리에서는 다른 테이블을 포함할 수 있다
      두개의 테이블에서 읽어오는 서브쿼리의 경우 서브 쿼리쪽에 데이타가 적은 테이블을 주 쿼리쪽에 데이타가
      많은 테이블을 지정해야 처리 속도가 빨라진다
    SELECT 칼럼1, 칼럼2 FROM 테이블명 WHERE 칼럼1 IN (SELECT 칼럼2-1 FROM 테이블명2 WHERE 조건)
   ** FROM구에서 서브 쿼리를 사용할 수 있다
      사용시 반드시 별칭을 붙여야 하고 처리 속도가 빨라진다
    SELECT 칼럼1, 칼럼2 FROM 테이블명 WHERE 조건1 AND 조건2
    SEELCT 칼럼1, 칼럼2 FROM (SELECT 칼럼1, 칼럼2 FROM 테이블명 WHERE 조건1) 별칭 WHERE 조건2

 데이타 편집
  추가
   ** NULL 값을 허용하지도 않고 디폴트 값도 지정되어 있지 않은 칼럼에 값을 지정하지 않은채
      INSERT를 수행하면 에러가 발생한다
   ** 수치값은 그대로 문자값은 ''(작은따옴표)로 마무리 한다
   ** SELECT INTO는 칼럼과 데이타는 복사하지만 칼럼에 설정된 프라이머리, 포린 키등등의 제약 조건은
      복사되지 않기 때문에 복사가 끝난후 새로 설정해 주어야 한다

   INSERT INTO 테이블명 VALUES (값1, 값2, ...)     /* 모든 필드에 데이타를 넣을 때 */
   INSERT INTO 테이블명 (칼럼1, 칼럼2, ...) VALUES (값1, 값2, ...)   /* 특정 칼럼에만 데이타를 넣을 때 */
   INSERT INTO 테이블명 SELECT * FROM 테이블명2                      /* 이미 존재하는 테이블에 데이타 추가 */
   INSERT INTO 테이블명(칼럼1, 칼럼2, ...) SELECT 칼럼1, 칼럼2, ...) FROM 테이블명2
   SELECT * INTO 테이블명 FROM 테이블명2                             /* 새로 만든 테이블에 데이타 추가 */
   SELECT 칼럼1, 칼럼2, ... 테이블명 FROM 테이블명2
   
  갱신
   UPDATE 테이블명 SET 칼럼1=값1, 칼럼2=값2            /* 전체 데이타 갱신 */     
   UPDATE 테이블명 SET 칼럼1=값1, 칼럼2=값2 WHERE 조건               /* 조건에 해당되는 데이타 갱신 */
   
  삭제
   DELETE FROM 테이블명                                              /* 전체 데이타 삭제 */
   DELETE FROM 테이블명 WHERE 조건       /* 조건에 해당되는 데이타 삭제 */

 오브젝트
  ** 데이타베이스는 아래 오브젝트들을 각각의 유저별로 관리를 하는데 Schema(스키마)는 각 유저별 소유 리스트이다

  1. Table(테이블)
   ** CREATE일때 프라이머리 키를 설정하지 않는다면 (칼럼 int IDENTITY(1, 1) NOT NULL) 자동 칼럼을 만든다
      데이타들의 입력 순서와 중복된 데이타를 구별하기 위해서 반드시 필요하다
   ** 테이블 정보 SP_HELP 테이블명, 제약 조건은 SP_HELPCONSTRAINT 테이블명 을 사용한다

   CREATE TABLE 데이타베이스이름.소유자이름.테이블이름 (칼럼 데이타형 제약, ...) /* 테이블 만들기 */
   DROP TABLE 테이블명                                                           /* 테이블 삭제 */
   ALTER TABLE 테이블명 ADD 칼럼 데이타형 제약, ...                              /* 칼럼 추가 */
   ALTER TABLE 테이블명 DROP COLUMN 칼럼                                         /* 칼럼 삭제 */
    ** DROP COLUMN으로 다음 칼럼은 삭제를 할 수 없다
       - 복제된 칼럼
       - 인덱스로 사용하는 칼럼
       - PRIMARY KEY, FOREGIN KEY, UNIQUE, CHECK등의 제약 조건이 지정된 칼럼
       - DEFAULT 키워드로 정의된 기본값과 연결되거나 기본 개체에 바인딩된 칼럼
       - 규칙에 바인딩된 칼럼
   CREATE TABLE 테이블명 (칼럼 데이타형 DEFAULT 디폴트값, ...)                   /* 디폴트 지정 */
   CREATE TABLE 테이블명 (칼럼 데이타형 CONSTRAINT 이름 UNIQUE, ...)             /* 유니크 설정 */
    ** UNIQUE란 지정한 칼럼에 같은 값이 들어가는것을 금지하는 제약으로 기본 키와 비슷하지만
       NULL 값을 하용하는것이 다르다
   CREATE TABLE 테이블명 (칼럼 데이타형 CONSTRAINT 이름 NOT NULL, ...)           /* NOT NULL 설정 */
   CREATE TABLE 테이블명 (칼럼 데이타형 CONSTRAINT 이름 PRIMARY KEY, ...)        /* 기본 키 설정 */
    ** 기본 키는 유니크와 NOT NULL이 조합된 제약으로 색인이 자동적으로 지정되고 데이타를
       유일하게 만들어 준다
    **  기본 키는 한 테이블에 한개의 칼럼만 가능하다
   CREATE TABLE 테이블명 (칼럼 데이타형 CONSTRAINT 이름 FOREIGN KEY REFERENCES 부모테이블이름(부모칼럼), ...)       
   CREATE TABLE 테이블명 (칼럼 데이타형 CONSTRAINT 이름 CHECK(조건), ...)        /* CHECK 설정 */
    ** CHECK는 조건을 임의로 정의할 수 있는 제약으로 설정되면 조건을 충족시키는 데이타만
       등록할 수 있고 SELECT의 WHERE구와 같은 조건을 지정한다
    ** CONSTRAINT와 제약 이름을 쓰지 않으면 데이타베이스가 알아서 이름을 붙이지만
       복잡한 이름이 되기 때문에 되도록이면 사용자가 지정하도록 한다
    ** CONSTRAINT는 칼럼과 데이타형을 모두 정의한 뒤에 맨 마지막에 설정할 수 있다
     CREATE TABLE 테이블명 (칼럼1 데이타형,
             칼럼2 데이타형, ...
             CONSTRAINT 이름 PRIMARY KEY(칼럼1)
                           CONSTRAINT 이름 CHECK(칼럼2 < a) ...)       
   ALTER TABLE 테이블명 ADD CONSTRAINT 이름 제약문                                /* 제약 추가 */
   ALTER TABLE 테이블명 DROP CONSTRAINT 제약명                                    /* 제약 삭제 */
   ALTER TABLE 테이블명 NOCHECK CONSTRAINT 제약명                                 /* 제약 효력 정지 */
   ALTER TABLE 테이블명 CHECK CONSTRAINT 제약명                                   /* 제약 효력 유효 */
    ** 제약명은 테이블을 만들때 사용자가 지정한 파일 이름을 말한다

  2. View(뷰)
   ** 자주 사용하는 SELECT문이 있을때 사용한다
      테이블에 존재하는 칼럼들중 특정 칼럼을 보이고 싶지 않을때 사용한다
      테이블간의 결합등으로 인해 복잡해진 SELECT문을 간단히 다루고 싶을때 사용한다
   ** 뷰를 만들때 COMPUTE, COMPUTE BY, SELECT INTO, ORDER BY는 사용할 수 없고
      #, ##으로 시작되는 임시 테이블도 뷰의 대상으로 사용할 수 없다
   ** 뷰의 내용을 보고 싶으면 SP_HELPTEXT 뷰명 을 사용한다
      
   CREATE VIEW 뷰명 AS SELECT문                            /* 뷰 만들기 */
   CREATE VIEW 뷰명 (별칭1, 별칭2, ...) AS SELECT문    /* 칼럼의 별칭 붙이기 */
   CREATE VIEW 뷰명 AS (SELECT 칼럼1 AS 별칭1, 칼럼2 AS 별칭2, ...)
   ALTER VIEW 뷰명 AS SELECT문                                       /* 뷰 수정 */
   DROP VIEW 뷰명                                                    /* 뷰 삭제 */
   CREATE VIEW 뷰명 WITH ENCRYPTION AS SELECT문                      /* 뷰 암호 */
    ** 한번 암호화된 뷰는 소스 코드를 볼 수 없으므로 뷰를 암호화하기전에
       뷰의 내용을 스크립트 파일로 저장하여 보관한다
   INSERT INTO 뷰명 (칼럼1, 칼럼2, ...) VALUES (값1, 값2, ...)
   UPDATE 뷰명 SET 칼럼=값 WHERE 조건
    ** 원래 테이블에 있는 반드시 값을 입력해야 하는 칼럼이 포함되어 있지 않거나
       원래 칼럼을 사용하지 않고 변형된 칼럼을 사용하는 뷰는 데이타를 추가하거나
       갱신할 수 없다
    ** WHERE 조건을 지정한 뷰는 뷰를 만들었을때 WITH CHECK OPTION을 지정하지 않았다면
       조건에 맞지 않는 데이타를 추가할 수 있지만 뷰에서는 보이지 않는다
       또한 뷰를 통해서 가져온 조건을 만족하는 값도 뷰의 조건에 만족하지 않는 값으로도
       갱신할 수 있다
   CREATE VIEW 뷰명 AS SELECT문 WITH CHECK OPTION
    ** 뷰의 조건에 맞지 않는 INSERT나 UPDATE를 막을려면 WITH CHECK OPTION을 설정한다

  3. Stored Procedure(저장 프로시저)
   ** 데이타베이스내에서 SQL 명령을 컴파일할때 캐시를 이용할 수 있으므로 처리가 매우 빠르다
      반복적으로 SQL 명령을 실행할 경우 매회 명령마다 네트워크를 경유할 필요가 없다
      어플리케이션마다 새로 만들 필요없이 이미 만들어진 프로시저를 반복 사용한다
      데이타베이스 로직을 수정시 프로시저는 서버측에 있으므로 어플리케이션을 다시 컴파일할 필요가 없다
   ** 저장 프로시저의 소스 코드를 보고 싶으면 SP_HELPTEXT 프로시저명 을 사용한다

   CREATE PROC 프로시저명 AS SQL문   /* 저장 프로시저 */
   CREATE PROC 프로시저명 변수선언 AS SQL문 /* 인수를 가지는 저장 프로시저 */
   CREATE PROC 프로시저명 WITH ENCRYPTION AS SQL문 /* 저장 프로시저 보안 설정 */
   CREATE PROC 프로시저명                          /* RETURN 값을 가지는 저장 프로시저 */
       인수1 데이타형, ... 인수2 데이타형 OUTPUT
   AS
       SQL문
       RETURN 리턴값
   DROP PROCEDURE 프로시저명1, 프로시저명2, ...    /* 저장 프로시저 삭제 */
   
   명령어
    BEGIN ... END    /* 문장의 블록 지정 */
    DECLARE @변수명 데이타형  /* 변수 선언 */
    SET @변수명=값    /* 변수에 값 지정 */
    PRINT @변수명    /* 한개의 변수 출력 */
    SELECT @변수1, @변수2   /* 여러개의 변수 출력 */
    IF 조건     /* 조건 수행 */
        수행1
    ELSE
        수행2               
    WHILE 조건1    /* 반복 수행 */
        BEGIN
            IF 조건2
         BREAK    - WHILE 루프를 빠져 나간다
         CONTINUE - 수행을 처리하지 않고 조건1로 되돌아간다
     수행
        END               
    EXEC 저장프로시저   /* SQL문을 실행 */
    EXEC @(변수로 지정된 SQL문)
    GO     /* BATCH를 구분 지정 */

   에제
    1. 기본 저장 프로시저
     CREATE PROC pUpdateSalary AS UPDATE Employee SET salary=salary*2
    2. 인수를 가지는 저장 프로시저
     CREATE PROC pUpdateSalary
         @mul float=2, @mul2 int
     AS
         UPDATE Employee SET salary=salary* @Mul* @mul2
     EXEC pUpdateSalary 0.5, 2       /* 모든 변수에 값을 대입 */
     EXEC pUpdateSalary @mul2=2      /* 원하는 변수에만 값을 대입 */
    3. 리턴값을 가지는 저장 프로시저
     CREATE PROC pToday
         @Today varchar(4) OUTPUT
     AS
         SELECT @Today=CONVERT(varchar(2), DATEPART(dd, GETDATE()))
         RETURN @Today
     DECLARE @answer varchar(4)
     EXEC pToday @answer OUTPUT
     SELECT @answer AS 오늘날짜
    4. 변수 선언과 대입, 출력
     ** @는 사용자 변수이고 @@는 시스템에서 사용하는 변수이다

     DECLARE @EmpNum int
     SET @EmpNum=10
     SELECT @EmpNum

  4. Trigger(트리거)
   ** 한 테이블의 데이타가 편집(INSERT/UPDATE/DELETE)된 경우에 자동으로 다른 테이블의
      데이타를 삽입, 수정, 삭제한다
   ** 트리거 내용을 보고 싶으면 SP_HELPTRIGGER 트리거명 을 사용한다

   CREATE TRIGGER 트리거명 ON 테이블명 FOR INSERT AS SQL문         /* INSERT 작업이 수행될때 */
   CREATE TRIGGER 트리거명 ON 테이블명 AFTER UPDATE AS SQL문       /* UPDATE 작업이 수행되고 난 후 */
   CREATE TRIGGER 트리거명 ON 테이블명 INSTEAD OF DELETE AS SQL문 
   DROP TRIGGER 트리거명

  5. Cursor(커서)
   ** SELECT로 가져온 결과들을 하나씩 읽어들여 처리하고 싶을때 사용한다
   ** 커서의 사용방법은 OPEN, FETCH, CLOSE, DEALLOCATE등 4단계를 거친다
   ** FETCH에는 NEXT, PRIOR, FIRST, LAST, ABSOLUTE {n / @nvar}, RELATIVE {n / @nvar}가 있다

   SET NOCOUNT ON      /* SQL문의 영향을 받은 행수를 나타내는 메시지를 숨긴다 */
   DECLARE cStatus SCROLL CURSOR    /* 앞뒤로 움직이는 커서 선언 */
   FOR
       SELECT ID, Year, City FROM aPlane
   FOR READ ONLY
   OPEN cStatus      /* 커서를 연다 */
   DECLARE @ID varchar(50), @Year int, @City varchar(50), @Status char(1)
   FETCH FROM cStatus INTO @ID, @Year, @City /* 커서에서 데이타를 하나씩 가져온다 */
   WHILE @@FETCH_STATUS=0                    /* 커서가 가르키는 결과의 끝까지 */
   BEGIN
       IF      @Year <= 5              SET @Status='A'
       ELSE IF @Year> 6 AND @Year <= 9 SET @Status='B'
       ELSE                            SET @Status='C'
       INSERT INTO aPlane(ID, City, Status) VALUES(@ID, @Year, @Status)
       FETCH FROM cStatus INTO @ID, @Year, @City /* 커서에서 데이타를 하나씩 가져온다 */
   END
   CLOSE cStaus                              /* 커서를 닫는다 */
   DEALLOCATE cStatus                        /* 커서를 해제한다 */

 보안과 사용자 권한
  ** 보안의 설정 방법은 크게 WINDOWS 보안과 SQL 보안으로 나뉘어 진다
  ** 사용자에게 역할을 부여하는데는 서버롤과 데이타베이스롤이 있다

  1. SA(System Administrator)
   ** 가장 상위의 권한으로 SQL 서버에 관한 전체 권한을 가지고 모든 오브젝트를 만들거나
      수정, 삭제할 수 있다

  2. DBO(Database Owner)
   ** 해당 데이타베이스에 관한 모든 권한을 가지며 SA로 로그인해서 데이타베이스에서 테이블을
      만들어도 사용자는 DBO로 매핑된다
   ** 테이블이름의 구조는 서버이름.데이타베이스이름.DBO.테이블이름이다

  3. DBOO(Database Object Owner)
   ** 테이블, 인덱스, 뷰, 트리거, 함수, 스토어드 프로시저등의 오브젝트를 만드는 권한을 가지며
      SA나 DBO가 권한을 부여한다

  4. USER(일반 사용자)
   ** DBO나 DBOO가 해당 오브젝트에 대한 사용 권한을 부여한다



MySql

 ** COMMAND LINE에서의 실행을 기준으로 한다

 시작하기, 끝내기  
  MYSQL -u 사용자명 -p      /* 관리자 계정은 디폴트로 ROOT */
  MYSQL -u 사용자명 -p 데이타베이스명    /* 시작할때 데이타베이스를 선택한다 */
  MYSQL -u 사용자명 데이타베이스명    /* 암호가 지정되어 있지 않을 경우 */
  USE 데이타베이스명      /* 데이타베이스 선택 */
  SELECT VERSION(), CURRENT_DATE;                                 /* 버전과 오늘 날짜 */
  SELECT USER();                                                  /* 사용자 */
  STATUS        /* 서버 정보 */
  SHOW CHARACTER SET;      /* 캐릭터 셋 리스트 */
  SHOW COLLATION;       /* 사용할 수 있는 문자 리스트 */
  SHOW PROCESSLIST;      /* 실행 프로세스 리스트 */
  QUIT                                                            /* 끝내기 */

 패스워드 설정 및 변경
  USE MYSQL       /* MYSQL 데이타베이스를 선택 */
  UPDATE USER SET PASSSWORD=PASSWORD('패스워드') WHERE USER='사용자명';
  FLUSH PRIVILEGES;      /* 변경 패스워드를 적용 */

 데이타베이스 생성 및 선택
  SHOW DATABASES;       /* 데이타베이스 리스트 */
  SHOW CREATE DATABASE 데이타베이스명;                           
  CREATE DATABASE 데이타베이스명;     /* 새 데이타베이스 만들기 */
  ALTER DATABASE 데이타베이스명 DEFAULT CHARACTER SET 문자셋;     /* 문자셋 지정. 4.1버전 이상 */
  DROP DATABASE 데이타베이스명;     /* 데이타베이스 삭제 */
  USE 데이타베이스명;      /* 데이타베이스 선택 */
  
 사용자 생성 및 권한
  ** ROOT 관리자 계정으로 접속해서 아래 2가지 방법중에 하나를 실행하면 된다

  1. USE MYSQL      /* MYSQL 데이타베이스 선택 */
     5.0 버전 이전
   INSERT INTO USER (HOST, USER, PASSWORD) VALUES('localhost', '사용자명', PASSWORD('패스워드'));
     5.0 버전 이후
   INSERT INTO USER    /* USER 테이블에 사용자 등록 */
    (HOST, USER, PASSWORD, ...
   VALUES('localhost', '사용자명', PASSWORD('패스워드'),
           'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y',
    'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y',
    '', '', '', '', 0, 0, 0, 0);
    ** USER 테이블의 HOST, USER, PASSWORD 이외의 나머지 칼럼 갯수만큼 처리
       위의 조건은 관리자에 해당하므로 권한에 제약을 두고 싶다면 각 칼럼별 'Y', 'N'를
       구분해 주어야 한다      
     FLUSH PRIVILEGES;     /* 사용자 등록 적용 */

  2. GRANT ALL ON *.*                                     /* 모든 데이타베이스에 접근 허용 */
   TO 사용자명@LOCALHOST IDENTIFIED BY '패스워드' 
     GRANT ALL ON 데이타베이스명.*                        /* 패스워드없이 지정한 데이타베이스에 접근 허용 */
      TO 사용자명@LOCALHOST  
     GRANT ALL ON 데이타베이스명.*                        /* 지정한 데이타베이스에 접근 허용 */
    TO 사용자명@LOCALHOST IDENTIFIED BY '패스워드' 
     GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON 테이타베이스명.*   /* LOCALHOST의 데이타베이스에 접근 허용 */
   TO 사용자명@LOCALHOST IDENTIFIED BY '패스워드';
     GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON 테이타베이스명.*   /* LOCALHOST가 아닌 다른 곳에서의 접속 허용 */
   TO 사용자명@'%' IDENTIFIED BY '패스워드';      

  SELECT HOST, USER, PASSWORD FROM USER;                          /* 사용자 리스트 */
  DELETE FROM USER WHERE USER='사용자명' AND HOST= '호스트명';    /* 사용자 삭제 */
  SHOW GRANTS FOR 사용자명@localhost;                             /* 사용자의 권한 상태 */
  SHOW GRANTS FOR CURRENT_USER;                                   /* 현재 사용자의 권한 상태 */
  SHOW GRANTS FOR 사용자명@LOCALHOST;                             /* 사용자 권한 */
  SHOW PRIVILEGES;      /* 시스템 권한 */

 테이블  
  CREATE TABLE 테이블명 (칼럼 데이타형 NOT NULL AUTO_INCREMENT);  /* 자동 증가값 만들기 */
  CREATE TABLE 테이블명 (칼럼 데이타형 제약, ...                  /* 기본 키 설정 */
                         PRIMARY KEY (칼럼));  
  CREATE TABLE 테이블명 (칼럼 데이타형 제약, ...                  /* 외래 키 설정 */
           FOREIGN KEY(칼럼) REFERENCES 부모테이블명 (부모칼럼));
  ALTER TABLE 테이블명 RENAME 새테이블명;                         /* 테이블명 변경 */
  ALTER TABLE 테이블명 MODIFY 칼럼 데이타형 제약;                 /* 칼럼의 형식 변경 */
  ALTER TABLE 테이블명 CHANGE 칼럼 새칼럼 데이타형;               /* 칼럼명과 형식 변경 */
  ALTER TABLE 테이블명 ADD 칼럼 데이타형 제약;                    /* 칼럼 추가 */
  ALTER TABLE 테이블명 ADD INDEX (칼럼);    /* 인덱스 칼럼 만들기 */ 
  ALTER TABLE 테이블명 DROP COLUMN 칼럼;                          /* 칼럼 삭제 */
  LOAD DATA INFILE 'TXT파일' INTO TABLE EXPORT FIELDS TERMINATED BY ' ';  /* TXT파일을 DB에 읽어오기 */
  SELECT * FROM EXPORT INTO OUTFILE 'txt파일' FILEDS TERMINATED BY ' ';   /* DB를 TXT파일로 내보내기 */
   ** FIELDS TERMINATED BY는 '\t', ',', ';'등 원하는 구분자를 지정하면 된다
  DROP TABLE 테이블명;                                            /* 테이블 삭제 */
  SHOW TABLES;       /* 테이블 리스트 */
  SHOW TABLES FROM 데이타베이스명;
  SHOW TABLE STATUS FROM 데이타베이스명;
  SHOW OPEN TABLES FROM 데이타베이스명;    /* 현재 열린 테이블 목록 */
  SHOW CREATE TABLE 테이블명;     /* 테이블의 create table문 내용 */
  SHOW COLUMNS FROM 테이블명 FROM 데이타베이스명;   /* 테이블의 칼럼 */
  DESC 테이블명;       /* 테이블 구조 */

 인덱스
  ** 적절한 인덱스 사용은 SELECT문의 성능을 크게 향상 시킨다
     최대 16개까지 지정할 수 있다
     최대 인덱스는 256바이트까지 가능하다
     CAHR, VARCHART에 대해서 앞 문자열로 인덱스 할 수 있다
     인덱스는 테이블에서 MUL 로 표시된다.

  CREATE TABLE 테이블명 (칼럼 데이타형 제약, ...                  /* 인덱스 만들기 */
           INDEX 인덱스명(칼럼));
   ** INDEX (칼럼), KEY 인덱스명 (칼럼)으로 해도 된다
  SHOW KEYS FROM 테이블명;     /* 인덱스 리스트 */
  SHOW INDEX FROM 테이블명 FROM 데이타베이스명;   

 저장 프로시저
  ** IN    프로시저로 값 전달
     OUT   프로시저에서 값 리턴
     INOUT IN과 OUT 속성을 다 가지고 있다
  ** REPLACE 명령을 사용하면 만들거나 수정할때마다 다시 컴파일을 한다
  ** MySql 5.0 이후 부터 지원한다

  CREATE PROCEDURE 프로시저명    /* 프로시저 생성 */
   (IN 파라미터1 데이타타입, OUT 파라미터2 데이타타입, INOUT 파라미터3 데이타타입)
  BEGIN
      프로그램; 
  END;
  DROP PROCEDURE 프로시저명;    /* 프로시저 삭제 */

출처 : http://okjsp.pe.kr/seq/151426

'DEVELOPMENT' 카테고리의 다른 글

Git  (0) 2013.12.30
dxf file format  (0) 2012.08.16
XSLT 빠른 가이드  (0) 2012.01.13
Maven 빌드 라이프 사이클(Lifecycle)  (0) 2009.11.19
ServerVariables 콜렉션  (0) 2009.03.10

/* 컬럼 추가 */
ALTER TABLE 'table' ADD '컬럼' VARCHAR(20); 

/* 특정 위치에 컬럼 추가 */
ALTER TABLE 'table' ADD '컬럼' VARCHAR(20) AFTER seq;
ALTER TABLE 'table' ADD '컬럼' VARCHAR(20) BEFORE register_date; 

/* 컬럼 수정 */
ALTER TABLE 'table' MODIFY '컬럼' '신규컬럼' VARCHAR(10);

/* 컬럼 삭제 */
ALTER TABLE 'table' DROP '컬럼';

DATE 값을 기대하는 함수들은 일반적으로 DATETIME 값을 수용하고, TIME 부분은 무시한다. TIME 값을 기대하는 함수들은 일반적으로 DATETIME 값을 수용하고, DATE 부분은 무시한다.

현재 날짜나 시간을 반환(return)하는 함수들은 쿼리가 실행될 때 단 한번만 그 값을 구한다. 이것은 한 쿼리 안에 NOW()와 같은 함수가 여러번 사용되었을 경우에도 모두 같은 결과값을 참조한다는 것을 의미한다. 이 원칙은 CURDATE(), CURTIME(), UTC_DATE(), UTC_TIME(), UTC_TIMESTAMP() 등의 함수에도 적용된다.

MySQL 4.1.3 버전부터 제공된 CURRENT_TIMESTAMP(), CURRENT_TIME(), CURRENT_DATE(), FROM_UNIXTIME() 함수들은 연결 상태의 현재 시간대에 해당되는 반환값을 갖는다. 또한 UNIX_TIMESTAMP()도 그 인자(argument)가 현재 시간대에 해당되는 DATETIME 값이라는 것을 가정한다.

다음 함수 설명들의 반환값 범위는 완전한 날짜를 요구한다. 날짜가 '0'이거나 '2001-11-00'처럼 불완전하다면, DATE 부분을 추출하는 함수는 '0'을 반환할 것이다. 예를 들어, DAYOFMONTH('2001-11-00')은 '0'을 반환한다.

ADDDATE(date,INTERVAL expr type) , ADDDATE(expr,days)

ADDDATE()는 두번째 인자에서 INTERVAL과 함께 사용되면 DATE_ADD()의 별칭이 된다. 마찬가지로 SUBDATE()DATE_SUB()의 별칭이다. INTERVAL 인자에 관해서는 DATE_ADD() 설명을 참조하라.

mysql> SELECT DATE_ADD('1998-01-02', INTERVAL 31 DAY);
        -> '1998-02-02'
mysql> SELECT ADDDATE('1998-01-02', INTERVAL 31 DAY);
        -> '1998-02-02'

MySQL 4.1.1 버전부터 두번째 문법이 허용되었다. expr 가 DATE 또는 DATETIME 형식일 때, daysexpr 에 추가되는 일수이다.

mysql> SELECT ADDDATE('1998-01-02', 31);
        -> '1998-02-02'

ADDTIME(expr,expr2)

ADDTIME()는 exprexpr2 를 더하고 그 결과를 반환한다. expr 는 TIME 또는 DATETIME 형식이고, expr2 는 시간 표현이다.

mysql> SELECT ADDTIME('1997-12-31 23:59:59.999999', '1 1:1:1.000002');
        -> '1998-01-02 01:01:01.000001'
mysql> SELECT ADDTIME('01:00:00.999999', '02:00:00.999998');
        -> '03:00:01.999997'

ADDTIME()는 MySQL 4.1.1 버전에서 추가되었다.

CONVERT_TZ(dt,from_tz,to_tz)

CONVERT_TZ()는 DATETIME 값 dtfrom_tz 시간대에서 to_tz 시간대로 변환하고, 결과값을 반환한다. 이 함수는 인자가 유효하지 않으면 NULL 값을 반환한다.

from_tz 에서 UTC으로 변환될 때 입력값이 TIMESTAMP 형의 범위를 벗어나면 변환은 일어나지 않는다.

mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET');
        -> '2004-01-01 13:00:00'
mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','-07:00');
        -> '2004-01-01 05:00:00'

'MET'이나 'Europe/Moscow'와 같은 시간대를 사용하기 위해서는, 시간대 표가 적절하게 설정되어야 한다.

CONVERT_TZ()는 MySQL 4.1.3 버전에서 추가되었다.

CURDATE()

함수가 문자열이나 숫자로 사용되었는지 문맥에 따라서 'YYYY-MM-DD'이나 YYYYMMDD 형식으로 현재 날짜를 반환한다.

mysql> SELECT CURDATE();
        -> '1997-12-15'
mysql> SELECT CURDATE() + 0;
        -> 19971215

CURRENT_DATE , CURRENT_DATE()

CURRENT_DATE와 CURRENT_DATE()는 CURDATE()의 별칭이다.

CURTIME()

함수가 문자열이나 숫자로 사용되었는지 문맥에 따라서 'HH:MM:SS'이나 HHMMSS 형식으로 현재 시간을 반환한다.

mysql> SELECT CURTIME();
        -> '23:50:26'
mysql> SELECT CURTIME() + 0;
        -> 235026

CURRENT_TIME , CURRENT_TIME()

CURRENT_TIME와 CURRENT_TIME()는 CURTIME()의 별칭이다.

CURRENT_TIMESTAMP , CURRENT_TIMESTAMP()

CURRENT_TIMESTAMP와 CURRENT_TIMESTAMP()는 NOW()의 별칭이다.

DATE(expr)

날짜(date)나 DATETIME 표현 expr 에서 DATE 부분을 추출한다.

mysql> SELECT DATE('2003-12-31 01:02:03');
        -> '2003-12-31'

DATE()는 MySQL 4.1.1 버전부터 사용이 가능하다.

DATEDIFF(expr,expr2)

DATEDIFF()는 시작 날짜 expr 와 마지막 날짜 expr2 사이의 일수를 반환한다. exprexpr2 는 날짜(date) 또는 date-and-time 표현이다. 반환값의 DATE 부분만 계산된다.

mysql> SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30');
        -> 1
mysql> SELECT DATEDIFF('1997-11-30 23:59:59','1997-12-31');
        -> -31

DATEDIFF()는 MySQL 4.1.1 버전에서 추가되었다.

DATE_ADD(date,INTERVAL expr type) , DATE_SUB(date,INTERVAL expr type)

이 함수들은 날짜 계산을 수행한다. date 는 시작 날짜를 지정하는 DATETIME 또는 DATE 값이다. expr 는 시작 날짜로부터 더하거나 뺀 간격 값을 지정하는 표현이다. expr 는 문자열이다. 마이너스('-')로 시작될 수도 있다. type 는 어떻게 해석할지를 지정하는 키워드이다.

INTERVAL 키워드와 type 지정자는 대소문자를 구분하지 않는다.

다음 표는 typeexpr 인자가 어떤 관계인지 보여준다.

type 기대되는 expr 형식
MICROSECOND MICROSECONDS
SECOND SECONDS
MINUTE MINUTES
HOUR HOURS
DAY DAYS
WEEK WEEKS
MONTH MONTHS
QUARTER QUARTERS
YEAR YEARS
SECOND_MICROSECOND 'SECONDS.MICROSECONDS'
MINUTE_MICROSECOND 'MINUTES.MICROSECONDS'
MINUTE_SECOND 'MINUTES:SECONDS'
HOUR_MICROSECOND 'HOURS.MICROSECONDS'
HOUR_SECOND 'HOURS:MINUTES:SECONDS'
HOUR_MINUTE 'HOURS:MINUTES'
DAY_MICROSECOND 'DAYS.MICROSECONDS'
DAY_SECOND 'DAYS HOURS:MINUTES:SECONDS'
DAY_MINUTE 'DAYS HOURS:MINUTES'
DAY_HOUR 'DAYS HOURS'
YEAR_MONTH 'YEARS-MONTHS'

type 값 DAY_MICROSECOND, HOUR_MICROSECOND, MINUTE_MICROSECOND, SECOND_MICROSECOND, MICROSECOND 는 MySQL 4.1.1 버전부터 사용이 가능하다. 값 QUARTER과 WEEK는 MySQL 5.0.0 버전부터 사용이 가능하다.

MySQL은 expr 형식 안에서 어떤 구문 구획자도 허용한다. 표에서 볼 수 있는 것들은 제안된 구획자들이다. date 인자가 DATE 값이고 단지 YEAR, MONTH, DAY 만 계산하고자 한다면(TIME 부분이 필요 없다면), 결과는 DATE 값이다. 그렇지 않다면, 결과는 DATETIME 값이다.

MySQL 3.23 버전부터, INTERVAL expr type 는 다른 부분이 DATE 또는 DATETIME 값으로 표현되어 있다면 어느 한쪽이라도 + 연산자의 사용을 허용한다. - 연산자는 오른쪽에만 허용된다. 간격에서 DATE 또는 DATETIME 값을 빼는 것은 무의미하기 때문이다. (아래 예문을 참조하라.)

mysql> SELECT '1997-12-31 23:59:59' + INTERVAL 1 SECOND;
        -> '1998-01-01 00:00:00'
mysql> SELECT INTERVAL 1 DAY + '1997-12-31';
        -> '1998-01-01'
mysql> SELECT '1998-01-01' - INTERVAL 1 SECOND;
        -> '1997-12-31 23:59:59'
mysql> SELECT DATE_ADD('1997-12-31 23:59:59', INTERVAL 1 SECOND);
        -> '1998-01-01 00:00:00'
mysql> SELECT DATE_ADD('1997-12-31 23:59:59', INTERVAL 1 DAY);
        -> '1998-01-01 23:59:59'
mysql> SELECT DATE_ADD('1997-12-31 23:59:59', INTERVAL '1:1' MINUTE_SECOND);
        -> '1998-01-01 00:01:00'
mysql> SELECT DATE_SUB('1998-01-01 00:00:00', INTERVAL '1 1:1:1' DAY_SECOND);
        -> '1997-12-30 22:58:59'
mysql> SELECT DATE_ADD('1998-01-01 00:00:00', INTERVAL '-1 10' DAY_HOUR);
        -> '1997-12-30 14:00:00'
mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
        -> '1997-12-02'
mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002', INTERVAL '1.999999' SECOND_MICROSECOND);
        -> '1993-01-01 00:00:01.000001'

지정한 간격(interval) 값이 너무 짧다면(type 키워드로부터 기대되는 모든 간격 부분이 포함되어 있지 않다면), MySQL은 간격 값의 왼쪽 부분을 남겼다고 가정한다. 예를 들어, type DAY_SECOND를 지정했다면, expr 값은 일, 시, 분, 초 부분이 기대된다. '1:10'과 같은 값을 지정했다면, MySQL은 일, 시 부분이 없는 분, 초 값이라고 가정한다. 다르게 말하면, '1:10' DAY_SECOND는 '1:10' MINUTE_SECOND과 동일한 값으로 해석된다. 이것은 MySQL가 TIME 값을 시각보다 시간으로 해석하는 것과 비슷하다.

TIME 부분을 포함하는 어떤 값에서 date 를 더하거나 뺀다면, 결과는 자동으로 DATETIME 값으로 변환된다.

mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 DAY);
        -> '1999-01-02'
mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 HOUR);
        -> '1999-01-01 01:00:00'

기형적인 날짜를 입력하면 결과는 NULL이 된다. 만일 MONTH, YEAR_MONTH, 또는 YEAR를 더해서 새로운 달의 일수보다 더 큰 날짜가 된다면, 날짜는 새로운 달의 마지막 날로 보정된다.

mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH);
        -> '1998-02-28'

DATE_FORMAT(date,format)

format 문자열에 따라 date 값을 형식화한다. format 문자열에는 다음 지정자들이 사용된다.

지정자 설명
%a Abbreviated weekday name (Sun..Sat)
%b Abbreviated month name (Jan..Dec)
%c Month, numeric (0..12)
%D Day of the month with English suffix (0th, 1st, 2nd, 3rd, ...)
%d Day of the month, numeric (00..31)
%e Day of the month, numeric (0..31)
%f Microseconds (000000..999999)
%H Hour (00..23)
%h Hour (01..12)
%I Hour (01..12)
%i Minutes, numeric (00..59)
%j Day of year (001..366)
%k Hour (0..23)
%l Hour (1..12)
%M Month name (January..December)
%m Month, numeric (00..12)
%p AM or PM
%r Time, 12-hour (hh:mm:ss followed by AM or PM)
%S Seconds (00..59)
%s Seconds (00..59)
%T Time, 24-hour (hh:mm:ss)
%U Week (00..53), where Sunday is the first day of the week
%u Week (00..53), where Monday is the first day of the week
%V Week (01..53), where Sunday is the first day of the week; used with %X
%v Week (01..53), where Monday is the first day of the week; used with %x
%W Weekday name (Sunday..Saturday)
%w Day of the week (0=Sunday..6=Saturday)
%X Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V
%x Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v
%Y Year, numeric, four digits
%y Year, numeric, two digits
%% A literal '%'.

다른 모든 문자들은 변환없이 결과에 그대로 복사된다.

%v, %V, %x, %X format 지정자들은 MySQL 3.23.8 버전부터 사용이 가능하고, %f는 MySQL 4.1.1 버전부터 가능하다.

MySQL 3.23 버전부터는 '%' 문자가 format 지정문자 앞에 요구된다. 그 이전 버번에서 '%'는 선택사양이다.

월일의 범위가 '0'으로 시작되기 때문에 MySQL 3.23 버전부터는 '2004-00-00'와 같은 불완전한 날짜가 허용된다.

mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
        -> 'Saturday October 1997'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
        -> '22:23:00'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%D %y %a %d %m %b %j');
        -> '4th 97 Sat 04 10 Oct 277'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w');
        -> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
        -> '1998 52'

DAY(date)

DAY()는 DAYOFMONTH()의 별칭이다. MySQL 4.1.1 버전부터 사용이 가능하다.

DAYNAME(date)

date 에 대한 요일 이름을 반환한다.

mysql> SELECT DAYNAME('1998-02-05');
        -> 'Thursday'

DAYOFMONTH(date)

date 에 대한 당월의 날짜를 반환한다. (범위 1~31)

mysql> SELECT DAYOFMONTH('1998-02-03');
        -> 3

DAYOFWEEK(date)

date 에 대하여 요일 색인(1 = 일요일, 2 = 월요일, ..., 7 = 토요일)을 반환한다. 이 색인값들은 ODBC 표준에 따른다.

mysql> SELECT DAYOFWEEK('1998-02-03');
        -> 3

DAYOFYEAR(date)

date 가 해당 연도에 몇일째인지 반환한다. (범위 1~366)

mysql> SELECT DAYOFYEAR('1998-02-03');
        -> 34

EXTRACT(type FROM date)

EXTRACT() 함수는 DATE_ADD()나 DATE_SUB()와 같은 종류의 간격 지정자를 사용하지만, 날짜를 계산하는 게 아니라 날짜로부터 부분을 추출한다.

mysql> SELECT EXTRACT(YEAR FROM '1999-07-02');
       -> 1999
mysql> SELECT EXTRACT(YEAR_MONTH FROM '1999-07-02 01:02:03');
       -> 199907
mysql> SELECT EXTRACT(DAY_MINUTE FROM '1999-07-02 01:02:03');
       -> 20102
mysql> SELECT EXTRACT(MICROSECOND FROM '2003-01-02 10:30:00.00123');
        -> 123

EXTRACT()는 MySQL 3.23.0 버전에서 추가되었다.

FROM_DAYS(N)

일수 N 가 주어지면, DATE 값을 반환한다.

mysql> SELECT FROM_DAYS(729669);
        -> '1997-10-07'

FROM_DAYS()는 그레고리안 달력의 출현(1582년) 이전의 값을 사용할 수 있도록 계획되지 않았다. 달력이 바뀌었을 때 손실된 날짜는 고려하지 않는다.

FROM_UNIXTIME(unix_timestamp) , FROM_UNIXTIME(unix_timestamp,format)

함수에 사용된 문맥이 문자열인지 숫자인지에 따라 'YYYY-MM-DD HH:MM:SS' 또는 YYYYMMDDHHMMSS format 값으로 unix_timestamp 인자가 표시되어 반환된다.

mysql> SELECT FROM_UNIXTIME(875996580);
        -> '1997-10-04 22:23:00'
mysql> SELECT FROM_UNIXTIME(875996580) + 0;
        -> 19971004222300

format 이 주어진다면 결과는 format 문자열에 따라 형식화된다. format 은 DATE_FORMAT() 함수에 쓰이는 지정자를 똑같이 사용한다.

mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y %D %M %h:%i:%s %x');
        -> '2003 6th August 06:22:58 2003'

GET_FORMAT(DATE|TIME|DATETIME, 'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL')

형식 문자열을 반환한다. 이 함수는 DATE_FORMAT()과 STR_TO_DATE() 함수와 조합할 때 유용하다.

첫번째 인자로는 3가지 가능한 값이 있고, 두번째 인자로는 5가지 가능한 값이 있어서 결과적으로 15가지 형식 문자열이 가능하다. (사용되는 지정자를 위해서 DATE_FORMAT() 설명을 참조하라.)

함수 호출 결과
GET_FORMAT(DATE,'USA') '%m.%d.%Y'
GET_FORMAT(DATE,'JIS') '%Y-%m-%d'
GET_FORMAT(DATE,'ISO') '%Y-%m-%d'
GET_FORMAT(DATE,'EUR') '%d.%m.%Y'
GET_FORMAT(DATE,'INTERNAL') '%Y%m%d'
GET_FORMAT(DATETIME,'USA') '%Y-%m-%d-%H.%i.%s'
GET_FORMAT(DATETIME,'JIS') '%Y-%m-%d %H:%i:%s'
GET_FORMAT(DATETIME,'ISO') '%Y-%m-%d %H:%i:%s'
GET_FORMAT(DATETIME,'EUR') '%Y-%m-%d-%H.%i.%s'
GET_FORMAT(DATETIME,'INTERNAL') '%Y%m%d%H%i%s'
GET_FORMAT(TIME,'USA') '%h:%i:%s %p'
GET_FORMAT(TIME,'JIS') '%H:%i:%s'
GET_FORMAT(TIME,'ISO') '%H:%i:%s'
GET_FORMAT(TIME,'EUR') '%H.%i.%S'
GET_FORMAT(TIME,'INTERNAL') '%H%i%s'

ISO 형식은 ISO 8601이 아니라 ISO 9075이다.

MySQL 4.1.4 버전부터는 TIMESTAMP 또한 사용할 수 있게 되었다. GET_FORMAT() 함수는 같은 값을 DATETIME 형식으로 반환한다.

mysql> SELECT DATE_FORMAT('2003-10-03',GET_FORMAT(DATE,'EUR'));
        -> '03.10.2003'
mysql> SELECT STR_TO_DATE('10.31.2003',GET_FORMAT(DATE,'USA'));
        -> 2003-10-31

GET_FORMAT()는 MySQL 4.1.1 버전부터 사용이 가능하다.

HOUR(time)

time 에서 시간을 반환한다. (범위 0~23)

mysql> SELECT HOUR('10:05:03');
        -> 10

그러나 TIME 값의 크기는 실제로 훨씬 더 크다. HOUR는 23보다 더 큰 값을 반환할 수 있다.

mysql> SELECT HOUR('272:59:59');
        -> 272

LAST_DAY(date)

DATE 또는 DATETIME 값을 입력하면 당월의 마지막 날에 대한 상응하는 값을 반환한다. 인자가 유효하지 않으면 NULL을 반환한다.

mysql> SELECT LAST_DAY('2003-02-05');
        -> '2003-02-28'
mysql> SELECT LAST_DAY('2004-02-05');
        -> '2004-02-29'
mysql> SELECT LAST_DAY('2004-01-01 01:01:01');
        -> '2004-01-31'
mysql> SELECT LAST_DAY('2003-03-32');
        -> NULL

LAST_DAY()는 MySQL 4.1.1 버전부터 사용이 가능하다.

LOCALTIME , LOCALTIME()

LOCALTIME과 LOCALTIME()은 NOW()의 별칭이다.

두 함수는 MySQL 4.0.6 버전에서 추가되었다.

LOCALTIMESTAMP , LOCALTIMESTAMP()

LOCALTIMESTAMP와 LOCALTIMESTAMP()는 NOW()의 별칭이다.

두 함수는 MySQL 4.0.6 버전에서 추가되었다.

MAKEDATE(year,dayofyear)

yeardayofyear 값이 주어지면 날짜를 반환한다. dayofyear 는 0보다 커야 한다. 그렇지 않으면 결과는 NULL이다.

mysql> SELECT MAKEDATE(2001,31), MAKEDATE(2001,32);
        -> '2001-01-31', '2001-02-01'
mysql> SELECT MAKEDATE(2001,365), MAKEDATE(2004,365);
        -> '2001-12-31', '2004-12-30'
mysql> SELECT MAKEDATE(2001,0);
        -> NULL

MAKEDATE()는 MySQL 4.1.1 버전부터 사용이 가능하다.

MAKETIME(hour,minute,second)

hour,minute,second 인자로부터 계산된 시간 값을 반환한다.

mysql> SELECT MAKETIME(12,15,30);
        -> '12:15:30'

MAKETIME()는 MySQL 4.1.1 버전부터 사용이 가능하다.

MICROSECOND(expr)

TIME 또는 DATETIME 형식의 expr 로부터 마이크로초를 반환한다. (범위 0~999999)

mysql> SELECT MICROSECOND('12:00:00.123456');
        -> 123456
mysql> SELECT MICROSECOND('1997-12-31 23:59:59.000010');
        -> 10

MICROSECOND()는 MySQL 4.1.1 버전부터 사용이 가능하다.

MINUTE(time)

time 에 대하여 몇 분인지 반환한다. (범위 0~59)

mysql> SELECT MINUTE('98-02-03 10:05:03');
        -> 5

MONTH(date)

date 에 대하여 몇 월인지 반환한다. (범위 1~12)

mysql> SELECT MONTH('1998-02-03');
        -> 2

MONTHNAME(date)

date 에 대하여 당월의 영문 이름을 반환한다.

mysql> SELECT MONTHNAME('1998-02-05');
        -> 'February'

NOW()

함수에 사용된 문맥에 따라 'YYYY-MM-DD HH:MM:SS' 또는 YYYYMMDDHHMMSS 형식으로 현재 날짜와 시간을 반환한다.

mysql> SELECT NOW();
        -> '1997-12-15 23:50:26'
mysql> SELECT NOW() + 0;
        -> 19971215235026

PERIOD_ADD(P,N)

기간 PN 월을 더한다(YYMM 또는 YYYYMM 형식으로). YYYYMM 형식으로 결과를 반환한다. 기간 P 가 DATE 값이 아니라는 것에 주의하라.

mysql> SELECT PERIOD_ADD(9801,2);
        -> 199803

PERIOD_DIFF(P1,P2)

기간 P1, P2 사이의 개월수를 반환한다. P1P2 는 YYMM 또는 YYYYMM 형식이어야 한다. 기간 P1, P2 가 DATE 값이 아니라는 것에 주의하라.

mysql> SELECT PERIOD_DIFF(9802,199703);
        -> 11

QUARTER(date)

date 가 몇 분기인지 반환한다. (범위 1~4)

mysql> SELECT QUARTER('98-04-01');
        -> 2

SECOND(time)

time 에서 초 값을 반환한다. (범위 0~59)

mysql> SELECT SECOND('10:05:03');
        -> 3

SEC_TO_TIME(seconds)

함수가 어떤 문맥으로 사용되었는지에 따라 seconds 인자를 'HH:MM:SS' 또는 HHMMSS 형식으로 변환시켜서 반환한다.

mysql> SELECT SEC_TO_TIME(2378);
        -> '00:39:38'
mysql> SELECT SEC_TO_TIME(2378) + 0;
        -> 3938

STR_TO_DATE(str,format)

이 함수는 DATE_FORMAT() 함수의 역기능이다. 문자열 str 와 형식 문자열 format 을 입력받는다. STR_TO_DATE()는 형식 문자열이 날짜와 시간을 모두 포함하고 있다면 DATETIME 값을 반환한다. 그렇지 않고 날짜나 시간 둘 중 한 부분만을 포함한다면 DATE 또는 TIME 값을 반환한다.

str 에 포함된 DATE, TIME 또는 DATETIME 값은 format 에 의해 지정된 형식으로 주어져야 한다. format 에 사용할 수 있는 지정자에 대해서는 DATE_FORMAT() 설명을 참조하라. 다른 모든 문자는 해석되지 않고 그대로 반영된다. 만일 str 가 유효하지 않은 값을 포함한다면 NULL이 반환된다. MySQL 5.0.3 버전부터는 잘못된 값 또한 경고를 발생한다.

mysql> SELECT STR_TO_DATE('03.10.2003 09.20', '%d.%m.%Y %H.%i');
        -> '2003-10-03 09:20:00'
mysql> SELECT STR_TO_DATE('10arp', '%carp');
        -> '0000-10-00 00:00:00'
mysql> SELECT STR_TO_DATE('2003-15-10 00:00:00', '%Y-%m-%d %H:%i:%s');
        -> NULL

어떤 달의 일수보다 큰 일수를 가진 날짜는 1-31 범위 안에서 허용된다. 또한 '0'이나 '0'값을 가진 날짜도 허용된다.

mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y');
        -> '0000-00-00'
mysql> SELECT STR_TO_DATE('04/31/2004', '%m/%d/%Y');
        -> '2004-04-31'

STR_TO_DATE()는 MySQL 4.1.1 버전부터 사용이 가능하다.

SUBDATE(date,INTERVAL expr type) , SUBDATE(expr,days)

두번째 인자 INTERVAL 형식을 포함하여 사용되었을 때 SUBDATE()는 DATE_SUB()의 별칭이다. INTERVAL 인자에 대한 정보는 DATE_ADD() 설명을 참조하라.

mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
        -> '1997-12-02'
mysql> SELECT SUBDATE('1998-01-02', INTERVAL 31 DAY);
        -> '1997-12-02'

MySQL 4.1.1 버전부터 두번째 문법이 허용된다. expr 는 DATE 또는 DATETIME 형식이고 daysexpr 에서 뺄 일수이다.

mysql> SELECT SUBDATE('1998-01-02 12:00:00', 31);
        -> '1997-12-02 12:00:00'

SUBTIME(expr,expr2)

SUBTIME()는 expr 에서 expr2 를 빼고 그 값을 반환한다. expr 는 TIME 또는 DATETIME 형식이고, expr2 는 TIME 형식이다.

mysql> SELECT SUBTIME('1997-12-31 23:59:59.999999',
    ->                '1 1:1:1.000002');
        -> '1997-12-30 22:58:58.999997'
mysql> SELECT SUBTIME('01:00:00.999999', '02:00:00.999998');
        -> '-00:59:59.999999'

SUBTIME()는 MySQL 4.1.1 버전에서 추가되었다.

SYSDATE()

SYSDATE()는 NOW()의 별칭이다.

TIME(expr)

TIME 또는 DATETIME 형식의 expr 에서 TIME 부분을 추출한다.

mysql> SELECT TIME('2003-12-31 01:02:03');
        -> '01:02:03'
mysql> SELECT TIME('2003-12-31 01:02:03.000123');
        -> '01:02:03.000123'

TIME()는 MySQL 4.1.1 버전부터 사용이 가능하다.

TIMEDIFF(expr,expr2)

TIMEDIFF()는 시작 시간 expr 와 마지막 시간 expr2 와의 차이를 TIME 값으로 반환한다. exprexpr2 는 TIME 또는 DATETIME 형식이고, 두 형식은 같아야 한다.

mysql> SELECT TIMEDIFF('2000:01:01 00:00:00',
    ->                 '2000:01:01 00:00:00.000001');
        -> '-00:00:00.000001'
mysql> SELECT TIMEDIFF('1997-12-31 23:59:59.000001',
    ->                 '1997-12-30 01:01:01.000002');
        -> '46:58:57.999999'

TIMEDIFF()는 MySQL 4.1.1 버전에서 추가되었다.

TIMESTAMP(expr) , TIMESTAMP(expr,expr2)

인자 하나만을 사용한다면, DATE 또는 DATETIME expr 를 DATETIME 값으로 반환한다. 인자 두 개를 사용한다면, DATE 또는 DATETIME 형식의 expr 에 TIME 형식의 expr2 를 더하고 그 DATETIME 값을 반환한다.

mysql> SELECT TIMESTAMP('2003-12-31');
        -> '2003-12-31 00:00:00'
mysql> SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00');
        -> '2004-01-01 00:00:00'

TIMESTAMP()는 MySQL 4.1.1 버전부터 사용이 가능하다.

TIMESTAMPADD(interval,int_expr,DATETIME_expr)

DATE 또는 DATETIME 형식의 DATETIME_expr 에 정수 형식의 int_expr 를 더한다. int_expr 의 단위는 interval 인자로 주어지는데, 다음 값 가운데 하나이어야 한다. FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR.

interval 값은 상기된 키워드 가운데 하나를 지정하거나 SQL_TSI_ 접두사를 사용할 수 있다. 예를 들어, DAY 또는 SQL_TSI_DAY 둘 다 모두 허용된다.

mysql> SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02');
        -> '2003-01-02 00:01:00'
mysql> SELECT TIMESTAMPADD(WEEK,1,'2003-01-02');
        -> '2003-01-09'

TIMESTAMPADD()는 MySQL 5.0.0 버전부터 사용이 가능하다.

TIMESTAMPDIFF(interval,DATETIME_expr1,DATETIME_expr2)

DATE 또는 DATETIME 형식의 DATETIME_expr1,DATETIME_expr2 사이의 격차를 정수값으로 반환한다. 결과값의 단위는 interval 인자에 의해 주어진다. interval 의 허용값은 TIMESTAMPADD() 함수와 같다.

mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');
        -> 3
mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');
        -> -1

TIMESTAMPDIFF()는 MySQL 5.0.0 버전부터 사용이 가능하다.

TIME_FORMAT(time,format)

이 함수는 DATE_FORMAT() 함수처럼 사용되지만, format 문자열은 시, 분, 초에 관련된 지정자만을 포함할 수 있다. 다른 지정자들은 NULL 값이나 '0'을 발생한다.

time 값이 TIME 부분에서 23보다 큰 값을 갖는다면, %H와 %k 시간 지정자는 일상적인 범위 0-23보다 더 큰 값을 발생한다. 다른 시간 지정자들은 12 법(modulo)의 값을 발생한다.

mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l');
        -> '100 100 04 04 4'

TIME_TO_SEC(time)

time 인자를 초로 변환하여 반환한다.

mysql> SELECT TIME_TO_SEC('22:23:00');
        -> 80580
mysql> SELECT TIME_TO_SEC('00:39:38');
        -> 2378

TO_DAYS(date)

날짜 date 가 주어지면, 일수를 반환한다. (0년부터의 일수).

mysql> SELECT TO_DAYS(950501);
        -> 728779
mysql> SELECT TO_DAYS('1997-10-07');
        -> 729669

TO_DAYS()는 그레고리안 달력의 출현(1582년) 이전의 값을 사용할 수 있도록 계획되지 않았다. 달력이 바뀌었을 때 손실된 날짜는 고려하지 않는다.

MySQL는 날짜에 있는 2자리 형식의 연도를 4자리 형식으로 변환한다는 것을 기억하라. 예를 들어, '1997-10-07'과 '97-10-07'는 동일한 날짜로 간주한다.

mysql> SELECT TO_DAYS('1997-10-07'), TO_DAYS('97-10-07');
        -> 729669, 729669

1582년 이전의 다른 날짜에 대해서는 이 함수는 결과값이 정의되지 않았다.

UNIX_TIMESTAMP() , UNIX_TIMESTAMP(date)

인자 없이 호출이 된다면, 부호없는 정수의 유닉스 시간('1970-01-01 00:00:00' GMT부터 계산된 초)을 반환한다. UNIX_TIMESTAMP()가 date 인자와 함께 호출된다면, '1970-01-01 00:00:00' GMT부터 계산된 초 값을 반한다. date 는 DATE 문자열, DATETIME 문자열, TIMESTAMP 문자열, YYMMDD 또는 YYYYMMDD 형식의 숫자를 허용한다.

mysql> SELECT UNIX_TIMESTAMP();
        -> 882226357
mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
        -> 875996580

UNIX_TIMESTAMP가 TIMESTAMP 형식으로 사용되었을 때 이 함수는 내부의 TIMESTAMP 값을 직접 반환한다. 무조건 문자열을 유닉스 시간으로 변환하지 않는다. UNIX_TIMESTAMP()에 범위에서 벗어난 날짜를 입력했다면 0이 반환되지만, 기본적인 범위만 확인된다는 것에 주의하라. (연도는1970-2037, 월 01-12, 일 01-31)

UTC_DATE , UTC_DATE()

함수가 사용된 문맥에 따라 'YYYY-MM-DD' 또는 YYYYMMDD 형식으로 현재의 UTC 날짜 값을 반환한다.

mysql> SELECT UTC_DATE(), UTC_DATE() + 0;
        -> '2003-08-14', 20030814

UTC_DATE()는 MySQL 4.1.1 버전부터 사용이 가능하다.

UTC_TIME , UTC_TIME()

함수가 사용된 문맥에 따라 'HH:MM:SS' 또는 HHMMSS 형식으로 현재의 UTC 시간 값을 반환한다.

mysql> SELECT UTC_TIME(), UTC_TIME() + 0;
        -> '18:07:53', 180753

UTC_TIME()는 MySQL 4.1.1 버전부터 사용이 가능하다.

UTC_TIMESTAMP , UTC_TIMESTAMP()

함수가 사용된 문맥에 따라 'YYYY-MM-DD HH:MM:SS' 또는 YYYYMMDDHHMMSS 형식으로 현재의 UTC 일시 값을 반환한다.

mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;
        -> '2003-08-14 18:08:04', 20030814180804

UTC_TIMESTAMP()는 MySQL 4.1.1 버전부터 사용이 가능하다.

WEEK(date[,mode])

date 에 대하여 몇번째 주인지 반환한다. 2개 인자를 사용하는 형식에서는, 한 주의 시작을 일요일로 할 것인지 월요일로 할 것인지, 결과값의 범위를 0-53으로 할 것인지 1-53으로 할 것인지를 지정할 수 있다. mode 인자가 생략되면 시스템 기본값이 사용된다. (MySQL 4.0.14 버전 이전에는 0)

mode 인자는 아래 표와 같이 작동한다.

모드 한 주의 시작요일 범위 Week 1 is the first week...
0 Sunday 0-53 with a Sunday in this year
1 Monday 0-53 with more than 3 days this year
2 Sunday 1-53 with a Sunday in this year
3 Monday 1-53 with more than 3 days this year
4 Sunday 0-53 with more than 3 days this year
5 Monday 0-53 with a Monday in this year
6 Sunday 1-53 with more than 3 days this year
7 Monday 1-53 with a Monday in this year

mode 3은 MySQL 4.0.5 버전부터 사용할 수 있으며, 4 이상의 mode 는 MySQL 4.0.17 버전부터 사용할 수 있다.

mysql> SELECT WEEK('1998-02-20');
        -> 7
mysql> SELECT WEEK('1998-02-20',0);
        -> 7
mysql> SELECT WEEK('1998-02-20',1);
        -> 8
mysql> SELECT WEEK('1998-12-31',1);
        -> 53

주의 : MySQL 4.0 버전에서 WEEK(date,0)는 미국 달력에 알맞게 변했다. 그 전에 WEEK()는 미국 날짜에서 잘못 계산되었다. (사실상 WEEK(date)와 WEEK(date,0)는 모든 경우에 오류가 있었다.)

이전 연도의 마지막주에서 날짜가 맞아떨어지면, mode 인자를 2, 3, 6, 7 으로 선택하지 않는 한 MySQL은 0을 반환한다.

mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
        -> 2000, 0

어떤 이는 실제로 주어진 날짜가 1999년의 52째주이기 때문에 WEEK() 함수가 52를 반환해야 한다고 주장한다. 우리는 주어진 연도에서 몇 째주인지 반환할 것을 원했기 때문에 그 대신 0을 반환하기로 했다. 이것은 WEEK() 함수를 날짜에서 DATE 부분을 추출하는 다른 함수들과 결합하여 사용할 때 유용하다.

주어진 날짜의 주간 첫날을 포함한 해를 고려한 결과값을 원한다면, mode 인자를 0, 2, 5, 7 로 선택해야 한다.

mysql> SELECT WEEK('2000-01-01',2);
        -> 52

YEARWEEK() 함수를 사용하는 것도 대안이 될 수 있다.

mysql> SELECT YEARWEEK('2000-01-01');
        -> 199952
mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2);
        -> '52'

WEEKDAY(date)

date 에 대한 요일 색인값(0 = 월요일, 1 = 화요일, ... 6 = 일요일)을 반환한다.

mysql> SELECT WEEKDAY('1998-02-03 22:23:00');
        -> 1
mysql> SELECT WEEKDAY('1997-11-05');
        -> 2

WEEKOFYEAR(date)

date 의 달력에서 몇 주째인지 1-53 범위의 값을 반환한다. 이 함수는 WEEK(date,3)과 동일하다.

mysql> SELECT WEEKOFYEAR('1998-02-20');
        -> 8

WEEKOFYEAR()는 MySQL 4.1.1 버전부터 사용이 가능하다.

YEAR(date)

date 에서 해당 연도를 반환한다. (범위 1000-9999)

mysql> SELECT YEAR('98-02-03');
        -> 1998

YEARWEEK(date) , YEARWEEK(date,start)

date 에 대하여 연도와 몇 주째인지 반환한다. 첫번째 인자는 WEEK()의 첫번째 인자와 정확하게 작동한다. 결과 안의 연도는 첫 주와 마지막 주에 한하여 date 인자의 연도와 다를 수 있다.

mysql> SELECT YEARWEEK('1987-01-01');
        -> 198653

주수는 선택 인자 0 또는 1 에 대하여 WEEK() 함수가 반환하는 것과 다르다. WEEK()는 주어진 연도의 문맥에서 주 값을 반환한다.

YEARWEEK()는 MySQL 3.23.8 버전에서 추가되었다.


출처 : http://www.nazuni.pe.kr/web/dev/mysql/functions_datetime.php

'DEVELOPMENT > Database' 카테고리의 다른 글

[mysql] mysql 암화화 하기  (0) 2010.06.03
[mysql] column add, modify, delete  (0) 2010.04.15
[mysql] 문자열 함수[펌]  (0) 2010.03.16
MySQL Administrator를 이용하여 database 생성하기  (0) 2009.10.30
[Mysql] SQLyog GUI Tool  (0) 2009.10.28


- ASCII(str) : 해당 인저의 아스키 값을 반환한다. 문자열이 한글자 이상일 경우는 첫번째 문자에 해당하는 아스키 값을 반환한다. 빈 문자열에 대해서는 0, NULL 에 대해서는 NULL 을 반환한다.
- 예 : select ASCII('2');



- CONCAT(X,Y,...) : 해당 인자들을 연결한 문자열을 반환한다. 인자중 하나가 NULL 일 경우는 NULL 을 반환한다.
- 예 : select CONCAT('My', 'S', 'QL');



- LENGTH(str) : 문자열의 길이를 반환한다.
- 예 : select LENGTH('text');



- OCTET_LENGTH(str) : LENGTH(str) 와 동일하다.



- CHARACTER_LENGTH(str) : LENGTH(str) 와 동일하다.



- LOCATE(substr,str) : 첫번째 인자에서 두번째 인자가 있는 위치를 반환한다. 없을경우 0 을 반환한다.
- 예 : select LOCATE('bar', 'foobarbar');



- POSITION(substr IN str) : LOCATE(substr,str) 와 동일하다.



- LOCATE(substr,str,pos) : 두번째 인자에서 세번째 인자의 자리수부터 검색을 하여 첫번째 인자가 발견되는 위치를 반환한다.
- 예 : select LOCATE('bar', 'foobarbar',5);



- INSTR(str,substr) : LOCATE(substr,str) 와 동일한 기능을 하며, 차이점은 첫번째 인자와 두번째 인자가 바뀐것 뿐이다.
- 예 : select INSTR('foobarbar', 'bar');



- LPAD(str,len,padstr) : 첫번째 인자를 두번째 인자만큼의 길이로 변환한 문자열을 반환한다. 모자란 공간은 왼쪽에 세번째 인자로 채운다.
- 예 : select LPAD('hi',4,' ');



- RPAD(str,len,padstr) : LPAD 와 반대로 오른쪽에 빈공간을 채운다.
- 예 : select RPAD('hi',5,'?');



- LEFT(str,len) : 첫번째 문자열에서 두번째 길이만큼만을 반환한다.
- 예 : select LEFT('foobarbar', 5);



- RIGHT(str,len) : LEFT(str,len) 와 동일하다. 차이점은 해당 길이만큼 오른쪽에서부터 반환한다.
- 예 : select RIGHT('foobarbar', 4);
select SUBSTRING('foobarbar' FROM 4);



- SUBSTRING(str,pos,len) : 첫번째 인자의 문자열에서 두번째 인자의 위치부터 세번째 인자의 길이만큼 반환한다.
- 예 : select SUBSTRING('Quadratically',5,6);



- SUBSTRING(str FROM pos FOR len) : SUBSTRING(str,pos,len) 과 동일하다.



- MID(str,pos,len) : SUBSTRING(str,pos,len) 과 동일하다.



- SUBSTRING(str,pos) : 첫번째 인자의 문자열에서 두번째 인자로부터의 모든 문자열을 반환한다.
- 예 : select SUBSTRING('Quadratically',5);



- SUBSTRING(str FROM pos) : SUBSTRING(str,pos) 와 동일하다.



- SUBSTRING_INDEX(str,delim,count) : 첫번째 인자인 문자열을 두번째 문자로 구분하여 세번째 인자 수의 위치만큼 반환한다. 예를들어 select SUBSTRING_INDEX('www.mysql.com', '.', 2) 은 'www.mysql' 을 반환한다. 세번째 인자가 음수일경우는 반대로 오른쪽에서부터 검색하여 결과를 반환한다.
- 예 : select SUBSTRING_INDEX('www.mysql.com', '.', -2);



- LTRIM(str) : 왼쪽에 있는 공백문자를 제거한 문자열을 반환한다.
- 예 : select LTRIM(' barbar');



- RTRIM(str) : 오른쪽에 있는 공백문자를 제거한 문자열을 반환한다.
- 예 : select RTRIM('barbar ');



- TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
- 예 : select TRIM(' bar ');
select TRIM(LEADING 'x' FROM 'xxxbarxxx');
select TRIM(BOTH 'x' FROM 'xxxbarxxx');
select TRIM(TRAILING 'xyz' FROM 'barxxyz');



- REPLACE(str,from_str,to_str) : 문자열은 치환한다.
- 예 : select REPLACE('www.mysql.com', 'www', 'ftp');



- REVERSE(str) : 문자열을 뒤집는다. 예를들어, select REVERSE('abc') 은 'cba' 를 반환한다.



- LCASE(str) : 문자열을 소문자로 변환한다.
- 예 : select LCASE('QUADRATICALLY');



- LOWER(str) : LCASE(str) 와 동일하다.



- UCASE(str) : 문자열을 대문자로 변환한다.
- 예 : select UCASE('Hej');



- UPPER(str) : UCASE(str) 와 동일하다.


** MySQL 설치
http://www.mysql.com/ 에서 자신이 원하는 버전을 다운받습니다. 다운받은 파일 => mysql-5.5.0-m2-linux-i686-glibc23.tar.gz
(참고 : 키보드를 치기가 귀찮으시면 중간에 tab을눌러 자동완성 하거나 ($tar xvf mysql-5.*) 과같에 Asterisk를 사용하면 간편하게 작업을 할수 있습니다. )

파일이 유저디렉토리에 깔려있다는 전제에서 터미널 입력 방법입니다.


# cd ~
# gzip -d mysql-5.5.0-m2-linux-i686-glibc23.tar.gz
# tar xvf mysql-5.5.0-m2-linux-i686-glibc23.tar

컴파일 과정이 필요없습니다.

# groupadd mysql                                                         <-- mysql 그룹생성
# useradd -g mysql mysql                                            <-- mysql 그룹 에 mysql 유저생성
# mv mysql-5.5.0-m2-linux-i686-glibc23 /usr/local     <-- 적당한 위치로 폴더를 옮깁니다.
# cd /usr/local                                                               <-- 위치로 이동합니다.
# ln -s mysql-5.5.0-m2-linux-i686-glibc23 mysql        <-- 설정된 폴더이름과 mysql 디렉토리명을 동일화 합니다.
# cd mysql                                                                    <-- 위치로 이동합니다.
# chown -R mysql .                                                      <-- 파일 소유권 설정
# chgrp -R mysql .

# scripts/mysql_install_db --user=mysql
!위가 에러가 나는 경우
# scripts/mysql_install_db --user=mysql --no-defaults

# chown -R root .
# chown -R mysql data
# export PATH=$PATH:/usr/local/mysql/bin

--> 데몬 시작 : # mysqld_safe --user=mysql &
--> 접속        : # mysql -uroot -p암호
--> 데몬 종료 : # mysqladmin -uroot -p암호 shutdown

* 데몬 자동 시작
# gedit /etc/profile  => 맨 하단에 다음을 입력 => PATH = $PATH:/usr/local/mysql/bin
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

# chkconfig -add mysqld
!위가 안될경우
# apt-get install chkconfig

*확인
# netstat -n|p|grep 서비스명

*관리
# etc/init.d/mysqld [start|stop|restart]

출처 : http://blog.naver.com/labeldock?Redirect=Log&logNo=110077450


mysql innodb 설정

일반 2009.03.22 01:47:46
[레벨:13]휘즈 조회 수 5572 추천 수 0
innodb_data_home_dir = /var/lib/mysql/idb
- innodb 홈디렉터리 경로를 설정 합니다.
innodb_data_file_path = ibdata1:256M:autoextend:max:2000M
- 데티터 파일 옵션을 설정 합니다. 파일명 : 초기용량 : 자동증가 : 최대사이즈
innodb_log_group_home_dir = /var/lib/mysql/idb
innodb_log_arch_dir = /var/lib/mysql/idb
- 로그 디렉터리 정보
innodb_buffer_pool_size = 2G
- innodb에서 사용할 메모리 양으로 전체 메모리의 50~80% 정도로 설정
innodb_additional_mem_pool_size = 16M
innodb_log_file_size = 512M
- 로그 파일 사이즈로 버퍼풀 사이즈의 25% 정도로 설정
innodb_log_buffer_size = 2M
- 로그 버퍼 사이즈로 성능에 맞춰 로그를 기록하는 경우 크게 설정
innodb_flush_log_at_trx_commit = 2
- 커밋 로그 옵션으로 성능 최적화로 1분마다 저장되도록 2로 설정
innodb_lock_wait_timeout = 50
innodb_flush_method = O_DSYNC
- 성능을 위해 메모리에서 직접 액세스 하도록 설정


-----------------------------------------------
innodb를 재설정했을 때 db접근에 에러가 난다.
이때는 로그파일을 지우고 재시작한다.

'DEVELOPMENT > Linux' 카테고리의 다른 글

linux 명령어 - ln 심볼릭 링크  (0) 2011.05.25
linux - netstat  (0) 2011.02.14
vi 사용하기  (0) 2009.09.10
[linux] 시스템(하드웨어) 사양 보기  (0) 2009.02.18
[linux] Tomcat 설치  (0) 2009.02.15


MySQL Administrator 을 사용하여 데이터베이스를 생성하는 법을 알아본다.
만약 프로그램이 설치 되니 않았다면 해당 사이트에서 다운받아서 설치해야 한다.

http://dev.mysql.com/downloads/

먼저 프로그램을 실행 시키고 새로운 스키마를 생성을 한다.

1. 스키마 생성



스키마가 생성이 되었다면 새로운 스키마에 접근할수 있는 사용자를 추가한다.

2. 사용자 추가



2-1 사용자 계정 입력

Apply changes를 눌러 적용 시켜준다.

사용자가 추가 되었다면 추가된 사용자에 대한 권한을 준다.

Available Privileges에 있는 목록을 Assigned Privileges로 추가해준다.

3. 권한 부여




Apply changes를 눌러 적용 시켜준다.

여기까지가 완료 되었다면 Tools > MySQL Query Browser를 실행한다.



MySQL Query Browser 창이 뜨면 접속 권한을 설정해줘야 한다.
우측에 있는 스키마 창에서 mysql 탭을 더블 클릭한다.
선택이 되었다면 상단 창에 해당 선택된 스키마가 표시된다 제대로 선택이 되었는지 확인 후에
사용자에 대한 스키마 권한을 줘야 한다.

다음 쿼리를 실행해 준다.
  
grant all privileges on 디비명.* to 사용자이이디@localhost identified by '암호';
flush privileges;
select host, user, password from user order by user, host;




모두 완료 되었다면 클리이언트 프로그램으로 접속이 되는지 확인 해 본다.

'DEVELOPMENT > Database' 카테고리의 다른 글

[mysql] 날짜 관련 함수  (0) 2010.03.18
[mysql] 문자열 함수[펌]  (0) 2010.03.16
[Mysql] SQLyog GUI Tool  (0) 2009.10.28
리눅스에서 Mysql 5.1 컴파일하는 방법  (0) 2009.10.24
[mysql] 상위 5개 랜덤하게 가져오기  (0) 2009.10.06

리눅스상에서도 대부분 rpm버전을 깔 수 있지만 특수한 경우 mysql을 컴파일해야만 할 때가 있다.
다음과 같은 절차로 컴파일하면 된다.

1. mysql홈페이지에서 mysql 소스 다운(tar.gz파일)

2. 압축을 해제하고 그 디렉토리에서 ./configure 실행
./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --sysconfdir=/etc --without-debug --with-charset=utf8 --with-extra-charsets=all --with-plugins=innobase
   --prefix : 설치될 경로
   --localstatedir : 디비파일이 설치될 경로
   --sysconfdir : 환경설정파일이 저장될 경로
   --without-debug : 디버그옵션 off 로 성능 향상
   --with-plugins=innobase : 트랜잭션사용을 위해 innobase 선택

3. make

4. make install

5. 기본 테이블을 만들어주는 스크립트 실행
/usr/local/mysql/bin/mysql_install_db

6. 데몬 실행
/usr/local/mysql/bin/mysqld_safe &
 - 이때 다음과 같은 에러가 발생하고 데몬이 뜨지 않으면 chown -R mysql.mysql /usr/local/mysql 명령을 실행후 다시 데몬을 시작한다.
14:46:27 mysqld_safe Logging to '/usr/local/mysql/var/localhost.localdomain.err'.
090520 14:46:27 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var
090520 14:46:27 mysqld_safe mysqld from pid file /usr/local/mysql/var/localhost.localdomain.pid ended

7. innodb형식으로 테이블 생성
트랜잭션을 사용하기 위해 테이블생성시 다음과 같이 INNODB옵션을 준다.
CREATE TABLE Temp( col1 varchar(10) not null,
                                        col2 varchar(10)) TYPE=INNODB;



(select * from Table limit 0,5) order by rand()


출처 : http://web.lge.cn:8000/system/mysql/2059/page/2

'DEVELOPMENT > Database' 카테고리의 다른 글

[Mysql] SQLyog GUI Tool  (0) 2009.10.28
리눅스에서 Mysql 5.1 컴파일하는 방법  (0) 2009.10.24
mysql 최근 자료 가져오기  (0) 2009.10.06
[oracle] 자주 쓰는 숫자 함수  (0) 2009.09.27
Multi Table Insert  (0) 2009.07.14

최근 5일 자료를 가져오기 위한 쿼리

ex))
mysql> SELECT col1, col2, col3 FROM table
WHERE TO_DAYS(NOW()) - TO_DAYS(date_column) <= 5;