일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 시그널 핸들러
- 커널 동기화
- 백엔드
- 트랜잭션
- 코딩애플
- 코딩테스트 [ ALL IN ONE ]
- SDK
- recoverability
- 인터럽트
- 갤럭시 S24
- 시스템프로그래밍
- 운영체제와 정보기술의 원리
- concurrency control
- 김영한
- B tree 데이터삽입
- BreadcrumbsComputer-Networking_A-Top-Down-Approach
- 개발남노씨
- vite
- Extendable hashing
- SQL
- 네트워크
- Git
- 온디바이스AI
- 프로세스 주소 공간
- 쉬운 코드
- 반효경
- CPU 스케줄링
- 데이터베이스
- 운영체제
- 쉬운코드
- Today
- Total
티끌모아 태산
⭐️SQL을 통한 데이터 추가, 수정, 삭제 본문
이번 시간에도 '쉬운 코드' 님의 강의를 듣고 정리한 내용입니다. 저번시간에 IT회사 RDB 만들기 예시로 SQL을 활용하여 부서, 사원, 프로젝트 관련 정보들을 저장할 수 있는 테이블을 만들고 각각의 스키마를 정의하였습니다.
이렇게 테이블을 수정해 주는 이유는 department 테이블을 만들 당시에 employee 테이블이 없었기 때문입니다.
4개의 테이블을 만들었으니 이제 이 테이블에 데이터를 추가해 보도록 하겠습니다. 우선 EMPLOYEE의 데이블 구조를 살펴보면 다음과 같습니다. ❗️저번시간에도 배웠지만 테이블을 만들 때 constraints를 주의해야합니다.
- 데이터 추가하기: attributes 순서대로 데이터 추가하기
INSERT INTO table_name VALUES();
위 사진에서 마지막 속성값인 dept_id 를 null로 준 이유는 현재 DEPARTMENT에 값이 없기 때문입니다. 그러므로 DEPARTMENT 테이블에 데이터를 추가하고 나서 다시 업데이트 해주는 방식으로 진행하면 됩니다. 저렇게 데이터를 추가하면 성공적으로 쿼리가 동작을 했다는 실행문을 볼 수 있다.
- 에러가 발생하는 경우: 중복, constraints 위반
위 사진은 default 값을 위반했기 때문에 발생하는 에러이다. 하지만 employee_chk_2 라는 메시지만 보고서는 정확인 어떤 부분에서 에러가 발생했는지 파악할 수 없기 때문에 다음과 같은 명령어를 통해 좀 더 구체적으로 에러를 확인할 수 있다.
show create table employee;
사진을 보면 알 수 있듯이 salary 부분에서 에러가 발생했음을 확인할 수 있다. 따라서 "SHOW CREATE TABLE 테이블 이름;" 을 통해 구체적으로 어떤 에러인지 확인할 수 있다.
이제는 쿼리가 성공적으로 실행됐음을 확인할 수 있다. 다음으로는 데이터를 추가할 때 필드 값들을 함께 작성하면 내가 원하는 데이터만을 추가 할 수 있고, 만약 기본값이 존재한다면 내가 넣지 않은 필드의 값이 기본값으로 추가가 됩니다. 그리고 이렇게 필드와 함께 작성하면 데이터를 추가할 때 순서를 기존과 다르게 해서 넣을 수 있습니다.
- 데이터 조회하기: 데이터를 테이블에 추가를 했으면, 제대로 데이터가 들어갔는지 확인하기 위해 다음과 같은 명령어를 실행해볼 수 있다.
SELECT * FROM employee;
*이처럼 JENNY의 셀러리는 기본값이(JENNY는 id, name, birth_data, sex, position에 대해서만 데이터를 추가했기 때문) 그리고 dept_id는 아직 데이터가 없기 때문에 NULL값이 들어갔음을 확인할 수 있다.
하나 또는 두 개 이상의 데이터를 넣기 위해서는 위와 같은 명령어 문법을 따르면 됩니다. 다음과 같이 INSERT INTO table_name VALUES (), (), (), ...(); 을 활용해서 데이터를 삽입한 것을 확인할 수 있다.
그리고 employee부분을 제외한 나머지 부분도 위와 가은 방식으로 데이터를 추가하면 됩니다.
- 데이터 수정하기
UPDATE statement
employee id가 1인 Messi는 개발팀 소속이다. 개발팀 ID는 1003이다. 아까는 부서 테이블이 없어서 employee의 dept_id가 모두 NULL 이었는데, 이제 업데이트를 해주자. -> 한 명의 데이터 값을 업데이트 해주기.
UPDATE employee SET dept_id = 1003 WHERE id = 1
SELECT * FROM employee WHERE id=1;
위와 같이 명령어를 통해 해당 데이터가 올바르게 업데이트가 됐지는지 확인하기 위해 사용할 수 있다. 그 후에는 이제 모든 임직원에 대한 부서 값을 업데이트 해주면 됩니다.
또 다른 예시로 개발팀 연봉을 두 배로 인상하고 싶다. 개발팀 ID는 1003이다. ❗️WHERE는 조건절.
UPDATE employee SET salary = salary * 2 WHERE dept_id = 1003;
다른 예시로, 프로젝트 ID 2003에 참여한 임직원의 연봉을 두 배로 인상하고 싶다. 이 때는 두 개의 테이블을 참조해야한다. 즉 두개의 테이블을 연결 시켜줘야한다.
UPDATE employee, works_on SET salary = salary * 2 WHERE id = empl_id and proj_id = 2003;
❗️좀 더 직관적으로 코드를 작성하기 위해서는 다음과 같이 작성해주면 좋다.
UPDATE employee, works_on SET salary = salary * 2 WHERE employee.id = works_on.empl_id
and proj_id = 2003;
이제 마지막으로 회사의 모든 구성원의 연봉을 두배로 올려주는 코드를 만들어보자! 이때 차이점은 WHERE 절이 없다는 것이다.
UPDATE employee SET salary = salary * 2
- 데이터 삭제하기: DELETE statement
예를들어, John이 퇴사를 하게 되면서 employee 테이블에서 john 정보를 삭제해야한다. john의 employee id는 8이다. 현재 john은 project 2001에 참여하고 있었다. 이때, 존과 관련된 테이블은 두 개에 테이블에 나누어서 저장되어있다.
DELETE FROM employee WHERE id = 8;
❗️이렇게 작성하면 employee에서 존의 정보를 삭제가 된다. 이때 works_on에 대한 정보도 함께 지워줘야할까?! 정답은 NO, 왜냐하면 WORKS_ON의 테이블을 작성할 때 foreign 키를 작성해뒀기 때문이다. 즉, 참조값이 변경/삭제 되면 그대로 반영되도록 설정해 뒀다.
또 다른 예시로 Jane이 휴직을 떠나게 되면서 현재 진행 중인 프로젝트에서 중도하차하게 됐다. Jane의 ID는 2다.
DELETE FROM works_on WHERE empl_id = 2
또 다른 예시로 현재 Dingyo가 두 개의 프로젝트에 참여하고 있었는데 프로젝트 2001에 선택과 집중을 하기로 하고 프로젝트 2002에서는 빠지기로 했다. Dingyod의 ID는 5다
DELETE FROM works_on WHERE empl_id = 5 and proj_id = 2002;
❗️그런데 만약 딩요가 참여하고 있던 프로젝트의 수가 2개가 아니라 여러개 참여하고 있었다면 2001을 제외환 모든 프로젝트에서 삭제를 해주어하기 때문에 다음과 같이 작성해주어야한다.
DELETE FROM works_on WHERE empl_id = 5 and proj_id != 2001
마지막으로 회사에 큰 문제가 생겨서 진행중인 모든 프로젝트들이 중단 됐다 -> 모든 프로젝트 삭제! WHERE 절이 없다!
DELETE FROM project;
사실 현업에서는 DELETE FROM 테이블_이름; 이렇게 작성하는 것이 굉장히 조심스러운 일이다. 자칫 잘못하면 정말 큰일이 나오기 때문에 WHERE절을 까먹지 않을것을 반드시 기억하길 바란다.
'CS 지식 > 데이터베이스' 카테고리의 다른 글
SQL 데이터 조회 (0) | 2023.09.10 |
---|---|
SQL의 기본 개념과 문법 (0) | 2023.09.07 |
관계형 데이터베이스(relational database) (0) | 2023.09.06 |