✅ 데이터 추가하기
: Employee 테이블부터 데이터를 추가해보자.


INSERT INTO 테이블 VALUES () 키워드로 데이터를 추가한다. 이 때, VALUES 에 넣어주는 값 순서는 테이블을 생성할 때, attribute를 넣어준 순서대로 값을 넣어주면 된다.
create table EMPLOYEE(
id INT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
birth_date DATE,
sex CHAR(1) CHECK(sex in ('M','F')),
position VARCHAR(10),
salary INT DEFAULT 50000000,
dept_id INT,
FOREIGN KEY (dept_id) references DEPARTMENT(id)
on delete SET NULL on update CASCADE,
CHECK (salary >= 50000000)
);
위 순서로 EMPLOYEE 테이블을 만들었다. 여기서 주목해야 할 점은 dept_id 값으로 null 을 줬다는 것인데, 현재 DEPARTMENT 테이블에는 아무런 값이 없기 때문에 지금은 dept_id 가 참조할 값이 아무것도 없다. 그래서 임시로 null 값을 준 것이다.
또 다른 직원 데이터를 추가해보자.

위와 같이 KIM 을 직원 데이터에 넣으려는데, 에러가 뜬다. 이유는 Primary Key 인 id 값으로 중복된 값 1을 넣어줬기 때문이다.
그러면 id 값을 2로 바꿔주고 다시 데이터를 추가해보자.

위와 같이 데이터를 추가하려면, 또 에러가 나온다. 이번에는 salary 속성값 때문인데, 테이블을 생성할 때, salary 값을 50000000 이상으로 제약조건을 걸어놨다. CHECK(salary >= 50000000) 부분 말이다.
여기서, employee_chk_2가 뭔지 알고 싶으면, 즉 어디서 오류가 났는지 알고 싶을 때 'SHOW CREATE 테이블이름'을 해주면 된다.

이제 다시 이 값도 제대로 주고 데이터를 추가해보자.

이번에도 실패다..뭐가 문제일까?
이번에는 마지막 dept_id 값에 null 이 아닌 111 값을 추가했다.
아까 분명 처음에 데이터를 추가할 때, 현재는 DEPARTMENT 테이블에 아무런 값이 없기 때문에 임시로 null 을 줬다고 했다. 근데 이렇게, 특정 값을 줘버리면 오류가 난다. 존재하지 않는 값을 참조하려고 특정 값을 넣어주게 되면 에러가 난다는 뜻이다.
즉, 참조하는 값이 실제로 그 테이블에 있을 때에만 그 값을 지정해줄 수 있다는 것을 알 수 있다.
이제 성공적으로 값이 추가되게 해보자.

현재까지 EMPLOYEE 테이블에는 2개의 데이터가 들어가 있다.

이제 또 다른 데이터를 추가해볼 것인데, 데이터를 추가하는 방식을 조금 바꿔볼 것이다.
이제까지는 테이블 생성시, attribute 를 준 순서대로 값을 넣어줘야 했는데, 직접적으로 속성값을 명시하고 해당 자리에 값을 넣어보자.

여기서, salary 나 dept_id 처럼 빠진 attribute 값에 대해서는 데이터를 주지 않고, 명시한 attributes 에만 값을 준 것이다. 테이블 생성 시의 속성 순서를 따를 필요도 없고, 원하는 값만 줄 수 있는 장점이 있다.
현재까지 EMPLOYEE 테이블은 아래와 같다.

id 값이 3인 Jay 의 salary는 따로 값을 안 넣어줬기 때문에, default 값인 50000000이 들어간 것을 확인할 수 있다. dept_id 에도 빈값이 들어갔다.
★ 정리하면, INSERT statement 는 아래와 같다.
- INSERT INTO table_name VALUES (comma-seperated all values);
- INSERT INTO table_name (attributes list) VALUES (attributes list 순서와 동일하게 comma-seperated values);
- INSERT INTO table_name VALUES (...,..), (...,..), (...,..);
이제 그럼 마지막 방법으로 나머지 데이터들을 employee에 넣어주자.


그럼, 이제 나머지 테이블에도 데이터를 추가해보자.
먼저, DEPARTMENT 테이블에 데이터를 추가하면 아래와 같다.
create table DEPARTMENT (
id INT PRIMARY KEY,
name VARCHAR(20) NOT NULL UNIQUE,
leader_id INT
);


PROJECT 테이블에 데이터를 추가하면 아래와 같다.
create table PROJECT(
id INT PRIMARY KEY,
name VARCHAR(20) NOT NULL UNIQUE,
leader_id INT,
start_date DATE,
end_date DATE,
FOREIGN KEY (leader_id) references EMPLOYEE(id)
on delete SET NULL
on update CASCADE,
CHECK (start_date < end_date)
);


create table WORKS_ON(
empl_id INT,
proj_id INT,
PRIMARY KEY(empl_id,proj_id),
FOREIGN KEY(empl_id) references EMPLOYEE(id)
on delete CASCADE
on update CASCADE,
FOREIGN KEY(proj_id) references PROJECT(id)
on delete CASCADE
on update CASCADE
);


✅ 데이터 수정하기

EMPLOYEE 테이블을 초기에 만들 때는 DEPARTMENT 테이블이 없었기 때문에, 참조할 수 없어서 dept_id 를 null 로 넣어줬는데, 이제 이 dept_id 값을 바꿔주려고 한다.
UPDATE statement 는 아래와 같다.
- employee ID 가 1인 ALLU 는 개발(development)팀 소속이다.
- 개발팀 ID는 1003이다.
- ALLU 소속팀 정보를 업데이트 해주자.

UPDATE 테이블명 SET 컬럼값 = 값 키워드로 데이터를 변경한다. 이 때, 중요한 것은 우리는 지금 ALLU에 한정해서 UPDATE를 하고 싶은 것이므로, 그 조건을 명시해줘야 한다. 조건을 명시하기 위해서 WHERE 라는 키워드로 해당 데이터의 id를 적어줬다.

나머지 직원들에 대해서도 부서를 배치해주자.

다른 UPDATE statement 는 아래와 같다.
- 개발팀 연봉을 두 배로 인상하고 싶다.
- 개발팀 ID는 1003이다.

UPDATE 를 해주되, dept_id = 1003 인 개발부서만 연봉을 2배로 올린 쿼리문이다.

개발 부서에 소속되어 있는 직원들의 연봉이 2배 인상된 것을 확인할 수 있다.
다른 UPDATE statement 는 아래와 같다.
- 프로젝트 ID 2003 에 참여한 임직원의 연봉을 2배로 인상하고 싶다.



현재 연봉을 올려줘야 하니까 EMPLOYEE 테이블을 건들여야 하는데, EMPLOYEE 테이블에는 프로젝트 ID 가 없다. 프로젝트 ID는 WORKS_ON 테이블에 있는데, 프로젝트 ID 값이 2003인 empl_id 와 같은 id 값을 가지는 row에 해당하는 salary를 바꿔주면 된다.
쿼리는 아래와 같다.

UPDATE EMPLOYEE, WORKS ON SET salary = salary * 2 WHERE id = empl_id and prog_id = 2003; 를 해주면 된다.
어떻게 보면 교집합이라고 이해하면 편하다.
(※ 주의할 점은 지금은 attribute 값 이름이 똑같지 않아서 저렇게만 적어줬는데, 혹시나 attribute 이름이 같다면, "테이블명.컬럼명" 으로 명시해줘야 한다.)
다른 UPDATE statement 는 아래와 같다.
- 회사의 모든 구성원의 연봉을 두 배로 올리자!

이 때는 특정 조건이 불필요하기 때문에, WHERE 를 안 적어줘도 된다.
★ 정리하면, UPDATE statement 는 아래와 같다.
- UPDATE table_name(s)
- SET attribute = value [, attribute = value, ...]
- [WHERE condition(s) ];
✅ 데이터 삭제하기
DELETE statement 는 아래와 같다.
- 만약 KEVIN 이 퇴사를 하게 되면서 EMPLOYEE 테이블에서 KEVIN 정보를 삭제해야 한다.
- KEVIN 의 EMPLOYEE ID 는 8이다.
- 현재 KEVIN 은 project 2001 에 참여하고 있었다.



EMPLOYEE 테이블에서 id = 8 인 KEVIN 을 삭제하는 쿼리를 진행했다. 그러면, 따로 WORKS_ON 테이블에서도 empl_id = 8 인 데이터를 지워줘야 할까? 그럴 필요 없다.
다시 WORKS_ON 테이블을 생성할 때 attribute 를 어떻게 설정했는지 살펴보자.
create table WORKS_ON(
empl_id INT,
proj_id INT,
PRIMARY KEY(empl_id,proj_id),
FOREIGN KEY(empl_id) references EMPLOYEE(id)
on delete CASCADE
on update CASCADE,
FOREIGN KEY(proj_id) references PROJECT(id)
on delete CASCADE
on update CASCADE
);
여기서, empl_id 는 EMPLOYEE 에서의 id 를 참조하는데, 이 값이 삭제되면 CASCADE 제약조건으로 같이 삭제된다는 것을 확인할 수 있다.
실제로 결과를 확인해보면, 아래와 같다.


WORKS_ON 테이블에서도 KEVIN 의 흔적을 찾을 수 없다.
다른 DELETE statement 는 아래와 같다.
- KIM 이 휴직을 떠나게 되면서 현재 진행 중인 프로젝트에서 중도하차하게 됐다.
- KIM 의 ID는 2 다.



WORKS_ON 테이블에서 empl_id = 2 인 KIM 을 삭제하는 쿼리를 진행했다. 이 때는 WORKS_ON 테이블에서의 empl_id = 2 인 데이터만 지워지고 직원은 퇴사를 한 것이 아니기 때문에 EMPLOYEE 테이블에는 그대로 있는 것을 볼 수 있다.


다른 DELETE statement 는 아래와 같다.
- 현재 Jay 가 세 개의 프로젝트에 참여하고 있었는데,
- 프로젝트 2001과 2003에 선택과 집중을 하기로 하고 프로젝트 2002에서는 빠지기로 했다.
- Jay의 ID 는 3 이다.



지금은 프로젝트 3개 중에 1개만 빠져나오기 때문에 단순하게 쿼리를 짤 수 있지만, 삭제해야 할 부분이 많을 경우에는 일일히 다 명령하기에는 번거로울 수 있다.
이 때, <> 키워드를 사용할 수 있는데, <> 는 != 와 똑같은 뜻이다. 즉, 아래와 같이 쿼리문을 작성할 수 있다.
DELETE FROM works_on WHERE empl_id = 3 and proj_id <> 2001 ;
또는
DELETE FROM works_on WHERE empl_id = 3 and proj_id != 2001 ;


다른 DELETE statement 는 아래와 같다.
- 회사에 큰 문제가 생겨서 진행중인 모든 프로젝트들이 중단됐다.
- 그래서, 모든 프로젝트를 삭제해야 한다.
그럼, 그냥 DELETE FROM PROJECT; 를 하면 되겠지만, 이런 경우는 극히 드물고 위험할 수 있으므로 신중해야 한다.
★ 정리하면, DELETE statement 는 아래와 같다.
- DELETE FROM table_name
- [ WHERE condition(s)]
참고자료
- 유튜브 쉬운코드
'컴퓨터 공부 > 📗 CS' 카테고리의 다른 글
[데이터베이스] 6장 - SQL 로 데이터 조회하기! SubQuery, IN, EXISTS, ANY, ALL (4) | 2024.01.05 |
---|---|
[데이터베이스] 5장 - SQL 로 데이터 조회하기! SELECT 를 활용해서 데이터를 읽어오는 기본적인 문법과 관련 키워드들 (4) | 2024.01.04 |
[데이터베이스] 3장 - SQL 개념과 SQL로 데이터베이스를 정의하는 법 (4) | 2024.01.02 |
[데이터베이스] 2장 - 관계형 데이터베이스 개념과 relation, primary key, foreign key, constraints (4) | 2023.12.29 |
[데이터베이스] 1장 - 데이터베이스 기본 개념 (0) | 2023.12.29 |