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 JOIN과 IFNULL을 이용해서 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 구문
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'
'DBMS > MySQL' 카테고리의 다른 글
[MySQL] rownum, 역순 출력 (0) | 2022.08.22 |
---|---|
[MySql] 값이 있으면 INSERT, 없으면 UPDATE / PK 중복시 업데이트 구문 / ON DUPLICATE KEY UPDATE (0) | 2022.07.05 |