컴퓨터 공부/📗 CS

[데이터베이스] 4장 - SQL로 DB에 데이터를 추가(insert)하고 수정(update)하고 삭제(delete)하는 방법

letzgorats 2024. 1. 2. 13:07

데이터 추가하기

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

employee 테이블
insert into employee values()

 

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 값을 준 것이다.

 

 

또 다른 직원 데이터를 추가해보자.

데이터 추가 실패 - id

위와 같이 KIM 을 직원 데이터에 넣으려는데, 에러가 뜬다. 이유는 Primary Key 인 id 값으로 중복된 값 1을 넣어줬기 때문이다.

그러면 id 값을 2로 바꿔주고 다시 데이터를 추가해보자.

데이터 추가 실패 - salary

위와 같이 데이터를 추가하려면, 또 에러가 나온다. 이번에는 salary 속성값 때문인데, 테이블을 생성할 때, salary 값을 50000000 이상으로 제약조건을 걸어놨다. CHECK(salary >= 50000000) 부분 말이다. 

 

여기서, employee_chk_2가 뭔지 알고 싶으면, 즉 어디서 오류가 났는지 알고 싶을 때 'SHOW CREATE 테이블이름'을 해주면 된다.

'employee_chk_2' -> CHECK (('salary >= 50000000)

 

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

데이터 추가 실패 - dept_id

이번에도 실패다..뭐가 문제일까?

이번에는 마지막 dept_id 값에 null 이 아닌 111 값을 추가했다.

아까 분명 처음에 데이터를 추가할 때, 현재는 DEPARTMENT 테이블에 아무런 값이 없기 때문에 임시로 null 을 줬다고 했다. 근데 이렇게, 특정 값을 줘버리면 오류가 난다. 존재하지 않는 값을 참조하려고 특정 값을 넣어주게 되면 에러가 난다는 뜻이다.

즉, 참조하는 값이 실제로 그 테이블에 있을 때에만 그 값을 지정해줄 수 있다는 것을 알 수 있다.

이제 성공적으로 값이 추가되게 해보자.

데이터 추가 성공

 

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

EMPLOYEE 테이블

 

이제 또 다른 데이터를 추가해볼 것인데, 데이터를 추가하는 방식을 조금 바꿔볼 것이다.

이제까지는 테이블 생성시, attribute 를 준 순서대로 값을 넣어줘야 했는데, 직접적으로 속성값을 명시하고 해당 자리에 값을 넣어보자.

데이터 추가 성공

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

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에 넣어주자.

마지막 방법 일부
EMPLOYEE table


그럼, 이제 나머지 테이블에도 데이터를 추가해보자.

먼저, DEPARTMENT 테이블에 데이터를 추가하면 아래와 같다.

create table DEPARTMENT ( 
    id INT PRIMARY KEY,
    name VARCHAR(20) NOT NULL UNIQUE,
    leader_id INT 
);

INSERT INTO DEPARTMENT VALUES()
DEPARTMENT table


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)
);

INSERT INTO PROJECT VALUES()
PROJECT table


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
);

INSERT INTO WORKS_ON VALUES()
WORKS_ON table


데이터 수정하기

EMPLOYEE 테이블

EMPLOYEE 테이블을 초기에 만들 때는 DEPARTMENT 테이블이 없었기 때문에, 참조할 수 없어서 dept_id 를 null 로 넣어줬는데, 이제 이 dept_id 값을 바꿔주려고 한다.

 

UPDATE statement 는 아래와 같다.

- employee ID 가 1인 ALLU 는 개발(development)팀 소속이다.
- 개발팀 ID는 1003이다.
- ALLU 소속팀 정보를 업데이트 해주자.

UPDATE employee SET dept_id = 1003 WHERE id = 1;

 

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

값이 제대로 바뀌었다.

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

UPDATE 된 EMPLOYEE


다른 UPDATE statement 는 아래와 같다.

- 개발팀 연봉을 두 배로 인상하고 싶다.
- 개발팀 ID는 1003이다.

 

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

UPDATE 된 EMPLOYEE

 

 개발 부서에 소속되어 있는 직원들의 연봉이 2배 인상된 것을 확인할 수 있다.


다른 UPDATE statement 는 아래와 같다.

- 프로젝트 ID 2003 에 참여한 임직원의 연봉을 2배로 인상하고 싶다.

 

EMPLOYEE 테이블 & WORKS_ON 테이블

현재 연봉을 올려줘야 하니까 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;

 

UPDATE EMPLOYEE, WORKS ON SET salary = salary * 2 WHERE id = empl_id and prog_id = 2003; 를 해주면 된다.

어떻게 보면 교집합이라고 이해하면 편하다. 

(※ 주의할 점은 지금은 attribute 값 이름이 똑같지 않아서 저렇게만 적어줬는데, 혹시나 attribute 이름이 같다면, "테이블명.컬럼명" 으로 명시해줘야 한다.)


다른 UPDATE statement 는 아래와 같다.

- 회사의 모든 구성원의 연봉을 두 배로 올리자!

모든 직원 연봉 2배 인상

이 때는 특정 조건이 불필요하기 때문에, 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 테이블 & WORKS_ON 테이블
DELETE FROM employee WHERE id = 8;

 

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 제약조건으로 같이 삭제된다는 것을 확인할 수 있다. 

실제로 결과를 확인해보면, 아래와 같다.

이후 EMPLOYEE 테이블 & WORKS_ON 테이블

 

WORKS_ON 테이블에서도 KEVIN 의 흔적을 찾을 수 없다.


다른 DELETE statement 는 아래와 같다.

- KIM 이 휴직을 떠나게 되면서 현재 진행 중인 프로젝트에서 중도하차하게 됐다.
- KIM 의 ID는 2 다.

이전 EMPLOYEE 테이블 & WORKS_ON 테이블
DELETE FROM works_on WHERE empl_id = 2;

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

이후 EMPLOYEE 테이블 & WORKS_ON 테이블


다른 DELETE statement 는 아래와 같다.

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

이전 EMPLOYEE 테이블 & WORKS_ON 테이블
DELETE FROM works_on WHERE empl_id = 3 and proj_id = 2002;

 

지금은 프로젝트 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 ;

이후 EMPLOYEE 테이블 & WORKS_ON 테이블


다른 DELETE statement 는 아래와 같다.

- 회사에 큰 문제가 생겨서 진행중인 모든 프로젝트들이 중단됐다.
- 그래서, 모든 프로젝트를 삭제해야 한다.

 

그럼, 그냥 DELETE FROM PROJECT; 를 하면 되겠지만, 이런 경우는 극히 드물고 위험할 수 있으므로 신중해야 한다.

 

★ 정리하면, DELETE statement 는 아래와 같다.

  • DELETE FROM table_name
  • [ WHERE condition(s)]

참고자료

- 유튜브 쉬운코드

반응형