- 이번 포스팅 부터는 저번 포스팅에서 갖춘 HeidiSQL(MySQL) 실습 환경을 사용해보도록 할 것이다. -
[SQL 갱신 응용1]
NULL 안에 레코드 값 채우기 & 레코드 값 안에 NULL 작성하기
SQL을 사용하는 많은 유저들은 SELECT 구문인 '검색'의 기능을 주로 사용한다. 같은 DML(데이터 조작어)에 속하지만 UPDATE나 DELETE같은 '갱신'의 기능을 사용하는 경우는 드물다.
때문에 '갱신'에 관한 쿼리를 작성할 때 효율적이지 못한 쿼리로 작성하게 되는 경우가 많다. 사용을 잘 안하기에 많은 개발자들에게 익숙한 '절차 지향형 방법'으로 쿼리가 짜여지기 때문이다.
이번 포스팅부터는 보다 효율적으로 테이블을 갱신하는 예제를 살펴볼 것이다. 예시를 위해 아래와 같은 테이블을 만들어 보았다.
위에서 만든 OmitTbl 테이블에서 val 필드의 레코드 값이 NULL인 경우가 존재하며, 이 경우의 NULL 값을 갱신하는 쿼리를 작성해보도록 하겠다.
- 상관 서브쿼리를 활용한 방법(NULL 안에 레코드 값 채우기)
SQL의 상관 서브쿼리를 이용하여 NULL 값을 채우는 방법은 아래와 같다. 이 과정에서는 제시한 세 가지 조건을 만족하는 레코드 집합을 구하고, 그중 가장 큰 seq 필드를 가진 레코드를 찾으면 된다.
조건1. 같은 keycol 필드를 가짐
조건2. 현재 레코드보다 작은 seq 필드를 가짐
조건3. val 필드가 NULL이 아님
- 상관 서브쿼리를 활용한 방법(레코드 값 안에 NULL 작성하기)
위의 예시와는 반대로 채우기 이후의 OmitTbl 테이블을 출발점에 놓고, 채우기 이전의 상태로 변환하는 예시를 살펴볼 것이다. 쿼리는 다음과 같다.
위에서 살펴본 조건 1~3에 해당하는 레코드라면 NULL을 입력하고, 그렇지 않으면 해당 레코드 val 값을 그대로 출력하는 조건 분기를 CASE 식으로 작성하여 갱신하였다. 이러한 코드가 가능한 이유는 서브쿼리가 하나의 값을 리턴하는 '스칼라 서브쿼리'이기 때문에 가능하다.
다음 포스팅에서는 레코드 값을 필드로 만들어주는 갱신에 대한 예제를 살펴볼 것이다.
'Data Analysis > SQL' 카테고리의 다른 글
[SQL] 19. 레코드에서 필드로의 갱신1 (필드값을 속성으로 만들기1) (0) | 2019.08.27 |
---|---|
[SQL] 16. SQL 실습환경 갖추기 (feat. MySQL) (0) | 2019.08.17 |
[SQL] 17. SQL 실습환경 갖추기 (feat. HeidiSQL with MySQL) (0) | 2019.07.24 |
[SQL] 15. SQL 레코드 순서 응용4 (예제 - 테이블에 존재하는 시퀀스 찾기) (0) | 2019.07.24 |
[SQL] 14. SQL 레코드 순서 응용3 (예제 - 테이블에 존재하지 않는 시퀀스 찾기) (0) | 2019.07.21 |
댓글