Post

6.2 Update (SQL)

레코드 변경 구문

SQL에서는 레코드의 값을 변경하기 위한 목적으로 UPDATE 구문을 제공한다. UPDATE의 문법은 다음과 같다:

  • tb_name: 변경할 테이블명
  • col: 변경할 컬럼
  • val: 저장할 값
    1
    2
    3
    
    UPDATE tb_name
      SET col1 = val1, col2 = val2, ...
      WHERE ...;
    

UPDATE를 통해서 값을 업데이트하려면 col과 val를 통해서 명시적으로 지정을 해줘야한다. 또한 WHERE 절을 통해 특정 조건에 해당하는 레코드만 값을 변경할 수 있다.

레코드 변경의 활용

Table 0: Employee Table

employee_idnamecreated_atemail
1김철수2023-01-01 00:00:00ironsoo@naver.com
2이영희2023-01-02 15:20:00202@gmail.com
3홍길동2023-01-03 09:55:00hkd@gmail.com

Employee 테이블에 UPDATE를 활용하여, 레코드를 수정해보자.

Q. 홀길동 사원의 이메일을 변경하여 ‘hkd@naver.com’로 업데이트해야한다.

홍길동이라는 이름(name)을 가진 사원의 email을 ‘hkd@naver.com’으로 변경하는 UPDATE 쿼리문은 다음과 같다:

1
UPDATE employee SET email = 'hkd@naver.com' WHERE name = '홍길동';

Table 0을 통해 제공된 데이터 세트에서 홍길동이라는 이름을 가진 사원은 한명이다. 따라서 위의 쿼리문은 오류 없이 동작할 것이다. 하지만, 동명이인이 존재한다면 여러 직원의 이메일을 변경하는 쿼리가 동작할 것이다. 이처럼 하나의 레코드만을 업데이트하는 상황에서 Unique Constraint가 걸려있지 않은 컬럼을 통해서 조건을 걸면, 여러 컬럼이 동시에 업데이트될 수 있다. 따라서 오류를 방지하기 위해선 PK와 같이 Unique한 컬럼을 사용하는 것이 좋다.

1
UPDATE employee SET email = 'hkd@naver.com' WHERE employee_id = 3;

UPDATE … FROM 구문 (PostgreSQL Only)

테이블간에 연결관계를 가지는 경우, 다른 테이블의 값을 참조하여 UPDATE의 value로 사용할 수 있다. 특히 테이블을 정규화, 반정규화하는 과정에서 값을 참조하여 업데이트할 필요가 생긴다. 이때 사용가능한 문법이 UPDATE ... FROM로, 다음과 같이 활용할 수 있다:

  • tb1: 업데이트할 테이블
  • val_col1: 값을 변경할 컬럼
  • tb2: 값을 불러올 테이블
  • val_col2: 값을 불러올 컬럼
  • match_col: 값을 불러올 레코드를 매칭하기 위한 조건값
1
2
3
4
UPDATE tb1
    SET val_col1 = tb2.val_col2
    FROM tb2
    WHERE tb1.match_col1 = tb2.match_col2;

위의 쿼리문을 보면 FROM을 통해 데이터를 불러올 테이블을 명시하고, WHERE를 통해서 매칭할 규칙을 정한다. 다음과 같이 JOIN 구문과 비교한다면 역할을 이해하기 쉬울 것이다.

1
2
3
4
5
-- SELECT ... JOIN
... JOIN tb2 ON tb1.match_col1 = tb2.match_col2;

-- UPDATE ... FROM
... FROM tb2 WHERE tb1.match_col1 = tb2.match_col2;

JOIN에 빗대어 생각한다면, 주로 match_col에 들어가는 조건은 주로 PK와 FK가 된다는 것을 예상할 수 있다.

Table 1: Job Table

job_idnamecreated_at
1개발자2023-01-01 00:00:00
2기획자2023-01-02 00:-0:00

Table 2: EmployeeJob Table

employee_idjob_idhired_at
212023-01-03 15:00:00
312023-01-03 15:00:00

UPDATE ... FROM를 활용한 쿼리를 작성해보자. EmployeeJob에는 Job 테이블과 Employee 테이블 사이의 연결관계를 저장하고 있다. 그리고 EmployeeJob의 hired_at은 레코드가 생성된 시점을 기록하고있다.

Q. EmployeeJob 테이블의 hired_at의 기준을 Employee의 created_at으로 변경해보자.

이 문제를 해결하기 위해서는 EmployeeJob과 연결된 Employee 테이블의 레코드를 찾은 후, create_at를 참조해야한다. 쿼리로 작성해보면 다음과 같다:

1
2
3
4
UPDATE job_employee 
    SET hired_at = employee.created_at
    FROM employee
    WHERE employee.employee_id = job_employee.employee_id;
This post is licensed under CC BY 4.0 by the author.