SQL(Structured Query Language)
- relational DBMS의 표준 언어: relational database를 만든다고 하면 SQL을 통해 DB를 정의, 삽입, 수정 등을 함
- 종합적인 database 언어: DDL + DML + VDL
SQL에서 relation이란?
- relational data model에서의 relation과 개념이 조금 다름
- multiset(=bag) of tuples (multiset은 set과 다르게 중복 허용)
- 중복된 tuple 허용
SQL & RDBMS
- SQL은 RDBMS의 표준 언어이지만 실제 구현에 강제가 없기에 RDBMS마다 제공하는 SQL의 스펙 조금씩 다름
- ex: MySQL에서 제공하는 SQL의 문법과, Oracle에서 제공하는 SQL의 문법, 그리고 PostgreSQL에서 제공하는 SQL의 문법이 조금씩 다름 -> 현업에서 개발할 때는 사용하고 있는 RDBMS의 SQL을 잘 익히는 것이 중요!
예제를 통해 SQL로 DB 정의하기
database 정의하기
mysql에 어떤 database들이 있는지 확인하고 싶은 경우, SHOW DATABASES;
database 새로 생성하는 경우, CREATE DATABASE (내가 원하는 DB 이름);
현재 활성화 되어있는, 혹은 현재 내가 사용하겠다고 지정한 database를 확인하고 싶은 경우, SELECT database();
내가 사용할 database 지정하고 싶은 경우, USE (사용하고자 하는 database 이름);
database 지우고 싶은 경우, DROP DATABASE (삭제하고 싶은 database 이름);
DATABASE vs SCHEMA
- MySQL에서는 DATABASE와 SCHEMA가 같은 뜻을 의미, 즉 같은 역할을 수행
- 즉, CREATE DATABASE company == CREATE SCHEMA company
- BUT, 다른 RDBMS에서는 SCHEMA 의미가 다름
- PostgreSQL에서는 SCHEMA가 DATABASE의 namespace를 의미: 하나의 database가 여러 개의 schema를 가질 수 있음
- MySQL이 아닌 다른 RDBMS를 사용한다면, schema의 개념 알고 있어야 함.
- MySQL이 아닌 다른 RDBMS: database 안에서 schema가 정의되고, schema 안에서 table이 정의됨
- MySQL: database 안에서 table이 정의됨
table 정의하기
보통 현업에서 개발하는 경우: database 구축할 때 아래 그림과 같이 우선 schema부터, 즉 전체적인 구조부터 정의하고 시작함
schema 정의했으니, SQL을 통해 위 4가지 table을 생성해야 함
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도 값으로 가질 수 없다.
Key constraints: UNIQUE
- UNIQUE로 지정된 attribute(s)는 중복된 값 가질 수 없음
- 단, NULL은 중복을 허용할 수도 있음 (RDBMS 마다 다름)
NOT NULL constraint
- attribute가 NOT NULL로 지정되면 해당 attribute는 NULL을 값으로 가질 수 없음
attribute DEFAULT
- attribute의 default 값을 정의할 때 사용
- 새로운 tuple을 저장할 때 해당 attribute에 대한 값이 없다면 default 값으로 저장
CHECK constraint
- attribute 값 제한하고 싶을 때 사용
Referential integrity constraint: FOREIGN KEY
- attribute(s)가 다른 table의 primary key나 unique key를 참조할 때 사용
- 참조하고 있던 값이 삭제되거나, 업데이트 될 때 어떤 옵션을 줄 것인지가 중요!
- MySQL에서는 SET DEFAULT를 제대로 지원하지 않음. 따라서 MySQL에서 지원하는 서로 다른 종류의 reference_option은 CASCADE, SET NULL, RESTRICT 이 3개가 있다고 생각하면 됨.
- 반면, PostgreSQL의 경우에는 5가지 모두 제대로 지원함.
constraint 이름 명시하기
- 이름을 붙이면 어떤 constraint을 위반했는지 쉽게 파악 할 수 있다
- constraint를 삭제하고 싶을 대 해당 이름으로 삭제 가능
- 맨 처음 DEPARTMENT table 선언 시, leader_id에 대해서 foreign key를 걸어두지 않았음.
- 왜? DEPARTMENT table을 선언할 당시에는 EMPLOYEE table이 없었기에 reference할 수 없었음.
- 지금은 EMPLOYEE table이 생겼으니 foreign key를 추가해줘야 함.
- table이 만들어진 뒤에 table schema를 변경하는 것임.
- 이때 어떤 SQL을 사용하냐면, ALTER TABLE (변경하려는 table 이름) (무엇을 해줄 지)
- 이미 서비스 중인 table의 schema를 변경하는 것이라면, 변경 작업 때문에 백엔드에 영향이 없을지 검토한 후에 변경하는 것이 중요 (개발자는 개발만 하는 것 아니라 서비스를 안정적으로 유지하면서 개발을 잘 하는 것이 중요!)
DROP TABLE
- table 삭제할 때 사용
- DROP TABLE table_name;
database 구조를 정의할 때 중요한 점
- 만들려는 서비스의 스펙과 데이터 일관성, 편의성, 확장성 등등을 종합적으로 고려하여 DB 스키마를 적절하게 정의하는 것이 매우 중요 !!
- DB를 얼마나 잘 설계하는가
- 내가 속한 팀이 구현하려고 하는 스펙을 잘 반영하여 SQL문을 적절하게 활용하는 것이 중요하다 !!!