
목차
null은 DB에서 없음을 뜻합니다.
흔히 생각하는 공백('')이나 0과는 다릅니다.
공백은 문자이며 0은 숫자입니다.
간단히 말하자면 null은 사용할 수 없거나, 할당되지 않았거나, 알 수 없거나, 적용할 수 없는 값입니다.
null을 사용하는 산술식은 null로 계산됩니다.
위와 같은 수식의 결과는 null입니다.
그래서 수식에 사용되는 컬럼은 명시적인 숫자를 넣어줄 필요가 있습니다.
어떤 사원이 인센티브를 받지 않는다면 null이 아닌 0이 되어야 정상적으로 계산이 될 수 있습니다.
1. NULL 사용법 예시
1-1 테이블 생성
먼저, 아래와 같이 employees 테이블을 생성하겠습니다.
CREATE TABLE employees (
employee_id NUMBER PRIMARY KEY,
first_name VARCHAR2(50),
last_name VARCHAR2(50),
birth_date DATE,
hire_date DATE NOT NULL,
salary NUMBER,
department_id NUMBER
);
이 테이블에서, hire_date 컬럼은 NOT NULL 제약 조건이 있으므로 반드시 값을 가져야 합니다.
그러나 다른 컬럼들은 NULL 값을 허용합니다.
1-2. 데이터 삽입
employees 테이블에 데이터를 삽입해 보겠습니다.
INSERT INTO employees (employee_id, first_name, last_name, birth_date, hire_date, salary, department_id)
VALUES (1, 'John', 'Doe', '1990-08-15', '2019-01-01', 50000, 10);
INSERT INTO employees (employee_id, first_name, last_name, hire_date)
VALUES (2, 'Jane', 'Smith', '2020-02-01');
첫 번째 INSERT 문에서 모든 컬럼에 값을 넣었습니다.
두 번째 INSERT 문에서는 birth_date, salary, department_id 컬럼에 값을 넣지 않았으므로, 이 컬럼들은 NULL 값을 갖게 됩니다.
1-3. NULL 값 비교
NULL 값을 비교할 때, 일반적인 비교 연산자(=, <, > 등)를 사용할 수 없습니다. 대신, IS NULL 또는 IS NOT NULL을 사용해야 합니다.
예를 들어, salary가 NULL인 직원을 찾으려면 다음과 같이 쿼리를 작성합니다.
SELECT *
FROM employees
WHERE salary IS NULL;
반대로, salary가 NULL이 아닌 직원을 찾으려면 다음과 같이 작성합니다.
SELECT *
FROM employees
WHERE salary IS NOT NULL;
1-4. NULL 값 처리
NVL이나 COALESCE와 같은 함수를 사용하여 NULL 값을 처리할 수 있습니다. 예를 들어, NULL인 salary를 0으로 채우려면 다음과 같이 쿼리를 작성합니다.
SELECT employee_id, first_name, last_name, NVL(salary, 0) AS salary
FROM employees;
1-5. 연결 연산자
문자열을 연결할 때 NULL 값이 포함된 경우 결과 문자열도 NULL이 됩니다. 이를 방지하기 위해 CONCAT 함수 또는 || 연산자를 사용할 수 있습니다.
예를 들어, 직원의 이름을 연결하려면 다음과 같이 쿼리를 작성합니다.
SELECT first_name || ' ' || last_name AS full_name
FROM employees;
first_name 또는 last_name이 NULL인 경우 결과 문자열도 NULL이 됩니다. 이 문제를 해결하려면 NVL 함수를 사용할 수 있습니다.
SELECT NVL(first_name, '') || ' ' || NVL(last_name, '') AS full_name
FROM employees;
1-6. NULL 값을 무시하는 집계 함수
오라클 DB의 집계 함수들은 기본적으로 NULL 값을 무시합니다. 예를 들어, salary 컬럼의 평균을 계산하려면 다음과 같이 쿼리를 작성합니다.
SELECT AVG(salary)
FROM employees;
이 쿼리에서 NULL 값은 무시되고, 실제 값들만 사용하여 평균이 계산됩니다.
1-7. NULL 값에 대한 조건 처리
CASE 문을 사용하여 NULL 값에 대한 조건 처리를 수행할 수 있습니다. 예를 들어, department_id가 NULL인 직원을 'Unknown' 부서로 표시하려면 다음과 같이 쿼리를 작성합니다.
SELECT employee_id, first_name, last_name,
CASE
WHEN department_id IS NULL THEN 'Unknown'
ELSE TO_CHAR(department_id)
END AS department
FROM employees;
이 예제에서는 department_id가 NULL인 경우 'Unknown'으로 표시되고, 그렇지 않은 경우 해당 값이 표시됩니다.
이처럼 오라클 DB에서 NULL 값은 다양한 방법으로 처리할 수 있으며, 데이터 관리 및 질의 작성에 있어 중요한 역할을 합니다. 적절한 함수와 연산자를 사용하여 NULL 값을 효과적으로 처리하는 것이 중요합니다.
2. null 사용시 주의점
null 사용시 주의점은 다음과 같습니다.
일반 비교 연산자 사용 불가: = null, <> null, != null 대신 IS NULL 또는 IS NOT NULL을 사용해야 합니다.
연산에 NULL 값 사용 주의: NULL 값을 포함한 연산 결과는 NULL이 됩니다. NVL, COALESCE, NULLIF 등의 함수를 하용합니다.
집계 함수 사용 시 NULL 값 무시: 집계 함수에서 NULL 값을 고려하려면 NVL 또는 COALESCE 함수를 사용해야 합니다.
조인에서 NULL 값 처리: 외부 조인을 사용하거나, NVL 또는 COALESCE 함수를 사용하여 NULL 값을 처리합니다.
문자열 연결 시 NULL 값 처리: CONCAT 함수 또는 NVL 또는 COALESCE 함수를 사용하여 문자열 연결 시 NULL 값을 처리합니다.
인덱스 및 NULL 값: 인덱스에서 NULL 값을 찾으려면 함수 기반 인덱스를 사용하거나 NULL 값을 처리해야 합니다.
GROUP BY와 NULL 값: NULL 값은 모두 동일한 그룹으로 간주됩니다.
ORDER BY와 NULL 값: NULLS FIRST 또는 NULLS LAST 옵션을 사용하여 NULL 값의 정렬 순서를 지정할 수 있습니다.
집합 연산자(UNION, INTERSECT, MINUS)와 NULL 값: NULL 값은 동일한 값으로 취급됩니다.
DISTINCT 사용 시 NULL 값: 결과 집합에서 NULL 값은 한 번만 나타납니다.
예를 들어 살펴보겠습니다.
2-1. 일반 비교 연산자 사용 불가
NULL 값을 비교할 때 일반 비교 연산자 (=, <>, <, > 등)를 사용할 수 없습니다. 대신, IS NULL 또는 IS NOT NULL을 사용해야 합니다.
-- 잘못된 예:
SELECT * FROM employees WHERE salary = NULL;
-- 올바른 예:
SELECT * FROM employees WHERE salary IS NULL;
2-2. NULL 값을 연산에 사용할 때 주의
NULL 값을 포함한 연산의 결과는 NULL이 됩니다. 이를 방지하기 위해 NVL, COALESCE, NULLIF 등의 함수를 사용하여 NULL 값을 처리해야 합니다.
-- 결과가 NULL인 예:
SELECT salary + bonus AS total_income FROM employees;
-- 결과가 NULL이 아닌 예:
SELECT NVL(salary, 0) + NVL(bonus, 0) AS total_income FROM employees;
2-3. 집계 함수 사용 시 NULL 값 무시
대부분의 집계 함수(SUM, AVG, COUNT, MAX, MIN 등)는 NULL 값을 자동으로 무시합니다. 특정 집계 함수에서 NULL 값을 고려하려면 NVL 또는 COALESCE 함수를 사용해야 합니다.
-- NULL 값을 0으로 처리하는 예:
SELECT SUM(NVL(salary, 0)) FROM employees;
2-4. 조인에서 NULL 값 처리
조인 시 NULL 값을 포함한 컬럼은 일치하는 결과를 찾기 어렵습니다. 이러한 상황에서는 외부 조인(LEFT, RIGHT, FULL OUTER)을 사용하거나, NVL 또는 COALESCE 함수를 사용하여 NULL 값을 처리해야 합니다.
-- 외부 조인 사용 예:
SELECT e.first_name, e.last_name, d.department_name
FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id;
2-5. 문자열 연결 시 NULL 값 처리
문자열 연결 연산자 ||를 사용할 때 NULL 값을 포함하면 결과 문자열도 NULL이 됩니다. 이를 방지하기 위해 CONCAT 함수 또는 NVL 또는 COALESCE 함수를 사용해야 합니다.
-- 결과가 NULL인 예:
SELECT first_name || ' ' || last_name AS full_name FROM employees;
-- 결과가 NULL이 아닌 예:
SELECT NVL(first_name, '') || ' ' || NVL(last_name, '') AS full_name FROM employees;
2-6. 인덱스 및 NULL 값
오라클 DB에서 기본적으로 인덱스는 NULL 값을 저장하지 않습니다. 인덱스를 통해 NULL 값을 찾으려면 함수 기반 인덱스를 사용하거나, NULL 값을 처리하는 방법을 고려해야 합니다.
2-7. GROUP BY와 NULL 값
GROUP BY 절을 사용할 때 NULL 값은 모두 동일한 그룹으로 간주됩니다. 이를 고려하여 결과를 해석해야 합니다.
SELECT department_id, COUNT(*) as employee_count
FROM employees
GROUP BY department_id;
이 쿼리에서, department_id가 NULL인 모든 직원은 하나의 그룹으로 계산됩니다.
2-8. ORDER BY와 NULL 값
ORDER BY 절을 사용할 때 NULL 값은 기본적으로 가장 낮은 값을 갖는 것으로 간주되며, 오름차순 정렬 시 처음에 위치합니다. NULLS FIRST 또는 NULLS LAST 옵션을 사용하여 NULL 값의 정렬 순서를 지정할 수 있습니다.
SELECT first_name, last_name, department_id
FROM employees
ORDER BY department_id NULLS LAST;
이 쿼리에서, department_id가 NULL인 행은 결과 집합의 마지막에 위치합니다.
2-9. UNION, INTERSECT, MINUS 연산자와 NULL 값
이러한 집합 연산자를 사용할 때 NULL 값은 동일한 NULL 값과 일치합니다. 이를 고려하여 결과를 해석해야 합니다.
SELECT department_id FROM employees
UNION
SELECT department_id FROM departments;
이 쿼리에서, 두 테이블 모두에서 나온 NULL 값은 결과 집합에서 하나의 NULL로 간주됩니다.
2-10. DISTINCT 사용 시 NULL 값
SELECT DISTINCT를 사용하여 중복을 제거할 때, NULL 값은 동일한 값으로 취급되며 결과 집합에 한 번만 나타납니다.
SELECT DISTINCT department_id
FROM employees;
이 쿼리에서, department_id가 NULL인 모든 직원은 결과 집합에서 하나의 NULL로 표시됩니다.
'오라클' 카테고리의 다른 글
쿼리에서 중복을 제거하는 방법(DISTINCT와 GROUP BY 차이점) (0) | 2023.03.24 |
---|---|
오라클 데이터 타입과 정확히 작성해야 하는 이유 (0) | 2023.03.22 |
sql에서 가독성을 높이는 별칭 사용법(Column Aliases, Table Aliases) (0) | 2023.03.18 |
SQL에서 산술 연산자 종류, 우선순위, 팁(암시적 변환, 정밀도 및 배율, 오버플로, 언더플로) (0) | 2023.03.15 |
오라클 SQL DECODE와 CASE(조건문, 비교) (0) | 2023.03.14 |