MySQL, DB생성, data type, table설계
![post-thumbnail](https://velog.velcdn.com/images/paikpaik/post/6faa448c-d384-4054-a06a-1061ca51063f/image.png)
SQL 기본 개념
SQL 뜻
- Structured Query Language
- 현업에서 쓰이는 relational DBMS의 표준 언어
- 종합적인 database 언어 : DDL + DML + VDL
SQL 주요 용어
SQL에서 relation이란?
- multiset(= bag) of tuples @ SQL
- 중복된 tuple을 허용한다.
SQL & RDBMS
- SQL은 RDBMS의 표준 언어지만, 실제 구현에 강제가 없기 때문에 RDBMS마다 제공하는 SQL의 스펙이 조금씩 다르다.
- 즉, MySQL과 PostgreSQL, Oracle 등의 문법이 다를 수 있다는 의미.
예제를 통해 SQL로 DB 정의하기
IT 회사 관련 RDB 만들기
- 부서, 사원, 프로젝트 관련 정보들을 저장할 수 있는 관계형 데이터베이스를 만들자.
- 사용할 RDBMS는 MySQL (InnoDB)
database 정의하기
mysql의 기본 명령어
- SHOW DATABASES; (어떤 database가 있는지 보여줌)
- CREATE DATABASE company[database 이름]; (database 생성)
- SELECT database(); (현재 활성화, 사용하려고 지정한 database가 뭔지 알고 싶을때)
- USE company[database 이름]; (database 활성화, 사용하려고 지정할 때)
- DROP DATABASE company[database 이름]; (database 비활성화, 사용해제 할 때)
DATABASE vs SCHEMA
- MySQL에서는 DATABASE와 SCHEMA가 같은 뜻을 의미
- CREATE DATABASE company = CREATE SCHEMA company
- 다른 RDBMS에서는 의미가 다르게 쓰임
- i.g. PostgreSQL에서는 SCHEMA가 DATABASE의 namespace를 의미
table 정의하기
IT 회사 RDB 만들기
- 부서, 사원, 프로젝트 관련 정보들을 저장할 수 있는 관계형 데이터베이스!
![](https://velog.velcdn.com/images/paikpaik/post/a0e15858-852d-434c-9143-26827e946177/image.png)
DEPARTMENT
- create table DEPARTMENT(); (table 생성 명령어)
![](https://velog.velcdn.com/images/paikpaik/post/9d9207db-d28d-4bf2-8ee8-4435d868bcc1/image.png)
attribute data type : 숫자
attribute data type : 문자열
attribute data type : 날짜와 시간
attribute data type : 그 외
Key constraints : PRIMARY KEY
- primary key : table의 tuple을 식별하기 위해 사용, 하나 이상의 attribute(s)로 구성
- primary key는 중복된 값을 가질 수 없으며, NULL도 값으로 가질 수 없다. 아래 이미지는 제약을 위반한 primary key에 해당한다.
![](https://velog.velcdn.com/images/paikpaik/post/26a763af-8782-4a32-8d16-8cfe28206823/image.png)
- primary key를 선언하는 방법은 아래와 같다.
![](https://velog.velcdn.com/images/paikpaik/post/b597baa7-ea72-40bd-acbf-2713c9f50dd3/image.png)
Key constraints : UNIQUE
- UNIQUE로 지정된 attribute(s)는 중복된 값을 가질 수 없다.
- 단, NULL은 중복을 허용할 수도 있다. (RDBMS 마다 다름)
![](https://velog.velcdn.com/images/paikpaik/post/dd481214-98c0-4d18-b463-cc3cdc8147f4/image.png)
- UNIQUE를 선언하는 방법은 아래와 같다.
![](https://velog.velcdn.com/images/paikpaik/post/4b527e40-86fd-42d6-b779-23b3f5b0364f/image.png)
NOT NULL constraint
- attribute가 NOT NULL로 지정되면 해당 attribute는 NULL을 값으로 가질 수 없다.
![](https://velog.velcdn.com/images/paikpaik/post/b272f7da-3b19-4c98-b164-f2421950a5cc/image.png)
- NOT NULL을 선언하는 방법은 아래와 같다.
![](https://velog.velcdn.com/images/paikpaik/post/c35248b3-c040-4ee7-8649-adfcb62ffb85/image.png)
- 일반적으로 NOT NULL과 UNIQUE를 같이 사용한다.
EMPLOYEE
- create table EMPLOYEE();
![](https://velog.velcdn.com/images/paikpaik/post/2ebe11d4-b99b-4c45-8500-946f70e10baf/image.png)
attribute DEFAULT
- attribute의 default 값을 정의할 때 사용.
- 새로운 tuple을 저장할 때 해당 attribute에 대한 값이 없다면 default 값으로 저장.
![](https://velog.velcdn.com/images/paikpaik/post/ee80ad04-a540-4717-a035-1593bec8cc8b/image.png)
- DEFAULT를 선언하는 방법은 아래와 같다.
![](https://velog.velcdn.com/images/paikpaik/post/b7d60507-c764-4a73-a3f4-eaaa69785ec4/image.png)
CHECK constraint
- attribute의 값을 제한하고 싶을 때 사용.
![](https://velog.velcdn.com/images/paikpaik/post/09831c35-8707-4495-8d96-4d73c4877e2c/image.png)
- CHECK를 선언하는 방법은 아래와 같다.
![](https://velog.velcdn.com/images/paikpaik/post/d2aa1685-ea37-43bc-bd50-6c7d433f8094/image.png)
Referential integrity constraint : FOREIGN KEY
- attribute(s)가 다른 table의 primary key나 unique key를 참조할 때 사용.
![](https://velog.velcdn.com/images/paikpaik/post/0f6a9a96-ca43-4b8a-a5c2-38c435196288/image.png)
- FOREIGN KEY를 선언하는 방법은 아래와 같다.
![](https://velog.velcdn.com/images/paikpaik/post/b9893436-ee9a-42e1-a39a-acb2f28b3180/image.png)
constraint 이름 명시하기
- 이름을 붙이면 어떤 constraint를 위반했는지 쉽게 파악할 수 있다.
- constraint를 삭제하고 싶을 때 해당 이름으로 삭제 가능.
![](https://velog.velcdn.com/images/paikpaik/post/52fc5129-a445-48b2-a0ef-2934dab29c47/image.png)
PROJECT
- create table PROJECT();
![](https://velog.velcdn.com/images/paikpaik/post/09e0e10a-540b-47a7-9a4d-1e55857cd48c/image.png)
WORKS_ON
- create table WORKS_ON();
![](https://velog.velcdn.com/images/paikpaik/post/048bbf67-9fa8-457c-b34f-e98d4c8a91c1/image.png)
DEPARTMENT table 수정
- 처음에 DEPARTMENT를 생성할 때는 F.K를 지정할 수가 없었는데 이제 F.K를 지정할 table들이 만들어졌기 때문에 수정하려고 함.
- ALTER TABLE [변경하려는 table 이름][변경하려는 내용];
![](https://velog.velcdn.com/images/paikpaik/post/bd378a57-5814-4c1c-b69d-4e59eaf414a9/image.png)
ALTER TABLE
- table의 schema를 변경하고 싶을 때 사용
![](https://velog.velcdn.com/images/paikpaik/post/5680823e-b75c-4786-877c-29dfc4b04714/image.png)
- 이미 서비스 중인 table의 schema를 변경하는 것이라면 변경 작업 때문에 서비스의 백엔드에 영향이 없을지 검토한 후에 변경하는 것이 중요
DROP TABLE
- table을 삭제할 때 사용
- DROP TABLE table_name;
database 구조를 정의할 때 중요한 점
- 만들려는 서비스의 스펙과 데이터 일관성, 편의성, 확장성, 등등을 종합적으로 고려하여 DB 스키마를 적절하게 정의하는 것이 중요하다.
출처 : 쉬운코드