본문 바로가기
데이터 모델과 SQL

[SQL 이해하기] - 7. 트랜잭션, NULL값 처리

by 영바이트 2023. 5. 31.

먼저 트랜잭션의 개념에 대해 살펴보자. 트랜잭션(Transaction)은 하나로 취급되어야 하는 단계들의 묶음이다. 대표적인 예가 은행의 온라인 자금 이체 트랜잭션이다.

 

① A 계좌에서 M원을 인출한다.

② 인출된 M원을 B 계좌로 입금한다.

 

위 온라인 자금 이체에서 우연히 ①과정 중 B계좌가 해지되는 일이 있다고 하자. 이 경우 ①, ② 과정이 모두 취소(롤백, rollback)되어야 한다. 그렇지 않으면 A계좌에서 인출된 돈은 사라지게 된다. 트랜잭션을 '논리적인 하나의 단위'라고 한다.

 

데이터베이스 관리 시스템(DBMS)은 아래 네 가지 속성을 만족시킬 수 있도록 구현되어 있어야 한다. 중요한 개념이니 기억하고 있어야한다.

원자성(Atomicity) 하나의 트랜잭션은 쪼개질 수 없다. 트랜잭션 전체가 실행되거나 실행되지 않거나 둘 중 하나이다.
일관성(Consistency) 트랜잭션 실행 이전과 이후의 데이터베이스 상태가 일관되어야 한다. 예를 들어 계좌의 잔고가 0보다 크거나 같다는 제약 조건 아래에서 어떤 트랜잭션 수행 이후에 계좌 잔고가 -10만원이 되었다면 트랜잭션은 잔고가 0보다 크다는 제약 조건을 위반하고 데이터베이스의 일관성을 지키지 못한 것이 된다.
고립성(Isolation) 하나의 데이터에 대해 먼저 수행된 트랜잭션 수행 중에 다른 트랜잭션이 끼어들 수 없다.
항구성(Durability) 한번 변경된 데이터는 잃어버려서는 안된다.

 


 

NULL은 결측값(missing value)이라고도 하며 '데이터가 없음'이다. 0일 수도 있고 데이터베이스에서 사용하는 최대값일 수도 있다. NULL의 처리는 SQL 처리를 이해하는 데 헷갈릴 수 있는 개념이기 때문에 잘 정리해두어야 한다. 아래 세 가지 원칙들로 정리할 수 있다.

 

① SELECT 연산 결과에는 포함된다.

예) SELECT COL1, COL2 FROM SAMPLE;

COL1 COL2
10 5
20 NULL
NULL 15

10, 5

20, NULL

NULL, 15

 

② 테이블 가로 연산에서 NULL이 포함되어 있으면 결과값은 NULL이 된다.

예) SELECT COL1 + COL2 FROM SAMPLE WHERE COL2 > 5;

COL1 COL2
10 5
20 NULL
NULL 15

NULL + 15 = NULL

 

 

③ 테이블 세로 연산(=집계 함수들)에서 NULL이 포함되어 있으면 다른 인스턴스(행)와의 연산에서 NULL 값은 제외된다.

예) SELECT SUM(COL1), SUM(COL2) FROM SAMPLE WHERE COL2 IS NOT NULL;

COL1 COL2
10 5
20 NULL
NULL 15

SUM(COL1) = 10, SUM(COL2) = 5 + 15 = 20

∴ 10, 20

 

 


 

COUNT() 함수와 NULL

 

COUNT() 함수는 기본적으로 값이 NULL인 컬럼을 제외하고 갯수를 센다. 하지만 COUNT(*)는 값이 NULL인 컬럼을 포함한 전체 행의 갯수를 센다.

예)

ID Name Salary
1 John 5000
2 Jane NULL
3 Mike 6000
4 Rebecca NULL

 

SELECT COUNT(Salary) FROM employees;

→ 2

 

SELECT COUNT(*) FROM employees;

→ 4

 

댓글