개발공부/SQL

[SQL] 데이터 타입과 제약조건

jnnjnn 2024. 4. 26. 17:01

 

데이터 타입(DATA TYPE)

문자열

- VARCHAR(글자수)

문자열 타입을 저장할 수 있고 저장할 수 있는 최대길이를 ()안에 넣습니다

지정된 글자수를 초과하면 저장할 수 없습니다

# 문자열
# varchar(길이)

CREATE TABLE my_table3
(
    name  VARCHAR(3),
    title varchar(5),
    notes VARCHAR(1000)
);

INSERT INTO my_table3(name, title, notes)
VALUES ('이강인', '축구선수', '파리셍제르망');

# 에러 발생(글자수 초과)
INSERT INTO my_table3(name, title, notes)
VALUES ('네이마르', '야구선수', '사우디아라비아');

 

TEXT

VARCHAR보다 많은 문자열을 저장할 수 있습니다

 

- 정수 : INT

- 실수 : DECIMAL, DEC ( 총길이[소수점포함],  소수점이하 길이 )

 

CREATE TABLE my_table5
(
    age    INT,
    height DEC(5, 2)
);

DESC my_table5;

# 크기 초과하면 반올림해서 들어감
INSERT INTO my_table5 (age, height)
VALUES (10, 170.257);

 

 

날짜시간

DATE : 날짜를 저장(YYYY-MM-DD)

DATETIME : 날짜와 시간을 저장 (YYYY-MM-DD HH:MM:SS)

#날짜시간
# DATE : 날짜 (YYYY-MM-DD)
# DATETIME : 날짜시간 (YYYY-MM-DD HH:MM:SS)

CREATE TABLE my_table7
(
    col1 DATE,
    col2 DATETIME
);

INSERT INTO my_table7 (col1, col2)
VALUES ('2002-08-10', '1999-09-09 22:10:10');

 

 

제약조건 (Constraint)

특정 컬럼에 입력되는 자료의 규칙을 지정할 수 있다

지정한 규칙을 따르지 않으면 데이터가 저장되지 않는다

 

NOT NULL

NULL값을 저장할 수 없다. 

CREATE TABLE my_table11
(
    col1 VARCHAR(10),
    co12 VARCHAR(10) NOT NULL
);

# 오류 발생
INSERT INTO my_table11
    (col1)
VALUES ('value');

# 해당 컬럼에 값이 없는 레코드 조회
SELECT *
FROM my_table11
WHERE col1 IS NULL;

# 해당 컬럼에 값이 있는 레코드 조회
SELECT *
FROM my_table11
WHERE col1 IS NOT NULL;

#NULL과의 연산은 모두 FALSE
# col1 != NULL, col1 <> NULL

 

DEFAULT

값을 입력하지 않았을 경우에 들어가는 기본값을 지정한다.

기본값이 있지만, NULL값도 들어갈 수 있기 때문에 NOT NULL은 아니다

# DEFAULT : 값을 주지 않을 때의 기본값을 정의
CREATE TABLE my_table13
(
    col1 VARCHAR(10),
    col2 VARCHAR(10) DEFAULT 'abc'
);

# col2 값은 'abc'로 자동 지정
INSERT INTO my_table13
    (col1)
VALUES ('bnm');

# NULL 값도 저장 가능
INSERT INTO my_table13
    (col1, col2)
VALUES ('jkl', NULL);

CREATE TABLE my_table14
(
    col1 VARCHAR(30),
    col2 VARCHAR(30) NOT NULL,
    col3 VARCHAR(30)          DEFAULT 'abc',
    col4 VARCHAR(30) NOT NULL DEFAULT 'abcd'
);

 

UNIQUE

해당 컬럼에 중복되는 값을 저장할 수 없다. 단, NULL값은 데이터 없음이므로 중복이 가능하다

# UNIQUE : 다른 레코드의 컬럼 값이 중복되지 않음
CREATE TABLE my_table15
(
    col1 VARCHAR(3),
    col2 VARCHAR(3) UNIQUE
);

INSERT INTO my_table15
    (col1, col2)
VALUES ('abc', 'def');

# 오류 발생
INSERT INTO my_table15
    (col1, col2)
VALUES ('def', 'def');

# null 값은 중복 허용
INSERT INTO my_table15
    (col1)
VALUES ('qwe');

INSERT INTO my_table15
    (col1)
VALUES ('ert');


CREATE TABLE my_table16
(
    col1 VARCHAR(10),
    col2 VARCHAR(10) UNIQUE,
    col3 VARCHAR(10) NOT NULL UNIQUE # = PRIMARY KEY
);

 

PRIMARY KEY(기본키)

하나의 테이블에 있는 데이터를 식별하기 위한 기준으로 인식되는 제약조건. 테이블 당 하나만 존재한다

NOT NULL이면서 UNIQUE인 속성을 가지고 있지만

PRIMARY KEY와 다르게 NOT NULL UNIQUE는 여러개 만들 수 있다

# PRIMARY KEY : NOT NULL UNIQUE
CREATE TABLE my_table17
(
    col1 INT,
    col2 INT PRIMARY KEY -- NOT NULL UNIQUE
);

INSERT INTO my_table17
    (col1, col2)
VALUES (2, 2);

# 오류 발생
INSERT INTO my_table17
    (col1, col2)
VALUES (3, 2);

# PRIMARY KEY 제약사항은 한 테이블에 하나만 줄 수 있음
# 불가능
CREATE TABLE my_table18
(
    col1 INT PRIMARY KEY,
    col2 INT PRIMARY KEY
);

#가능
CREATE TABLE my_table19
(
    col1 INT NOT NULL UNIQUE,
    col2 INT PRIMARY KEY
);

DESC my_table19;

# 여러 컬럼 조합으로 PRIMARY KEY 제약사항을 줄 수 있음
CREATE TABLE my_table21
(
    col1 INT,
    col2 INT,
    col3 INT,
    PRIMARY KEY (col1, col2)
);

 

 

FOREIGN KEY(외래키)

해당 컬럼에 참조하는 테이블로부터 존재하는 값들만 사용한다는 의미의 제약조건

FOREIGN KEY (테이블명) REFERENCES 참조테이블명 (참조컬럼)

CREATE TABLE Customer
(
    id         INT PRIMARY KEY AUTO_INCREMENT,
    first_name VARCHAR(3),
    last_name  VARCHAR(3)
);

CREATE TABLE Phone_number
(
    id           INT PRIMARY KEY AUTO_INCREMENT,
    customer_id  INT,
    phone_number VARCHAR(10),
    FOREIGN KEY (customer_id) REFERENCES Customer (id)
);