MySQL에서 UPDATE 문의 SET 절에 새 값을 할당하기 위해 사용된 하위 쿼리가 아무런 행도 반환하지 않는 경우, MySQL은 해당 열에 NULL 값을 할당합니다. 다음 예제를 통해 이를 직접 확인해 보겠습니다.
예제
먼저 두 개의 테이블, 즉 'student' 테이블과 'info' 테이블이 있다고 가정해 보겠습니다.
mysql> Select * from student; +----+---------+-----------+ | Id | Name | grade | +----+---------+-----------+ | 1 | Rahul | Good | | 2 | Gaurav | Good | | 3 | Raman | Excellent | | 4 | Harshit | Average | | 5 | Aarav | Best | | 6 | Ram | average | +----+---------+-----------+ 6 rows in set (0.00 sec) mysql> select * from info; +------+-----------+ | id | remarks | +------+-----------+ | 1 | Good | | 2 | Good | | 3 | Excellent | | 4 | Average | | 5 | Best | +------+-----------+ 5 rows in set (0.00 sec)
위 두 테이블을 살펴보면, 'student' 테이블은 총 6개의 행을 가지고 있으며 id = 6인 행의 'grade' 값은 'average'입니다. 반면 'info' 테이블은 5개의 행만 가지고 있습니다.
이제 id = 6인 학생의 등급을 업데이트하는 UPDATE 문을 실행해 보겠습니다. 이 쿼리의 SET 절에서 사용된 하위 쿼리는 'info' 테이블에서 id = 6에 해당하는 행을 찾지 못하므로 아무런 값도 반환하지 못합니다.
mysql> UPDATE STUDENT SET grade = (SELECT remarks from info WHERE info.id = student.id) WHERE id = 6; Query OK, 1 row affected (0.04 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> Select * from student; +----+---------+-----------+ | Id | Name | grade | +----+---------+-----------+ | 1 | Rahul | Good | | 2 | Gaurav | Good | | 3 | Raman | Excellent | | 4 | Harshit | Average | | 5 | Aarav | Best | | 6 | Ram | NULL | +----+---------+-----------+ 6 rows in set (0.00 sec)
결과 분석
실행 결과를 보면 id = 6인 행의 'grade' 값이 기존의 'average'에서 NULL로 변경된 것을 확인할 수 있습니다. 이는 하위 쿼리가 일치하는 행을 반환하지 않았기 때문에 MySQL이 자동으로 NULL 값을 할당한 것입니다.
따라서 실무에서 UPDATE 문에 하위 쿼리를 사용할 때는 하위 쿼리가 항상 유효한 값을 반환하는지 반드시 검증해야 합니다. 그렇지 않으면 의도치 않게 기존 데이터가 NULL로 덮어써질 수 있기 때문입니다. 이러한 상황을 방지하려면 COALESCE 함수나 IFNULL 함수를 활용하여 기본값을 지정하는 방법도 고려할 수 있습니다.