항상 그러듯 여러 개의 언어를 다루다 보면 변수의 선언부터 자료형 명칭 등 헷갈릴 때가 참 많다.
데이터베이스도 똑같다. ‘SQL인데 뭐 다르겠어?’ 싶지만 생각보다 완전히 같지는 않다.
회사에서 주로 MS-SQL 관계형 데이터베이스를 사용하여 작업을 하곤 하는데,
클라이언트에 요청에 따라 MySQL로 데이터베이스 서버를 구축해 주고 데이터 마이그레이션 해줘야 할 때가 있다.
두 데이터베이스 시스템에서 미묘한 차이점을 보이기 때문에 간혹 숙련된 개발자조차 헷갈리기 쉽다.
초보자인 나는 아직도 MySQL로 프로시저를 짤 때에는 변수 값 대입부터 헷갈리더라… 🙁
이번 글은 정말 사소한데 몰라서 당황했던 경험을 살려 정보 공유의 목적으로 글을 작성해보려 한다.
UPDATE 기본 구문
우선 업데이트 기본 구문을 살펴봐보자.
MS-SQL, MySQL 모두 기본 UPDATE 구문을 사용한다.
-- MS-SQL & MySQL 공통 UPDATE 기본 구문
UPDATE t1
SET col1 = 1000
WHERE col2 = 1;
SQLJOIN을 활용한 UPDATE 구문 오류 이슈
나의 문제는 여기서 발생했다.
두 개 이상의 테이블에 걸쳐 데이터를 수정해야 할 때에는
JOIN
을 사용하여
UPDATE
를 해야 하는 데 MySQL에서 자꾸 구문 오류가 발생한 것이다.
가상의 이야기로 구성해보자면,
어느 학생이 시험에 응시하면 그 점수를 업데이트하는 내용 정도로 보면 적절할 것 같다.
subject
테이블은
student
테이블의
student_id
컬럼을 외래키로 참조하고,
student
테이블의
student_id
컬럼의 값이 1(특정 학생)일 때,
subject
테이블의
score
컬럼의 값을 100(점수)으로 업데이트해줘야 하는 상황이였다.
내가 작성한 쿼리는 다음과 같다.
UPDATE sub
SET sub.score = 100
FROM subject AS sub
INNER JOIN student AS st ON sub.student_id = st.student_id
WHERE st.student_id = 1;
SQL구문 오류는 FROM 절에서 발생했다.
-- MySQL ERROR : "FROM" is not valid at this position, expecting EOF, ';'
SQL‘쿼리를 잘못 짰나?’ 하고 계속 확인해보면 찰나, MS-SQL과는 구문이 다르다는 것을 깨달았다.
MS-SQL에서의 JOIN을 활용한 UPDATE
MS-SQL에서의 업데이트 조인 구문은 위에서 작성한 구문이 맞다.
FROM
절에서
JOIN
을 지정하고
UPDATE
를 할 테이블에 별칭(
alias
)을 이용한다.
MySQL에서의 JOIN을 활용한 UPDATE
MySQL에서의 업데이트 조인 구문은 MS-SQL과 달랐다.
UPDATE
뒤에 바로
JOIN
구문을 바로 사용해야 한다.
SQL 쿼리는 다음과 같다.
(물론 MySQL에서도 별칭을 사용하여 업데이트 구문을 작성해도 된다.)
UPDATE subject as sub
INNER JOIN student AS st ON sub.student_id = st.student_id
SET sub.score = 100
WHERE st.student_id = 1;
SQLMSSQL과 MySQL의 UPDATE JOIN 차이점 간단 정리
MS-SQL
UPDATE ... SET ... FROM ... JOIN ... WHERE
SQLMySQL
UPDATE ... JOIN ... SET ... WHERE
SQL선임 개발자분이 자주 해주시는 말씀이 있는데,
“오류는 항상 어려운 곳에서 발생하는 것보다 생각보다 사소한 일(오타나 타입 오류 등)로 오류가 발생하는 경우가 많다”는 말을 정말 공감하고 있다.