저번에 만들었던
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
'Database > MySQL' 카테고리의 다른 글
[데이터베이스(강의)] 6. SQL로 데이터 조회 (subquery / IN, EXIST, ANY, ALL) (0) | 2024.02.02 |
---|---|
[데이터베이스(강의)] 5. SQL로 데이터 조회 (Select) (0) | 2024.02.01 |
[데이터베이스(강의)] 3. SQL 기본 개념 및 SQL로 데이터베이스 정의 (0) | 2024.01.25 |
[데이터베이스(강의)] 2. 관계형 데이터베이스 (relational database) (0) | 2024.01.25 |
[데이터베이스(강의)] 1. 데이터베이스 기본 개념 (0) | 2024.01.23 |