본문 바로가기

Database/MySQL

[데이터베이스(강의)] 4. SQL (Insert / Update / Delete)

 

저번에 만들었던

DEPARTMENT / EMPLOYEE / PROJECT / WORKS_ON

네개의 테이블들에 데이터를 추가해보자.

 


 

EMPLOYEE 테이블

 

처음 정의할 때의 attribute 순서대로 값을 넣어주면 됨.

id, name, birth_date, sex, position, salary, dept_id

 

 

mysql> INSERT INTO employee
    -> VALUES (1, 'MESSI', '1987-02-01', 'M', 'DEV_BACK', 100000000, NULL*);

 

* 현재 DEPARTMENT 테이블에 데이터가 없기 때문에 FK로 연결할 수가 없음. 일단 null로 지정.

 


 

두번째 데이터를 넣어보자.

 

mysql> INSERT INTO EMPLOYEE
    -> VALUES(1, 'JANE', '1996-05-05', 'F', 'DSGN', 90000000, NULL);

 

* Duplicate entry '1' for key 'employee.PRIMARY'   =>  id가 PK이기 때문에 중복이면 안됨. 

 


mysql> INSERT INTO EMPLOYEE
    -> VALUES(2, 'JANE', '1996-05-05', 'F', 'DSGN', 40000000, NULL);

 

* Check constraint 'employee_chk_2' is violated.   =>  연봉 default 값을 50000000 으로 설정했기 때문.

  그런데 'employee_chk_2' 이 부분만으로는(이름지정x) 어떤 속성에 대한건지 알 수가 없음.

 

 

mysql> SHOW CREATE TABLE EMPLOYEE;

 

어떤 속성인지 확인가능


mysql> INSERT INTO EMPLOYEE
    -> VALUES(2, 'JANE', '1996-05-05', 'F', 'DSGN', 90000000, 111);

 

* Cannot add or update a child row: a foreign key constraint fails (`company`.`employee`, CONSTRAINT `employee_ibfk_1` FOREIGN KEY (`dept_id`) REFERENCES `department` (`id`) ON DELETE SET NULL ON UPDATE CASCADE)

=> FK 참조값이 해당 테이블에(DEPARTMENT테이블에) 없기 때문. 존재하지 않는 값을 참조할 수 없음!

 


mysql> INSERT INTO EMPLOYEE
    -> VALUES(2, 'JANE', '1996-05-05', 'F', 'DSGN', 90000000, NULL);

 

두번째 데이터 추가 완료!


 

다른 방법으로 추가해보자.

 

mysql> INSERT INTO EMPLOYEE (name, birth_date, sex, position, id)
    -> VALUES ('JENNY', '2000-10-12', 'F', 'DEV_BACK', 3);

 

추가하고자 하는 attribute들만 나열해주면

원하는 속성만 선택해서 원하는 순서대로 값을 추가할 수 있다. (attribute 순서와 값의 순서는 일치해야함.)

 


mysql> SELECT FROM EMPLOYEE;

 

=> 세번째 데이터를 추가할 때 연봉정보는 입력하지 않았기 때문에 default 값이 들어가 있다.

 


 

[ INSERT statement ]

 

- INSERT INTO table_name VALUES (comma-seperated all values);

- INSERT INTO table_name (attributes list)

           VALUES (attributes list 순서와 동일하게 comma-seperated all values);

- INSERT INTO table_name VALUES (..., ..), (..., ..), (..., ..) ;

 

 


마지막 명령문을 활용해서 

 

mysql> INSERT INTO EMPLOYEE VALUES
    -> (4, 'BROWN', '1996-03-13', 'M', 'CEO', 120000000, NULL),
    -> (5, 'DINGYO', '1990-11-05', 'M', 'CTO', 120000000, NULL),

    -> (6, 'JULIA', '1986-12-11', 'F', 'CFO', 120000000, NULL);

 

 

데이터 값들 여러개 한꺼번에 추가!!

 

mysql> INSERT INTO EMPLOYEE VALUES
    -> (7, 'MINA', '1993-06-17', 'F', 'DSGN', 80000000, NULL),
    -> (8, 'JOHN', '1999-10-22', 'M', 'DEV_FRONT', 65000000, NULL),

    -> (9, 'HENRY', '1982-05-20', 'M', 'HR', 82000000, NULL),

    -> (10, 'NICOLE', '1991-03-26', 'F', 'DEV_FRONT', 90000000, NULL),

    -> (11, 'SUZANNE', '1993-03-23', 'F', 'PO', 75000000, NULL),

    -> (12, 'CURRY', '1998-01-15', 'M', 'PLN', 85000000, NULL),

    -> (13, 'JISUNG', '1989-07-07', 'M', 'PO', 90000000, NULL),

    -> (14, 'SAM', '1992-08-04', 'M', 'DEV_INFRA', 70000000, NULL);

 


나머지 테이블에도 데이터 추가하자.

 

DEPARTMENT 테이블

 

id, name, leader_id 순서로 attribute 추가.

* leader_id 는 employee 테이블의 dept_id (FK로 연결되어 있음)

 

 

mysql> INSERT INTO department VALUES
    -> (1001, 'headquarter', 4),

    -> (1002, 'HR', 6),

    -> (1003, 'development', 1),

    -> (1004, 'design', 3),

    -> (1005, 'product', 6);

 

 


 

PROJECT 테이블

 

id, name, leader_id, start_date, end_date 순서로 attribute 추가.

leader_id 는 employee 테이블의 id (FK로 연결되어 있음)

 

 

mysql> INSERT INTO project VALUES
    -> (2001, '쿠폰 구매/선물 서비스 개발', 13, '2022-03-10', '2022-07-09'),
    -> (2002, '확장성 있게 백엔드 리팩토링', 13, '2022-01-23', '2022-03-23'),
    -> (2003, '홈페이지 UI 개선', 11, '2022-05-09', '2022-06-11');

 


 

WORKS_ON 테이블

 

empl_id, proj_id 순서로 attribute 추가.

* empl_id 는 employee 테이블의 id

   proj_id 는 project 테이블의 id  (FK로 연결되어 있음)

 

 

mysql> INSERT INTO works_on VALUES
    -> (5, 2001),
    -> (13, 2001),
    -> (1, 2001),
    -> (8, 2001);

 


 

이제 데이터를 수정해보자.

 

아래 employee 테이블의 dept_id가 null값으로 들어가 있으니 이걸 업데이트 해줄예정.

 


[ UPDATE statement ]

- employee ID가 1인 Messi 는 개발(development)팀 소속이다.

- 개발팀 ID는 1003이다.

- Messi의 소속팀 정보를 업데이트 해주자.


 

mysql> UPDATE employee SET dept_id = 1003 WHERE id = 1;

 

mysql> SELECT FROM employee WHERE id = 1;

 

업데이트 성공


 

[ UPDATE statement ]

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

- 개발팀 ID는 1003이다.

 

mysql> UPDATE employee SET salary = salary * 2 WHERE dept_id = 1003;

 


[ UPDATE statement ]

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

 

mysql> UPDATE employee, works_on 

             SET salary = salary * 2 

             WHERE id = empl_id AND proj_id = 2003;

 

좀 더 직관적으로 표현하려면

 

mysql> UPDATE employee, works_on 

             SET salary = salary * 2 

             WHERE employee.id = works_on.empl_id AND works_on.proj_id = 2003;

 


[ UPDATE statement ]

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

 

mysql> UPDATE employee SET salary = salary * 2;

 


 

[ UPDATE statement ]

 

UPDATE table_name(s) 

SET attributes = values [, attribute = value, ...]

[ WHERE condition(s) ];

 

 


 

[ DELETE statement ]

- John이 퇴사를 하게 되면서 employee 테이블에서 John 정보를 삭제해야 한다.

- John의 employee ID는 8이다.

- 현재 John은 project 2001에 참여하고 있었다.

 

 

mysql> DELETE FROM employee WHERE id = 8;

 

 

EMPLOYEE 테이블에서 id = 8 인 튜플이 삭제되는데 

원래는 WORKS_ON 테이블의 empl_id = 8 인 튜플도 삭제해줘야함.

 

그런데 WORKS_ON 테이블 생성 시 각각의 FK 에 대해 

on delete CASCADE 로 설정해둠 => 대응하는 튜플이 함께 삭제된다

 

 


[ DELETE statement ]

- Jane이 휴직을 떠나게 되면서 현재 진행 중인 프로젝트에서 중도하자 하게 되었다.

- Jane 의 ID는 2이다.

 

mysql> DELETE FROM works_on WHERE impl_id = 2;

 

=> 해당하는 튜플이 두개라면 모두 삭제된다.

 


 

[ DELETE statement ]

- 현재 Dingyo가 두 개의 프로젝트에 참여하고 있었는데 

  프로젝트 2001에 선택과 집중을 하기로 하고 프로젝트 2002에서는 빠지기로 했다.

- Dingyo 의 ID는 5이다.

 

mysql> DELETE FROM works_on WHERE impl_id = 5 AND proj_id = 2002;


 

** 만일 참여중인 프로젝트가 여러개라면 **

 

mysql> DELETE FROM works_on WHERE impl_id = 5 AND proj_id <> 2001;

mysql> DELETE FROM works_on WHERE impl_id = 5 AND proj_id != 2001;

 

 


 

[ DELETE statement ]

 

DELETE FROM table_name

[ WHERE condition(s) ];

 


 

[ DELETE statement ]

- 회사에 큰 문제가 생겨서 진행중인 모든 프로젝트들이 중단됐다.

 

mysql> DELETE FROM project;

 


 

 

* UPDATE / DELETE 를 where 절 없이 사용할 때는 모든 테이블에 대한 값이 변경되므로 주의 **

 


 

https://www.youtube.com/watch?v=mgnd5JWeCK4&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=4