본문 바로가기

ComputerScience/Database

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

SQL을 사용해서 데이터 추가하기

  • 데이터를 추가할 때는 INSERT INTO 키워드를 사용하고, 그 뒤에 테이블 이름과 VALUES 값을 적어준다.
INSERT INTO employees (name, department, salary)
VALUES ('김철수', '영업', 3000000);
  • 값들을 써줄 때 Attribute 순서에 맞게 값을 채워 넣어야 하는데, 이때 NULL값을 넣어야 하는 Attribute가 있다면 일단 NULL값을 넣어 넘겨야 한다.
  • Query가 성공적으로 동작하면 해당 테이블에 데이터가 추가된다.

️️Primary키가 중복되는 경우

  • Primary key는 유일한 값이며 중복되면 안 된다.
  • 이미 존재하는 Primary Key에 중복해서 데이터를 Insert하려 할 때 발생하는 에러는 각 DBMS마다 다르다.
  • MySQL: Duplicate entry '값' for key 'PRIMARY'
  • PostgreSQL: ERROR: duplicate key value violates unique constraint "constraint_name"
  • Oracle: ORA-00001: unique constraint (schema_name.table_name_pk) violated

Constraint를 위배하는 데이터를 넣으려는 경우

  • Show Create Table 키워드를 활용하면 Constraint의 구체적인 의미를 확인할 수 있다.
  • CHECK 제약 위배 에러 메시지: 
    - MySQL: CHECK constraint 'employees_salary_check' failed
    - PostgreSQL: ERROR: check constraint "employees_salary_check" violated
     -Oracle: ORA-00001: check constraint (employees_salary_chk) violated
  • NOT NULL 제약 위배 에러 메시지:
    - MySQL: Column 'name' cannot be null
    - PostgreSQL: ERROR: null value in column "name" violates not-null constraint "employees_name_not_null"
    - Oracle: ORA-00001: not null constraint (employees_name_nn) violated
  • Foreign Key 제약 위배 에러 메시지:
    - MySQL: Cannot add or update a child row: a foreign key constraint fails (orders_ibfk_1, CONSTRAINTorders_ibfk_1FOREIGN KEY (product_id) REFERENCESproducts(id))
    - PostgreSQL: ERROR: insert or update on table "orders" violates foreign key constraint "orders_ibfk_1" on table "products"
    - Oracle: ORA-00001: foreign key constraint (orders_fk) violated

️️️테이블에 데이터를 추가하는 쿼리 방법 3가지

테이블의 모든 애트리뷰트에 대응하는 값을 넣어주는 쿼리
INSERT INTO employees (name, department, salary)
VALUES ('김철수', '영업', 3000000);
일부 애트리뷰트에 대해서만 원하는 순서로 값을 넣는 쿼리
INSERT INTO employees (department, name, salary)
VALUES ('영업', '김철수', 3000000);​
한 번에 여러 개의 데이터를 한 테이블에 넣는 쿼리
INSERT INTO employees (name, department, salary)
VALUES ('김철수', '영업', 3000000), ('박지영', '마케팅', 3500000);

SQL 쿼리를 이용해 데이터 수정 하기

UPDATE 테이블명 SET 열1 = 값1, 열2 = 값2, ... WHERE 조건;
UPDATE employees SET salary = 4000000 WHERE id = 1;

여러 개의 행을 수정 하는 쿼리

UPDATE employees SET salary = CASE WHEN department = '영업' THEN salary * 1.1 WHEN department = '마케팅' THEN salary * 1.2 END;

위 쿼리는 employees 테이블에 salary 컬럼이 영업이면 salary 값을 * 1.1로 업데이트, 마케팅이면 *1.2로 업데이트한다.

테이블 연결 후 업데이트 쿼리 작성 방법

  • 두 개의 테이블을 연결하려면, 두 테이블 사이의 연결고리 역할(즉, 공통으로 가지는)을 하는 애트리뷰트를 찾아봐야 한다.
  • 애트리뷰트 이름을 좀 더 직관적으로 적기 위해, Table_name.Attribute로 표현해주면 좋다.
  • 만약 모든 데이터의 값을 수정하고 싶다면, WHERE 절 없이 SET 키워드 뒤에 새로운 값을 적어주면 된다.

데이터 삭제 하기

DELETE FROM 테이블명 WHERE 조건;
DELETE FROM employees WHERE department = '마케팅';
  • 데이터를 삭제하기 위해서는 DELETE 키워드로 시작하여 테이블 이름을 작성하고, WHERE 절을 사용하여 삭제할 튜플의 조건을 정의한다.
  • WHERE 절을 빼먹고 삭제하게되면 모든 데이터를 삭제하게 됨

외래키 설정에 따른 삭제

CASCADE
  • 외래키를 참조하는 튜플도 함께 삭제
DELETE FROM departments WHERE id = 1;
  • 위 쿼리는 departments 테이블에서 id가 1인 부서를 삭제
  • departments 테이블에 외래키를 참조하는 employees 테이블의 튜플도 함께 삭제
  • 만약 WHERE id <> 1; (또는 !=)의 경우 1을 제외한 모든 데이터 삭제
RESTRICT
  • 외래키를 참조하는 튜플이 존재하면 삭제를 거부
DELETE FROM departments WHERE id = 1;
  • 위 쿼리는 departments 테이블에서 id가 1인 부서를 삭제를 시도하지만, employees 테이블에 departments 테이블의 id를 참조하는 튜플이 존재하는 경우 삭제가 거부

참고 자료

https://youtu.be/mgnd5JWeCK4?si=_Ii-pRA3AKiq5N4A