3. Defining a Schema in SQL

2021. 5. 2. 20:01Computer Sciences/Database

Character Strings

  • CHAR(n) = CHARACTER(n)
    • 크기를 지정하지 않을 시 1로 지정됨
  • VARCHAR(n) = CHAR VARYING(n) = CHARACTER VARYING(n)
  • 문자열 입력 시에는 Single Quote 사용('') Double Quote 불가
  • CHAR로 선언 후에 공간을 모두 사용하지 않으면 공백을 추가
    • a char(7) = 'hello' → 'hello '
  • VARCHAR는 사용하지 않은 공간은 무시함
    • b varchar(7) = 'world' → 'world'

Bit Strings

  • BIT(n), BIT VARYING(n)
  • 리터럴(아래는 PostgreSQL 한정)
    • 2진수 - B'0101'
    • 16진수 - X'FF0'

Boolean

  • BOOLEAN: { TRUE, FALSE, UNKNOWN }

Dates and Times

  • DATE
  • TIME [with time zone]
  • TIMESTAMP [with time zone]
  • 리터럴
    • DATE '2009-03-11'
    • TIME '13:29:30'
    • TIMESTAMP '2009-03-11 13:30:45'

Integer Numbers

  • TINYINT: 1 Byte
  • SMALLINT: 2 Bytes
  • INT, INTEGER: 4 Bbytes
  • BIGINT: 8 Bytes

Floating-Point Numbers

  • REAL: 4 Bytes
  • DOUBLE PRECISION: 8 Bytes
  • FLOAT(n): 부동 소수점 크기를 지정할 수 있음

NUMERIC, DEC

  • 매우 큰 숫자를 저장할 수 있는 타입
  • 화폐를 저장하거나 수량에 대한 정확성이 요구될 때 추천된다
  • Integer인지 float-point 타입인지 비교하기 때문에 느리다.
  • NUMERIC(p, s)
    • p엔 저장하는 전체 크기를 입력
      • 정수 부분이 잘리면 에러
    • s엔 소수점 부분의 크기를 입력
      • 소수점 부분이 잘리면 잘린 부분에서 반올림함
    • Ex: NUMERIC(2,1) → -9.9 ~ 9.9 까지 저장 가능
    • s를 생략할 경우 정수만 저장함
    • 크기를 정확히 알 수 없을 땐 둘 다 생략 가능(각 DB 메뉴얼 확인)

PostgreSQL Data Types

  • SERIAL
    • 실제 타입은 아니고 단지 유일한 식별자 컬럼을 만들기 위한 편의를 위해 만들어짐
    • int 타입에 식별자로서 기본적으로 생성되는 컬럼에 SERIAL로 지정함
    • Ex
      • id SERIAL, = id int GENERATED BY DEFAULT AS IDENTITY,
  • TEXT
    • 단순 문자열(max 1GB)
  • BYTEA
    • 이진 문자열 데이터(max 1GB)
    • 이미지 같은 멀티미디어 데이터
  • CLOB
    • 매우 큰 문자열 처리 시 사용
    • PostgreSQL에선 지원하지 않음
  • BLOB
    • 매우 큰 이진 문자열 데이터 처리 시 사용
  • CLOB와 BLOB은 표준화가 잘 되어있지 않음

Table Declarations

  • PRIMARY KEY는 null이 지원되지 않음
    • 값 중복 x
    • 반드시 값을 입력해야 함
    • 테이블 데이터의 고유 인식번호(id)
  • UNIQUE는 null도 값으로 받을 수 있는 유일한 원소를 가지는 컬럼
    • 값 중복 x
    • 값을 입력하지 않아도 됨(null 허용)
    • 중복되면 안 되는 데이터(주민번호, 군번 등)

Sequence, Identity

MySQL의 AUTO_INCREAMENT와 같은 기능

Sequence

SEQUENCE 구문을 따로 만들어 둔 뒤 nextval('시퀀스 이름')을 사용

SEQUENCE는 동시에 여러 입력이 들어와도 항상 다른 값을 할당해줌

SERIAL을 사용하면 위와 같은 시퀀스 구문을 INT 형으로 간편하게 사용할 수 있음

주의할 점은 값을 직접 입력하는 경우 다음과 같이 SEQUENCE 오류가 발생할 수 있음

아래는 4를 직접 입력했지만 SEQUENCE의 다음 값은 4가 되어야 하기 때문에 중복 키 오류가 발생한 것

Identity

아래와 같이 int GENERATED BY DEFAULT AS IDENTITY라는 구문을 사용하면 sequence와 같은 기능을 함.

by default 는 always로도 사용할 수 있는데 always로 사용 시 사용자의 입력값조차도 무시함

by default는 사용자가 임의로 지정한 값을 받을 수 있음

아래와 같이 nextval이나 default로도 사용할 수 있음

현재는 둘 다 표준으로 발전되어 두 가지 다 사용할 수 있음

타입을 SERIAL로 지정하면 두 번째 문단과 같은 기능을 매크로처럼 실행해줌

ALTER SEQUENCE message_id_seq OWNED BY message.id; 구문은

message 테이블이 삭제되면 message_id_seq 시퀀스도 함께 삭제되는 기능이다.

'Computer Sciences > Database' 카테고리의 다른 글

6-1. E/R 모델  (0) 2021.05.02
5. Bags and Extended Relational Algebra  (0) 2021.05.02
4. Relational Algebra  (0) 2021.05.02
2. Relational Data Model  (0) 2021.05.02
1. What is Database?  (0) 2021.05.01