본문 바로가기

DB/DB 강의

DB 3강

SQL(Structured Query Language)

  • relational DBMS의 표준 언어: relational database를 만든다고 하면 SQL을 통해 DB를 정의, 삽입, 수정 등을 함
  • 종합적인 database 언어: DDL + DML + VDL

SQL 주요 용어 (완전히 구분지어서 사용하지는 않음)

 

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 정의하기

예제를 통해 SQL로 DB 정의하기

 

database 정의하기 

 

mysql에 어떤 database들이 있는지 확인하고 싶은 경우, SHOW DATABASES;

SHOW DATABASES

 

 

database 새로 생성하는 경우, CREATE DATABASE (내가 원하는 DB 이름);

CREATE DATABASE (원하는 DB이름)

 

company라는 database가 생김

 

 

현재 활성화 되어있는, 혹은 현재 내가 사용하겠다고 지정한 database를 확인하고 싶은 경우, SELECT database();

선택된 database가 아직 없는 상태

 

 

내가 사용할 database 지정하고 싶은 경우, USE (사용하고자 하는 database 이름);

company라는 database 지정

 

활성화된 company database

 

 

  database 지우고 싶은 경우, DROP DATABASE (삭제하고 싶은 database 이름);

company 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부터, 즉 전체적인 구조부터 정의하고 시작함  

IT회사 데이터베이스의 schema 정의

   

 

schema 정의했으니, SQL을 통해 위 4가지 table을 생성해야 함

1. DEPARTMENT table 생성


attribute data type: 숫자  

SQL을 구현하는 RDBMS마다 조금씩 다르다는 것을 알고 있어야 함

attribute data type: 문자열 

SQL을 구현하는 RDBMS마다 조금씩 다르다는 것을 알고 있어야 함

attribute data type: 날짜와 시간

 

attribute data type: 그 외


Key constraints: PRIMARY KEY

  • primary key: table의 tuple을 식별하기 위해 사용, 하나 이상의 attribute(s)로 구성
  • primary key는 중복된 값을 가질 수 없으며, NULL도 값으로 가질 수 없다.

key constraints 위반한 경우

 

primary key 선언하는 방법

 

 

Key constraints: UNIQUE

  • UNIQUE로 지정된 attribute(s)는 중복된 값 가질 수 없음
  • 단, NULL은 중복을 허용할 수도 있음 (RDBMS 마다 다름)

key constraints 위반한 경우

 

unique key 선언하는 방법

 

NOT NULL constraint

  • attribute가 NOT NULL로 지정되면 해당 attribute는 NULL을 값으로 가질 수 없음

key constraints 위반한 경우

 

NOT NULL 선언하는 방법 (보통 NOT NULL과 UNIQUE 같이 많이 씀.)

 

 

2. EMPLOYEE table 생성

 

attribute DEFAULT

  • attribute의 default 값을 정의할 때 사용
  • 새로운 tuple을 저장할 때 해당 attribute에 대한 값이 없다면 default 값으로 저장

DEFAULT 선언하는 방법

CHECK constraint

  • attribute 값 제한하고 싶을 때 사용

CHECK constraint 위반한 경우

 

CHECK 선언하는 방법

 

Referential integrity constraint: FOREIGN KEY

  • attribute(s)가 다른 table의 primary key나 unique key를 참조할 때 사용

Referential integrity constraint

 

FOREIGN KEY 선언하는 방법

  • 참조하고 있던 값이 삭제되거나, 업데이트 될 때 어떤 옵션을 줄 것인지가 중요!
  • MySQL에서는 SET DEFAULT를 제대로 지원하지 않음. 따라서 MySQL에서 지원하는 서로 다른 종류의 reference_option은 CASCADE, SET NULL, RESTRICT 이 3개가 있다고 생각하면 됨.
  • 반면, PostgreSQL의 경우에는 5가지 모두 제대로 지원함.

 

 

constraint 이름 명시하기

  • 이름을 붙이면 어떤 constraint을 위반했는지 쉽게 파악 할 수 있다
  • constraint를 삭제하고 싶을 대 해당 이름으로 삭제 가능

constraint 이름 명시하기


 

3. PROJECT table 생성

 

4. WORKS_ON table 생성

 

 

 

  • 맨 처음 DEPARTMENT table 선언 시, leader_id에 대해서 foreign key를 걸어두지 않았음.
  • 왜? DEPARTMENT table을 선언할 당시에는 EMPLOYEE table이 없었기에 reference할 수 없었음.
  • 지금은 EMPLOYEE table이 생겼으니 foreign key를 추가해줘야 함.

 

  • table이 만들어진 뒤에 table schema를 변경하는 것임.
  • 이때 어떤 SQL을 사용하냐면, ALTER TABLE (변경하려는 table 이름) (무엇을 해줄 지)

ALTER TABLE: table 생성한 뒤, table schema의 변경이 필요할 때 사용되는 SQL.

 

ALTER TABLE 유형

 

  • 이미 서비스 중인 table의 schema를 변경하는 것이라면, 변경 작업 때문에 백엔드에 영향이 없을지 검토한 후에 변경하는 것이 중요 (개발자는 개발만 하는 것 아니라 서비스를 안정적으로 유지하면서 개발을 잘 하는 것이 중요!)

 

DROP TABLE

  • table 삭제할 때 사용
  • DROP TABLE table_name;

 

database 구조를 정의할 때 중요한 점

  • 만들려는 서비스의 스펙과 데이터 일관성, 편의성, 확장성 등등을 종합적으로 고려하여 DB 스키마를 적절하게 정의하는 것이 매우 중요 !!
  • DB를 얼마나 잘 설계하는가
  • 내가 속한 팀이 구현하려고 하는 스펙을 잘 반영하여 SQL문을 적절하게 활용하는 것이 중요하다 !!! 

'DB > DB 강의' 카테고리의 다른 글

DB 6강  (1) 2023.09.19
DB 5강  (2) 2023.09.18
DB 4강  (2) 2023.09.13
DB 2강  (0) 2023.09.12
DB 1강  (1) 2023.09.10