● 데이터 베이스 사용자 만들기


create user wwwi with password 'wwwi';


● 데이터베이스  만들기


create database wwwi;


● 테이블 만들기


create table testa (

  key          char(16) primary key,

  val1        integer,

  val2        integer,

);


  *테이블 만들 때에  NOT NULL 제약(NULL Data 입력 금지), 

  UNIQUE 제약, (동일한 Data 입력 금지)

  DEFAULT 초기값 설정가능


create table testa (

  key          char(16) primary key,

  val1        integer not null,

  val2        integer unique,

  val3        integer default 0 not null

);


  *constraint으로 Primary Key를 설정하거나 복수의 Primary Key는

  아래와 같은 방법으로 설정


create table testa (

  key          char(16),

  val1        integer,

  val2        integer,

  constraint PK_NAME primary key (

    key,

    val1

  )

);


● 테이블 지우기


drop table testa;


● 기본적인 필드 타입


    smailint                           2 바이트 정수

    integer                            4 바이트 정수

    bigint                             8 바이트 정수

    decimal(a, a)/numeric(a, s)        10진수형

    real                               6자리 단정도 부동소수점

    double precision                   15 자리 배정도 부동소수점

    serial                             4 바이트 일련번호

    bigserial                          8 바이트 일련번호

    date                               일자

    time                               시간

    timestamp                          일자시간

    char(문자수)/character             고정길이 문자열  (최대 4096 문자)

    varchar(문자수)/charcter varying   가변길이 문자열  (최대 4096 문자)

    text                               무제한 텍스트

    Large Object                       oid형

    boolean/bool                       true/false


● 키 만들기


  *단일 키 설정은 테이블 만들 때에 create table에서 하는 편이 좋다.

    단일 키를 설정할 필드에 primary key를 지정하면 된다.


  key          char(16)     primary key,


  *복수 키는 아래와 같이 추가할 수 이싿.


create table testa (

  key          char(16),

  val1        integer,

  val2        integer,

  constraint PK_NAME primary key (

    key,

    val1

  )

);


  * 인덱스를 추가하면 검색 속도를 빠르게 할 수 있지만 너무 많이 만들면

    갱신할 때에 부하가 걸릴 수 있다.

    

create unique index PK_NAME on testa (

  key,

  val1

);


create index PK_NAME on testa (

  key,

  val1

);


● 키 지우기


drop index PK_NAME;


● 일련번호  만들기


  *일변번호는 serial로 정의해서 사용할 수 있음


create table testa (

  key          char(16),

  val1        serial,

  val2        integer,

);


insert into testa values('key00A');

insert into testa values('key00B');


   key      | val1 | val2 

--------+----+------

 key00A   |    1 |      

 key00B   |    2 |      



create sequence seq;


  *다음과 같이 만들면 10 ~ 1000000, 100씩 증가하며 최대값이 되면 다시 최소값으로 돌아간다.


create sequence seq

  increment    10

  minvalue     10

  maxvalue     1000000

  start        10

  cache        100

  cycle

;


  *일련번호는 다음과 같이 사용한다.

    nextval이 일련번호를 만들어 내고

    currval은 일변번호의 현재값을 가져온다.


insert into testa values ('k001', nextval('seq'), 10);

insert into testa values ('k002', nextval('seq'), 10);

insert into testa values ('k003', currval('seq'), 10);


   key    | val1 | val2 

------+-----+------

 k001     | 10   |   10 

 k002     | 20   |   10 

 k003     | 20   |   10 


● 일련번호  지우기


drop sequence seq;


Posted by 떡잎
DB를 잘 안써서 모르고 있었는데
이렇게 좋은 기능이 있었다.

어떤 조건에 해당하는 record중 앞쪽에서 지정한 수만큼 record를 가져올 수 있다.


  Microsoft SQL Server   SELECT TOP 10 column FROM table
  PostgreSQL and MySQL   SELECT column FROM table LIMIT 10
  Oracle   SELECT column FROM table WHERE ROWNUM <= 10
  Sybase   SET rowcount 10 SELECT column FROM table
  Firebird   SELECT FIRST 10 column FROM table



DB마다 좀 문법은 틀리기는 해도 이런 기능들이 다 있기는 하네
이런 기능이 예전부터 있었던건가?

하기야 나같은 경우는 access를 주로 써서 access는 이런 기느이 없네
Posted by 떡잎

Timestamp형에서 날짜와 시간을 분리하는 SQL
SELECT 
    cast(extract(day from myTIMESTAMP)|| '.'||
           extract(month from myTIMESTAMP)|| '.'||
           extract(year from myTIMESTAMP) as date) ,
    cast(extract(Hour from myTIMESTAMP)|| ':'||
           extract(Minute from myTIMESTAMP)|| ':'||
           extract(Second from myTIMESTAMP) as Time) 
FROM MyLOG

위의 SQL문을 쓰면 Timestamp형 필드를 날짜형과 시간형으로 바꾸어준다.

TIMESTAMP형 WHERE문
SELECT  * FROM MyLOG
WHERE myTIMESTAMP > '2009-1-7 12:00:00'

SELECT  * FROM MyLOG
WHERE myTIMESTAMP > '2009-1-1'

Timestamp에서 WHERE문을 쓸 때는 날짜만 써도 된다.
아마도 날짜만 입력하면 뒤에 자동으로 00:00:00으로 처리하는 것 같다.
Posted by 띠리
TEST 로그 테이블
CREATE TABLE TestLOG
(
        TestDATE  Date   NOT NULL,
        TestTIME Time   NOT NULL,
        LogText varCHAR(255)
);

현제 날짜 시간 입력하는 SQL 문
INSERT INTO TestLOG (TestDATE, TestTIME, LogText)
VALUES (
    cast('now' as DATE),
    cast('now' as TIME),
   'TEST LOG INSERT DATA',
);

이렇게 하면 SQL문 만으로 오늘 날짜와 시간이 자동으로 입력된다.
Posted by 띠리
Create 문

  - 테이블(Table), 인덱스(Index), 시퀀스(Sequence) 만들기
  - 각 객체 만들기

 ◆ 테이블 만들기

    문법

CREATE TABLE 테이블명 (
    필드명   필드형 [ not null ]
    [ , 필드명  필드형 [ not null ] ]** )

(필드형 = 필드 데이터형)  (필드 =  컬럼)

필드 데이터형 설명
char(문자수) 문자열
text(문자수) 문자열
int 정수
real 실수
unit 부호없는 정수
date 날짜
time 시간
money 고정소수점 두 자리 사용

사용예

  CREATE TABLE Customer (
      CustomerId int not null,
      Name char(20) not null,
      NickName char(20) not null,
      Address text(200))  

 ◆ 인덱스 만들기

문법

  CREATE [ UNIQUE ] INDEX 인덱스명 ON 테이블명 (
      필드명 [ , 필드명 ] ** )  

사용예

  CREATE UNIQUE INDEX CustomerIndex  ON Customer (CustomerId)

  CREATE INDEX CustomerIndex2 ON Customer (Name, NickName)  


 ◆ 시퀀스 만들기

문법

  CREATE SEQUENCE ON 테이블명 [ STEP 스텝값 ] [ VALUE 초기값 ]

사용예

  CREATE SEQUENCE ON SEQ_TEST STEP 1 VALUE 5
 
  SELECT _seq FROM SEQ_TEST

DROP 문


  - 테이블(Table), 인덱스(Index), 시퀀스(Sequence) 없애기
  - 테이블이 지원지면 관련된 인덱스와 시퀀스도 함께 없어짐
 
 문법

  DROP TABLE 테이블명
  DROP INDEX 인덱스명 FROM 테이블명
  DROP SEQUENCE FROM 테이블명

사용예

  DROP TABLE Customer
  DROP INDEX CustomerIndex   FROM Customer
  DROP SEQUENCE FROM Customer


INSERT 문


  - 테이블에 데이터를 입력
  - 필드명을 쓰지않으면 모든 필드에 데이터를 입력
 
 문법

  INSERT INTO 테이블명 VALUES (필드값, [필드값])
  INSERT INTO 테이블명 (필드명 [, 필드명]) VALUES (필드값 [, 필드값])

사용예

  INSERT INTO Customer ( name, nick_name)
    VALUES ( '이기자', '나이겨')

  INSERT INTO Customer VALUES ( 1, '이기자', '나이겨', '지구촌 한국 마을')


UPDATE 문


  -  WHERE 절로 갱신할 데이터 선택해서 선택된 테이블의 데이터를 갱신
  - 필드명을 쓰지않으면 모든 필드에 데이터를 입력
 
 문법

  UPDATE 테이블명 SET 필드명 = 필드값 [ , 필드명 = 필드값 ]**
    WHERE절     

사용예

  UPDATE Customer SET NickName='나막가' WHERE CustomerId = 111

  UPDATE Customer SET NickName='ㅎㅎㅎ' Address = '해왕성촌' WHERE CustomerId = 111


DELETE 문


  -  WHERE 절로 삭제할 데이터 선택해서 선택된 테이블의 데이터를 삭제
 
 문법

  DELETE FROM 테이블명
    WHERE절     

사용예

  DELETE FROM Customer WHERE CustomerId = 111




SELECT 문

BNF로 표기한 SQL문법 참조

Posted by 띠리

ANSI SQL
데이터형
Microsoft
Access
데이터형
별명 Microsoft
SQL Server
데이터형
BIT,
BIT VARYING
BINARY VARBINARY,
BINARY VARYING
BIT VARYING
BINARY,
VARBINARY
미지원 BIT BOOLEAN,
LOGICAL,
LOGICAL1,
YESNO
BIT
미지원 TINYINT INTEGER1,
BYTE
TINYINT
미지원 COUNTER AUTOINCREMENT -
미지원 MONEY CURRENCY MONEY
DATE,
TIME,
TIMESTAMP
DATETIME DATE,
TIME
DATETIME
미지원 UNIQUEIDENTIFIER GUID UNIQUEIDENTIFIER
DECIMAL DECIMAL NUMERIC,
DEC
DECIMAL
REAL REAL SINGLE,
FLOAT4,
IEEESINGLE
REAL
DOUBLE
PRECISION,
FLOAT
FLOAT DOUBLE,
FLOAT8,
IEEEDOUBLE,
NUMBER
FLOAT
SMALLINT SMALLINT SHORT,
INTEGER2
SMALLINT
INTEGER INTEGER LONG, INT,
INTEGER4
INTEGER
INTERVAL 미지원 - 미지원
미지원 IMAGE LONGBINARY,
GENERAL,
OLEOBJECT
IMAGE
미지원 TEXT LONGTEXT,
LONGCHAR,
MEMO,
NOTE,
NTEXT
TEXT
CHARACTER,
CHARACTER
VARYING,
NATIONAL
CHARACTER,
NATIONAL
CHARACTER
VARYING
CHAR TEXT(n),
ALPHANUMERIC,
CHARACTER,
STRING,
VARCHAR,
CHARACTER
VARYING,
NCHAR,
NATIONAL
CHARACTER,
NATIONAL CHAR,
NATIONAL
CHARACTER
VARYING,
NATIONAL CHAR
VARYING
CHAR,
VARCHAR,
NCHAR,
NVARCHAR

[출처]
http://msdn2.microsoft.com/en-us/library/bb177899.aspx

어느 타이밍인가 MEMO 타입와 TEXT 타입의 구분이 없어졌군.
Posted by 띠리
BLOG main image
프로그래밍 공부하면서 써가는 개인 노트 (따라서 여기에 씌여있는 소스의 신빙성을 보장 못함 -.-;;) 이 블로그 보면서 틀린 점이 있으면 꼬옥 알려주세요. by 띠리

공지사항

카테고리

분류 전체보기 (323)
Win32 SDK 초보 (27)
통신관련 (11)
MFC TIP (20)
C/C++ TIP (10)
개발기타 (10)
링크 (2)
견물생심 (24)
이것저것 (8)
용어메모 (3)
데이터베이스 (32)
비주얼 베이직 (10)
하드웨어 (3)
C# (42)
Xcode (3)
델파이 (82)
홈페이지 (5)
MindStorm (0)
낙서 (5)
스크래치 (0)
기타 (6)
아두이노 (1)
라즈베리파이 (2)
안드로이드 (6)
파이썬 (0)
WEB (2)
Total : 987,324
Today : 402 Yesterday : 409