CodeGym /행동 /SQL SELF /데이터 업데이트하기 UPDATE 사용해서

데이터 업데이트하기 UPDATE 사용해서

SQL SELF
레벨 21 , 레슨 2
사용 가능

오늘은 네가 새로 쌓아가는 지식의 벽돌 중 또 하나 중요한 걸 다뤄볼 거야 — 바로 데이터 업데이트! PostgreSQL에서 UPDATE 명령어로 기존 정보를 어떻게 바꾸는지 볼 거야. 왜 중요하냐고? 현실 세계에서 데이터는 절대 고정돼 있지 않으니까. 예를 들어, 네 친구가 전화번호를 바꿨거나, 학생이 다른 반으로 옮겼다면, 당연히 그 데이터를 DB에서 바꿔줘야겠지.

네가 학교에서 좋아했던 Svetka Sokolova가 갑자기 Svetka Khachaturyan이 됐다면(인생이란 그런 거지), DB에도 그걸 반영해야 해. 이런 식으로 데이터를 바꿔야 하는 상황은 진짜 자주 나와:

  • 레코드에 있는 실수 수정하기.
  • 정보 업데이트(이사, 상태 변경 등).
  • 여러 데이터 한 번에 바꾸기, 예를 들어 직원들 월급 올려주기.

데이터 업데이트는 테이블의 한 줄 또는 여러 줄에서, 한 컬럼 또는 여러 컬럼의 값을 바꾸는 방법이야. 새로운 레코드를 추가하는 게 아니고!

UPDATE 명령어 문법

PostgreSQL에서 UPDATE 명령어는 꽤 직관적인 문법을 가지고 있어. 구조를 한번 보자:

UPDATE 테이블
SET 컬럼1 = 값1,
    컬럼2 = 값2
WHERE 조건;

설명하자면:

  • 테이블: 뭔가 바꿀 테이블 이름.
  • SET column = value: 어떤 컬럼을 어떤 값으로 바꿀지 지정하는 부분.
  • WHERE 조건: 어떤 줄을 업데이트할지 정하는 조건(이거 진짜 중요해, 안 그러면 다 바뀜...!).

핵심 포인트: WHERE를 빼먹거나 잘못 쓰면, 테이블의 모든 줄이 다 바뀌어버릴 수 있어. 이거 진짜 큰일 날 수 있으니까 조심!

예시: 학생 이름 바꾸기

예를 들어, students라는 테이블에 id, name, email 컬럼이 있다고 해보자. id = 1인 학생의 이름을 "Maria Chi"로 바꾸고 싶어.

UPDATE students
SET name = 'Maria Chi'
WHERE id = 1;

이 명령어는 id = 1인 줄을 찾아서 name 컬럼을 새 값으로 바꿔줄 거야. 쉽지?

여러 컬럼 한 번에 업데이트하기

가끔은 한 레코드에서 여러 값을 한 번에 바꿔야 할 때가 있어. 예를 들어, 학생이 이름도 바꾸고 이메일도 바꿨다고 해보자. 이렇게 하면 돼:

UPDATE students
SET name = 'Otto Lin',
    email = 'otto.lin@example.com'
WHERE id = 2;

여기서는 id = 2인 학생의 nameemail을 둘 다 바꿔주는 거야. PostgreSQL에서는 SET 부분에 컬럼=값 쌍을 콤마로 여러 개 쓸 수 있어.

여러 줄 한 번에 업데이트하기

여러 줄의 데이터를 한 번에 바꿔야 할 땐 어떻게 할까? 예를 들어, 학생 그룹을 새 그룹으로 옮기고 싶을 때. group_number라는 필드가 있다고 치고, 101번 그룹 학생들을 202번 그룹으로 옮기고 싶으면:

UPDATE students
SET group_number = 202
WHERE group_number = 101;

이 명령어는 group_number가 101인 모든 줄을 찾아서 202로 바꿔줄 거야.

5. WHERE 조건: 진짜 조심!

아까도 말했지만, WHERE는 네 구명튜브야. 이거 없으면 테이블의 모든 줄이 다 바뀌어버려. 예를 들어, 아래 명령어는 모든 학생의 그룹을 202로 바꿔버려. 101번 그룹만 바꾸고 싶었는데, 이러면 다 바뀌는 거지. 이건 진짜 원하지 않을 거야:

UPDATE students
SET group_number = 202;

그러니까 WHERE는 항상 꼭 써! 실수로 데이터 다 날릴 수도 있으니까. 조심 또 조심!

UPDATE 명령어는 테이블의 컬럼을 바꾸는 명령어라고 생각하면 돼. 줄을 바꾸는 게 아니라, 컬럼의 값을 바꾸는 거지. WHERE가 있어야만 일부 줄만 바뀌는 거야.

다른 테이블의 데이터로 업데이트하기

가끔은 값을 직접 입력하는 게 아니라, 테이블 A의 값을 테이블 B의 데이터로 업데이트해야 할 때가 있어. 이런 경우 진짜 많아 — 예를 들어, 계산 결과는 한 테이블에 있고, 사용자 프로필은 다른 테이블에 있을 때.

예를 들어, students 테이블에서 debt 컬럼을 payments 테이블의 due_amount 값으로 업데이트해야 한다고 해보자. 각 students 레코드는 paymentsstudent_id와 매칭돼.

문법은 이렇게 돼:

UPDATE students
SET debt = payments.due_amount
FROM payments
WHERE students.id = payments.student_id;

이게 어떻게 동작하냐면:

  • PostgreSQL이 FROM payments를 데이터 소스로 사용해.
  • WHERE 조건으로 두 테이블의 줄을 연결해.
  • payments에 매칭되는 students 줄만 업데이트해.

중요한 점:UPDATE ... FROM 안에서는 사실상 숨겨진 JOIN이 일어나는 거야. JOIN 키워드는 없지만, 실제로는 조인하는 거지.

실제로 내부적으로는 이런 식으로 조인이 일어나고 있어. 대충 이렇게 생각하면 돼:

UPDATE students
SET debt = p.due_amount
FROM payments p
    JOIN students s ON s.id = p.student_id
WHERE students.id = p.student_id;

뭐가 바뀌는지 미리 확인하기

UPDATE를 실행하기 전에, 정확히 뭐가 바뀌는지 미리 보는 게 진짜 현명해. SELECT로 똑같이 써보면 돼:

SELECT
    students.id, 
    students.name, 
    students.debt AS old_debt, 
    payments.due_amount AS new_debt
FROM students
    JOIN payments ON students.id = payments.student_id;

이 결과는 이렇게 보여줄 거야:

  • 예전 빚 값(old_debt);
  • payments 테이블에서 가져올 새 값(new_debt).

이런 식으로 하면 논리가 맞는지 미리 체크할 수 있어서, 데이터가 영영 덮어써지기 전에 실수 방지할 수 있어.

잠재적인 함정들

  • payments에 한 학생당 여러 레코드가 있으면, UPDATE에서 에러가 나: more than one row returned. 이럴 땐 MAX, SUM, LIMIT 1 같은 집계함수를 쓰거나, paymentsstudent_id가 유일한지 확인해야 해.
  • UPDATE ... FROM은 PostgreSQL만의 특징이라, MySQL 같은 다른 DBMS에서는 이렇게 안 돼.

실전 예시

예시 1: 학생 상태 바꾸기

예를 들어, 코스를 끝낸 학생들은 "졸업생" 상태로 바꿔야 해. status라는 컬럼이 있다고 치고, completed_course = true인 학생들의 상태를 바꾸려면:

UPDATE students
SET status = '졸업생'
WHERE completed_course = true;

예시 2: 직원 월급 올리기

employees 테이블이 있고, 영업부서 직원들 월급을 10% 올리고 싶으면:

UPDATE employees
SET salary = salary * 1.10
WHERE department = 'Sales';

SET 부분에서 바로 수식도 쓸 수 있어. 여러 명의 데이터를 한 번에 바꿀 때 진짜 편해.

예시 3: 조건부 업데이트

가끔은 조건에 따라 다르게 업데이트해야 할 때가 있어. 예를 들어, 월급이 50,000보다 적으면 20% 올리고, 그 이상이면 10%만 올리고 싶을 때:

UPDATE employees
SET salary = CASE
                WHEN salary < 50000 THEN salary * 1.20
                ELSE salary * 1.10
             END;

이 명령어는 CASE 구문을 써서 salary 값에 따라 다르게 업데이트해.

UPDATE 쓸 때 흔한 실수들

이미 눈치챘겠지만, 제일 흔한 실수는 뭘까? 맞아, WHERE를 빼먹는 거야. 상상해봐: 10,000명 직원이 있는 DB에서 실수로 전부 월급을 올려버렸어. 직원들은 좋아하겠지만, 너의 커리어에는... 별로 안 좋을 수도 있지.

또 다른 흔한 실수는 잘못된 컬럼을 업데이트하는 거야. 항상 뭐가 어디에 들어가는지 두 번 확인해! UPDATE 전에 SELECT 한 번만 해도 시간 엄청 아낄 수 있어.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION