sql update 문 : 레코드를 변경할 때 쓴다.

코딩/Sql 2020. 7. 27. 00:59

 crud를 구현하실 때, update 문도 상당히 많이 쓰는 편입니다. 예를 들어 게시물 수정. 그렇게 내용이 길지는 않으니 천천히 보셔도 좋을 듯 싶습니다.

 


 먼저 instructor 테이블을 보겠습니다.

 

 전체 레코드의 모든 필드들을 조회하기 위해서 select * from instructor 쿼리를 입력하였습니다.

 

 

 이것을 salary 내림차순으로 정렬하였습니다. 저는 이 중에서 2번째와 3번째의 salary 값에 집중해 보도록 하겠습니다.

 

 

 update 다음에 테이블 명이 오고, set 다음에 어떠한 필드를 어떤 값으로 업데이트 할 것인지가 옵니다. 이 예제는, 모든 교수들의 연봉을 10% 인상하는 쿼리입니다.

 

 

 

 실행 후에, 다시 instructor 테이블을 보시면, 모든 교수의 연봉이 10% 인상된 것을 볼 수 있습니다. 그런데, 14366번의 Lembr 교수의 salary는 NULL 값이라고 되어 있습니다. NULL값은 모르는 값입니다. 여기에, 1.1을 곱해봤자, 모르는 값입니다. 따라서, NULL이 되는 게 맞겠네요.

 

 


 그런데 보통, 게시물을 업데이트 할 때, 전체 게시글이 업데이트 되는 것은 약간 이상해 보입니다. update문에도 where 절이 들어갈 수 있는데요. 예제를 하나 들어보겠습니다.

 

 

 위 쿼리는 무엇을 의미할까요? instructor에서, salary 필드를 30000.00 으로 업데이트 하라는 의미입니다. 그런데, where 절이 붙어 있는데요. salary가 null값인 것이 조건입니다. NULL 값을 판단하기 위해서 is null 이라던지, ifnull과 같은 (db에서 제공하는) 함수를 이용하면 되는데요. 저는 is null로 널 값 여부를 판단하겠습니다.

 

 

 이 쿼리를 수행하고 나서 instructor에서 모든 데이터를 뽑아보면, ID가 14366인 Lembr 교수의 salary가 NULL에서 30000으로 바뀐 것을 볼 수 있습니다. 그러면, 여러 필드의 값을 update 하려면 어떻게 작성하면 될까요? 저는 ID가 36897인 Morris 교수의 이름을 Mola로 바꾸고 dept_name을 Accounting으로 바꾸고, salary를 45000.0으로 바꾸고 싶습니다.

 

 어떻게 하면 될까요? 일단, ID가 36897인 교수만 바꾸면 되니, where 절에는 ID = 36897이 들어가면 됩니다.

 

 

 그러면 쿼리가 대충 이런 식으로 들어갈 겁니다. 이제, set 절에, 조건을 만족하는 레코드의 어떤 필드들을 어떤 값으로 업데이트 할 것인지만 적어주면 됩니다.

 

 

 이름을 'Mola'로, dept_name을 'Accounting'으로, salary를 45000.0으로 바꾸면 되니, set 절에 이 셋을 그대로 적어주시면 됩니다. 그리고, 정말 업데이트가 잘 되었는지 확인하기 위해서, ID가 36897인 레코드만 조회해 보도록 하겠습니다.

 

 

 그럴려면 쿼리문을 이렇게 작성하시면 됩니다.

 

 

 쿼리문을 수행한 결과는 위와 같습니다. 이제, 교수 1명만 속해있는 학과의 교수는 25만 달러의 salary를 받도록 해 봅시다.

 


 

 group by와 having과 count 함수를 잘 이용해 보니, Astronomy, Finance, Geology 이렇게 3개가 나옵니다.

 

 

 in 절을 쓰면 되긴 합니다. 그런데, 이 안에 또 서브 쿼리를 넣어야 할 건데요. 맨 안쪽 쿼리를 보면, dept_name과, dept_name에 속한 교수의 수를 출력합니다. 그런데, having 조건이 걸려 있습니다. 이 조건을 보니, count(dept_name)이 1인 경우만 결과값에 내 보내겠다는 의미입니다.

 

 그리고 바깥쪽 쿼리인 select dept_name from ... as t의 결과는 당연하게도, Astronomy, Finance, Geology 이렇게 3개가 나옵니다. dept_name이 이 셋인 경우에만 salary를 250000으로 설정합니다.

 

 

 쿼리의 실행 결과는 위와 같습니다.