본문 바로가기
Data Analysis/SQL

[SQL] 18. SQL 갱신 응용1 (예제 - NULL값 채우기)

by Dlearner 2019. 7. 28.
반응형

- 이번 포스팅 부터는 저번 포스팅에서 갖춘 HeidiSQL(MySQL) 실습 환경을 사용해보도록 할 것이다. -

[SQL 갱신 응용1]

NULL 안에 레코드 값 채우기 & 레코드 값 안에 NULL 작성하기

SQL을 사용하는 많은 유저들은 SELECT 구문인 '검색'의 기능을 주로 사용한다. 같은 DML(데이터 조작어)에 속하지만 UPDATE나 DELETE같은 '갱신'의 기능을 사용하는 경우는 드물다.

 

때문에 '갱신'에 관한 쿼리를 작성할 때 효율적이지 못한 쿼리로 작성하게 되는 경우가 많다. 사용을 잘 안하기에 많은 개발자들에게 익숙한 '절차 지향형 방법'으로 쿼리가 짜여지기 때문이다. 

 

이번 포스팅부터는 보다 효율적으로 테이블을 갱신하는 예제를 살펴볼 것이다. 예시를 위해 아래와 같은 테이블을 만들어 보았다.

 

 

- OmitTbl 테이블 생성 -

 

위에서 만든 OmitTbl 테이블에서 val 필드의 레코드 값이 NULL인 경우가 존재하며, 이 경우의 NULL 값을 갱신하는 쿼리를 작성해보도록 하겠다.

 

 

 

 

 

- 상관 서브쿼리를 활용한 방법(NULL 안에 레코드 값 채우기)

SQL의 상관 서브쿼리를 이용하여 NULL 값을 채우는 방법은 아래와 같다. 이 과정에서는 제시한 세 가지 조건을 만족하는 레코드 집합을 구하고, 그중 가장 큰 seq 필드를 가진 레코드를 찾으면 된다.

 

조건1. 같은 keycol 필드를 가짐

조건2. 현재 레코드보다 작은 seq 필드를 가짐

조건3. val 필드가 NULL이 아님

 

 

- 상관 서브쿼리를 이용한 NULL 채우기 -

 

 

 

 

 

- 상관 서브쿼리를 활용한 방법(레코드 값 안에 NULL 작성하기)

위의 예시와는 반대로 채우기 이후의 OmitTbl 테이블을 출발점에 놓고, 채우기 이전의 상태로 변환하는 예시를 살펴볼 것이다. 쿼리는 다음과 같다.

 

 

- 상관 서브쿼리를 이용한 레코드 비우기 -

 

 

 

위에서 살펴본 조건 1~3에 해당하는 레코드라면 NULL을 입력하고, 그렇지 않으면 해당 레코드 val 값을 그대로 출력하는 조건 분기를 CASE 식으로 작성하여 갱신하였다. 이러한 코드가 가능한 이유는 서브쿼리가 하나의 값을 리턴하는 '스칼라 서브쿼리'이기 때문에 가능하다.

 

 

 

 

다음 포스팅에서는 레코드 값을 필드로 만들어주는 갱신에 대한 예제를 살펴볼 것이다.

반응형

댓글