먼저 트랜잭션의 개념에 대해 살펴보자. 트랜잭션(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
■
'데이터 모델과 SQL' 카테고리의 다른 글
[SQL 이해하기] - 8.2. SQL: SELECT II (0) | 2023.06.30 |
---|---|
[SQL 이해하기] - 8.1. SQL: SELECT I (0) | 2023.06.29 |
[SQL 이해하기] - 6. 반정규화 (0) | 2023.05.26 |
[SQL 이해하기] - 5. 정규화 (0) | 2023.05.23 |
[SQL 이해하기] 4. 데이터의 이해 - 식별자(Identifiers) (0) | 2023.05.16 |
댓글