본문 바로가기

오라클

10 x null = ?, null(널)에 대해 알아야할 사항

목차

    null은 DB에서 없음을 뜻합니다.

    흔히 생각하는 공백('')이나 0과는 다릅니다. 

    공백은 문자이며 0은 숫자입니다.

    간단히 말하자면 null은 사용할 수 없거나, 할당되지 않았거나, 알 수 없거나, 적용할 수 없는 값입니다.

    null을 사용하는 산술식은 null로 계산됩니다.

     

    숫자와 null을 곱하면 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로 표시됩니다.