본문 바로가기

ComputerScience/Database

[Database] SQL의 개념과 SQL로 데이터베이스를 정의하는 법(table 생성하기, 각종 데이터 타입, constraints, 키(key)들을 활용)

SQL의 기본 개념과 구조, RDBMS의 SQL 스펙

  • SQL은 Relational Database Management System에서 사용되는 표준 언어로, 데이터베이스를 정리하고 데이터를 조작하고 조회하는 등 종합적인 데이터베이스 작업이 가능하다.
  • SQL에서 Table은 데이터 모델에서 Relation을 나타내며, attribute는 column, tuple은 row, domain은 domain으로 표현한다.
  • SQL에서 Relation은 multiset of tuples로, 중복된 tuple을 허용한다.
  • MySQL은 InnoDB를 기준으로 가장 많이 사용되는 RDBMS이다.
  • 데이터베이스를 생성하고 사용할 때는 'create database' 명령어를 사용하여 새로운 데이터베이스를 만들고, 'show databases' 명령어를 사용하여 현재 활성화된 데이터베이스를 확인할 수 있다.

MySQL에서 데이터베이스 선택용 명령어

  • MySQL의 데이터베이스 고르기용 명령어는 'SELECT DATABASE'를 사용한다.
  • 만약 아직 선택된 데이터베이스가 아닐경우, 결과값은 'NULL'이다.
  • 임의로 데이터베이스를 선택하고 싶을경우 'USE'를 사용하며, 선택한 데이터베이스의 이름을 명령어에 넣으면 된다.
  • 만약 선택된 데이터베이스를 삭제하고 싶을경우 'DROP DATABASE'를 사용하며, 삭제할 데이터베이스의 이름을 명령어에 넣으면 된다.

데이터베이스 스키마 설명과 테이블 생성 방법

  • '데이터베이스'와 '스키마'는 MySQL에서 같은 의미를 가지며, RDBMS에 따라 차이가 있다.
  • MySQL에서 'CREATE DATABASE' 또는 'CREATE SCHEMA'로 데이터베이스 생성 가능.
  • PostgreSQL에서는 스키마가 데이터베이스 안에 속하는 테이블의 네임스페이스를 의미함.
  • 스키마 안에서 각각의 테이블을 정의하며, 각 테이블은 테이블끼리의 관계를 가짐.
  • 테이블의 컬럼에는 ID, 이름, 생일, 성별과 같은 정보가 포함되며, 다른 테이블의 ID를 참조하는 관계를 가짐.

데이터 타입 중 RDMBS마다 차이가 있는 숫자 데이터 타입

  • 숫자 데이터 타입에는 정수, 부동 소수점, 고정 소수점 3가지 타입이 있고, MySQL 같은 경우에는 1바이트부터 8바이트까지의 사이즈로 저장하는 정수 타입 5가지가 있다.
  • RDBMS마다 구현하는 방식이나 디테일이 조금씩 다른데, 예시로 PostgreSQL은 smallint, int, bigint 3가지 종류만 있다.
  • 부동 소수점은 실수를 저장하며 MySQL에서는 4바이트를 float형, 8바이트를 double or double precision이라고 부르는데, 고정 소수점은 실수를 정확하게 저장할 때 사용된다.
  • 특히 고정 소수점은 실수를 정확하게 저장할 필요가 있는 경우에 쓰이며, DECIMAL or NUMERIC으로 선언한다.

문자열 타입

  • 문자열 타입은 고정 크기 문자열, 가변 크기 문자열, 사이즈가 큰 문자열이 있다.
  • 고정 크기 문자열은 최대 문자 수를 정의하며, CHAR(n) (0 <= n <= 255) 로 선언한다. 저장하는 문자열이 최대 길이보다 작으면 나머지 공간은 스페이스로 채워진다.
  • 가변 크기 문자열에서는 VARCHAR(n) (0 <= n <= 65,535)을 사용하여 최대 문자 수를 저장할 수 있다. CHAR보다 시간적인 차이가 있을 수 있다.
  • 큰 문자열의 경우 VARCHAR보다 작은 크기인 TINYTEXT, TEXT, 더 큰 타입은 MEDIUMTEXT 및 LONGTEXT를 사용하는 것이 좋다.

날짜와 시간 타입

  • 날짜는 DATE, 시간은 TIME으로 표현한다.
  • 날짜와 시간을 표시할 때는 Date, Time, DateTime, Timestamp를 사용한다. Timestamp는 Timezone에 영향을 받는다.
  • DATETIME은 '1000-01-01 00:00:00' ~ 9999-12-31 23:59:59'까지의 범위를 갖는다.
  • TIMESTAMP는 '1970-01-01 00:00:01' UTC ~ '2038-01-19 03:14:07' UTC 까지의 범위를 갖는다.

그 외 데이터 타입

  • Binary, VarBinary, Blob, Byte는 다양한 링크, 암호화 키, 프로세스 등을 저장하는 데 사용된다.
  • Boolean은 PostgreSQL에는 있지만 MySQL에는 없으며, TINYINT로 대체하여 사용한다.
  • JSON 형식의 데이터를 저장하기 위해서는 JSON 데이터 타입을 사용한다.

PRIMARY KEY, UNIQUE KEY, NOT NULL, DEFAULT, CHECK

  • PRIMARY KEY는 중복된 값이 없으며, null 값을 가질 수 없다. 여러 속성으로 구성되며, 중복된 값이면 제약 발생한다.
  • PRIMARY KEY는 애트리뷰트가 하나면 바로 선언하지만, 여러 개일 경우 프라이머리 키로 지정된 트위터 네임을 선언함.
  • UNIQUE KEY는 중복 값을 허용하지 않지만 null을 가질 수 있는 KEY로, UNIQUE KEY 선언도 프라이머리 키와 같이 애트리뷰트에 따로 선언하거나 아래에 별도로 적을 수 있음.
  • 'NOT NULL'을 선언한 애트리뷰트는 'null'을 가질 수 없음. 애트리뷰트 레벨로만 가능한 선언 방법은 애트리뷰트 이름과 타입을 정하고 'NOT NULL'을 적어줌.
  • 기본 값은 'DEFAULT'로 선언하며, 튜플을 저장할 때 명시하지 않으면 해당 애트리뷰트에 'TP' 값으로 저장됨.
  • CHECK는 애트리뷰트 값을 제한하는 용도로 사용하며, 특정 조건에 대한 제한을 설정할 수 있음.

️Foreign Key

  • 어트리뷰트가 다른 Table의 primary key나 Unique key를 참조할 때 사용한다.
  • Foreign Key는 본래 테이블의 Primary Key와 일치하는 값을 가지고 있어야 한다.
  • Foreign Key를 선언할 때는 해당 컬럼에 대해 참조할 테이블과 컬럼을 명시해야 한다.
  • 참조된 값이 삭제되거나 변경될 때 어떻게 대응할지에 대한 옵션을 설정할 수 있다.
  • 옵션에는 CASCADE: 참조값의 삭제/변경을 그대로 반영, SET NULL: 참조값의 삭제/변경을 NULL 반영, SET DEFAULT: 참조값의 삭제 시 DEFAULT 값으로 반영, RESTRICT: 참조값의 삭제/변경을 금지, NO ACTION: RESTRICT와 유사
  • MySQL은 CASCADE, SET NULL, RESTRICT만 지원

CONSTRAINT

  • Check 문 앞에 'CONSTRAINT 이름'을 명시하면 어떤 CONSTRAINT를 위반했는지 쉽게 파악할 수 있다.
  • 그 CONSTRAINT를 삭제하고 싶을 때 해당 이름으로 컨텐츠를 삭제할 수도 있음.

️테이블 스키마 변경을 위한 ALTER TABLE 문

  • ALTER TABLE 문을 통해 테이블 스키마를 변경할 수 있으며, 이를 이용하여 속성 추가, 이름 변경, 타입 변경, 제약조건 추가, 제약조건 삭제 등의 작업이 가능하다.
  • 데이터베이스 스키마 변경은 이미 서비스 중인 테이블의 스키마를 변경하는 것으로, 서비스에 악영향을 줄 수 있는 위험 부담이 있다.
  • 테이블을 삭제하려면 DROP TABLE 쿼리를 사용하면 된다.

참고 자료

https://youtu.be/c8WNbcxkRhY?si=t8D-LywajQxVaxGE