본문 바로가기
DBMS/MySQL

[MySql] SELECT 결과 UPDATE / NULL인 경우 mybatis에서 0 혹은 특정 값 UPDATE 시키기

by 성은2 2022. 8. 11.

 

SELECT 한 결과를 UPDATE 할 수 있는데, 두가지 방법이 있다.

 

 

1. WHERE절 이용

WHERE 절의 조건이 일치하는 t1의 COLUMN1이 모두 t2테이블의 COLUMN2로 업데이트 된다.

UPDATE [테이블명1] as t1
     , [테이블명2] as t2
   SET t1.COLUMN1 = t2.COLUMN2
 WHERE t1.COLUMN3 = t2.COLUMN4
;

 

 

2. JOIN 이용

JOIN절에 SELECT구문을 이용해 조회해온 결과를 UPDATE한다.

UPDATE [테이블1] 
INNER JOIN (
	SELECT COLUMN2  
      FROM [테이블2]
     WHERE ...
   ) AS [테이블2]
   ON [테이블1].COLUMN3 = [테이블2].COLUMN4
  SET [테이블1].COLUMN1 = [테이블2].COLUMN2;

 

 

위 두 구절로 SELECT 한 결과(테이블을 특정 조건으로 조회해온 결과)를 UPDATE할 수 있지만,

SELECT 결과가 NULL일 경우 아무것도 UPDATE 시키지 않기 때문에 문제가 생겼다.

아무 값도 UPDATE 시키지 않는 것이 아니라, 조회 결과가 없으면 0과 같은 값이 DB에들어가야 할 때가 있을 수 있다.

 

 

이때는 LEFT JOINIFNULL을 이용해서 SELECT 결과가 NULL 일 경우 0을 특정 컬럼에 SET 해주도록 처리했다.

 

 

3. SELECT 결과가 NULL일 경우 특정값(여기서는 0)으로 UPDATE

UPDATE company AS c
  LEFT JOIN (
  		SELECT ROUND(AVG(score), 1) as score
                     , company_info_id as companyInfoId
                     , MAX(modified_date) as modifiedDate
                  FROM review
                 WHERE company_info_id = #{companyId}
                 GROUP BY company_info_id
                 ORDER BY score desc, modifiedDate desc 
                 LIMIT 1
              ) AS u
   ON c.company_info_id = u.companyInfoId
   -- company 테이블의 company_review_avg 값을 LEFT JOIN으로 SELECT 해온 결과인 u.score로 업데이트.
   -- 다만, NULL인경우 0으로 업데이트 -> IFNULL구문
  SET c.company_review_avg = IFNULL(u.score, 0)
WHERE c.company_info_id = #{companyId}

 

 

4. IFNULL 구문

IFNULL(expr1,expr2)

If expr1 is not NULL, IFNULL() returns expr1; otherwise it returns expr2.

expr1이 NULL이면 expr1 반환, 그렇지 않으면 expr2 반환
mysql> SELECT IFNULL(1,0);
        -> 1
mysql> SELECT IFNULL(NULL,10);
        -> 10
mysql> SELECT IFNULL(1/0,10);
        -> 10
mysql> SELECT IFNULL(1/0,'yes');
        -> 'yes'