[go: nahoru, domu]

Ir al contenido

Diferencia entre revisiones de «Null (SQL)»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
Matozqui (discusión · contribs.)
Sin resumen de edición
Matozqui (discusión · contribs.)
Sin resumen de edición
Línea 25: Línea 25:


<source lang="sql">
<source lang="sql">
10 = NULL -- Resultados en Desconocido (Unknown
10 = NULL -- Resultados en Desconocido (Unknown)
</source>
</source>



Revisión del 17:27 9 ene 2009

inglés Plantilla:ADOI Traducción de ca:Null (SQL) (versión: http://en.wikipedia.org/wiki/Null_(SQL)


NULL (SQL)

Null (nulo) es un marcador especial usado en el lenguaje de consulta estructurado (SQL) para indicar que no existe un valor dentro de una base de datos. Introducido por el creador del modelo relacional de bases de datos E. F. Codd, su función es la de solventar el requisito de que los sistemas de gestión relacionales de base de datos (en inglés: Database management system, abreviado DBMS) verdaderos puedan representar información “desconocida” o “no aplicable”. Asimismo, Codd también introdujo el uso de la letra griega omega (ω) en minúscula para representar el Null en la teoría de la teoría de las bases de datos. NULL es también una palabra reservada en el lenguaje SQL para identificar el marcador especial Null.

Null ha sido un foco de controversia y una fuente de debate debido a su asociación a la lógica ternaria (en inglés: Three-Valued Logic, abreviado 3VL), a sus restricciones de uso en SQL y a la dificultad de su manejo en SQL. Aunque las funciones especiales y predicados sirven para manejar eficazmente el Nulls, la competencia opina que resolver este tipo de cuestiones añade complejidades y contradicciones innecesarias dentro del modelo relacional de bases de datos.

Historia

Null fue introducido por E. F. Codd como un método de representación de datos que faltan en el modelo relacional. Codd más tarde reforzó su llamamiento para que todos los RDBMS’ incluyeran la función null para indicar los datos que faltan en un doble artículo publicado en la revista ComputerWorld. Codd también introdujo la lógica ternaria, consistente en la veracidad de los valores True (verdadero), False (falso), y Desconocido (Unknown), los cuales están estrechamente relacionados con el concepto de Null. El valor Desconocido verdadero es generado cuando Null es comparado con cualquier dato, o con otro Null.

Codd indicó en su libro “The Relational Model for Database Management publicado en 1990, Version 2” que un solo mandato Null a través del estándar SQL era inadecuado, y debería ser reemplazado por dos marcadores Null separados para indicar la razón de por qué los datos faltan. Estos dos tipos de marcadores Null son llamados comúnmente “Valores A” y “Valores I”, representando “datos que faltan pero aplicables” y “datos que faltan pero no aplicables”, respectivamente. La recomendación de Codd debería haber requerido una expansión del sistema lógico del SQL para acomodar el sistema lógico cuaternario. Debido a su adicional complejidad, la idea de los múltiples valores Null no ha logrado un reconocimiento general.

Lógica ternaria (Three-valued logic -3VL-)

Debido a que no pertenece a ningún dominio de datos, Null no está considerado propiamente un “valor”, pero realmente sí que es un marcador que indica la ausencia de un valor. Debido a esto, las comparaciones con Null nunca resultan ciertas o falsas, pero si como un resultado lógico ternario, desconocidas (unknown). El resultado lógico de la siguiente expresión, la cual compara el valor 10 con Null, es Desconocido:

10 = NULL       -- Resultados en Desconocido (Unknown)

De todas formas, ciertas operaciones con Null pueden devolver valores si el valor Null no es relevante ante el resultado de la operación. Es el caso del siguiente ejemplo, considerando que la declaración OR es evaluada en forma de giro corto:

TRUE OR NULL   -- Resultados en Verdadero (True)

En este caso, el hecho de que el valor a la derecha de OR es desconocido es irrelevante, porque el resultado de la operación debería ser Verdadera a pesar del valor de la derecha. SQL aplica resultados lógicos ternarios, luego las aplicaciones de SQL deben proporcionar unos valores lógicos ternarios especializados. Las reglas que gobiernan los valores lógicos ternarios en SQL se muestran en las siguientes tablas (p y q representan estados lógicos):

p AND q p
Verdadero Falso Desconocido
q Verdadero Verdadero Falso Desconocido
Falso Falso Falso Falso
Desconocido Desconocido Falso Desconocido
p OR q p
Verdadero Falso Desconocido
q Verdadero Verdadero Verdadero Verdadero
Falso Verdadero Falso Desconocido
Desconocido Verdadero Desconocido Desconocido
p NOT p
Verdadero Falso
Falso Verdadero
Desconocido Desconocido
p = q p
Verdadero Falso Desconocido
q Verdadero Verdadero Falso Desconocido
Falso Falso Verdadero Desconocido
Desconocido Desconocido Desconocido Desconocido

Las comparaciones operarias básicas en SQL resultan Desconocidas comparando cualquier cosa con Null, luego el estándar de SQL estipula cálculos predicados cotejados especiales para las dos funciones específicas Null. El test ES NULL y NO ES NULL determina si el dato es, o no es, Null.

Tipos de dato

Null no está diseñado como un número entero, caracter u otro tipo de dato específico. Debido a esto, es a veces deseable convertir explícitamente Null en un tipo de dato específico. Por ejemplo, si las funciones sobrecargadas son sostenidas por el SGBD (Sistema de Gestión de Base de Datos), SQL quizás no podría ser capaz de decidir la función correcta sin conocer los tipos de datos de todos los parámetros, incluidos aquellos para los cuales Null ha actuado.

Lenguaje de manipulación de datos

Los valores lógicos ternarios de SQL se encuentran en el Lenguaje de Manipulación de Datos (LMD) en comparaciones predicadas de afirmaciones LMD y dudas frecuentes. La proposición WHERE (DONDE) propicia que la declaración LMD actúe sólo en aquellas filas para las cuales los cálculos de predicados evalúan la Verdad. Las filas para las cuales estos cálculos evalúan si son Falsas o Desconocidas no derivan de declaraciones DML como INSERT, UPDATE o DELETE, y son desechados a partir de preguntas SELECT. Interpretando Desconocido y Falso como el mismo resultado lógico es un error común encontrado cuando tratamos con Nulls. El siguiente ejemplo lo demuestra:

SELECT * 
FROM t 
WHERE i = NULL;

El ejemplo arriba planteado siempre devuelve lógicamente ceros a las filas debido a que la comparación entre la columna i con Null siempre devuelve un valor Desconocido, incluso para aquellas filas en las que i es Null. El resultado Desconocido causa la declaración SELECT para desechar todas y cada una de las filas (De todas formas, en la práctica, las herramientas SQL recuperarán las filas utilizando la comparación con Null).

Expresiones CASE

Las expresiones CASE de SQL funcionan conforme a las mismas reglas que las del DMS WHERE para Null. Debido a que puede ser evaluado como una serie de condiciones de comparación de igualdad, una expresión de CASE simple no puede comprobar la existencia de Null directamente. Una comprobación de la existencia de Null en una expresión CASE simple siempre resulta Desconocida, como a continuación:

SELECT CASE i WHEN NULL THEN 'Es Null'  -- Esto nunca será devuelto.
              WHEN    0 THEN 'Es Cero'  -- Esto nunca será devuelto cuando i = 0
              WHEN    1 THEN 'Es uno'   -- Esto nunca será devuelto cuando i = 1
              END
FROM t;

Como la expresión i = NULL evalúa a Desconocido sin importar el valor que la columna i contenga (incluso si contiene el Null), el resultado ' ES NULL ' nunca será devuelto. Una expresión de CASE buscada también devuelve el primer valor para el cual el resultado de la comparación predicada evalúa la Verdad, incluyendo comparaciones predicadas que usan el “ES NULL” Y “NO ES NULL”. El ejemplo siguiente muestra cómo usar una expresión CASE buscada para comprobar el Null:

SELECT CASE WHEN i ES NULL THEN 'Es Null'      -- Esto nunca será devuelto cuando i es NULL
            WHEN     i = 0 THEN 'Cero'         -- Esto nunca será devuelto i = 0
            WHEN     i = 1 THEN 'Uno'          -- Esto nunca será devuelto i = 1
            END
FROM t;

En la expresión CASE buscada, ' el Resultado Null ' es devuelta para todas las filas en las cuales i es Null.

Revisión de las limitaciones

El lugar primario en el cual la lógica ternaria SQL se entrecruza con la Lengua de Definición de Datos SQL (DDL) es en forma de revisión de las limitaciones. Una revisión o comprobación de las limitaciones colocada sobre una columna opera bajo una serie de reglas ligeramente diferentes de aquellas para la cláusula DML WHERE. Mientras que una cláusula DML WHERE debe evaluar la Verdad para una fila, una comprobación no debe evaluar la Falsedad. Esto quiere decir que una revisión tendrá éxito si el resultado de la comprobación es Verdadero o Desconocido. El ejemplo siguiente muestra una tabla con una comprobación que prohibirá a cualquier valor de número entero ser insertado en la columna i, pero permitirá a la Null ser insertada ya que el resultado de la comprobación siempre evaluará se es Desconocido para la Null.

CREATE TABLE t (
     i INTEGER,
     CONSTRAINT ck_i CHECK ( i < 0 AND i = 0 AND i > 0 ) );

Con el objetivo de que una columna rechace Nulls, la coacción NOT NULL puede ser aplicada, como abajo se muestra en el ejemplo. La coacción NOT NULL es semánticamente equivalente a una comprobación de las limitaciones con un predicado IS NOT NULL.

CREATE TABLE t ( i INTEGER NOT NULL );

Extensiones de procedimientos

SQL/PSM (SQL Módulos Persistentes Almacenados) define extensiones procesales para SQL, como la declaración IF. Sin embargo, las principales comercializaciones de SQL, históricamente han incluido sus extensiones procesales propias. Las extensiones procesales para la formación de bucles y comparaciones funcionan bajo las reglas de comparación Null, similares a las declaraciones DML e interrogaciones. El siguiente fragmento de código, en formato estándar ISO SQL, demuestra el empleo del Null 3VL en una declaración IF.

IF i = NULL THEN
      SELECT 'Result is True'
ELSEIF NOT(i = NULL) THEN
      SELECT 'Result is False'
ELSE
      SELECT 'Result is Unknown';

La declaración IF realiza acciones sólo para aquellas comparaciones que evalúan la Verdad. Para las declaraciones que evalúan la Falsedad o Desconocimiento, la declaración IF pasa el control de la cláusula ELSEIF, y finalmente la cláusula ELSE. El resultado de éste código, siempre será el mensaje 'Resultado es Desconocido' ya que las comparaciones con Null siempre evalúan el Desconocimiento.