sábado, 7 de abril de 2012

14 - Valores null.

Analizaremos la estructura de una tabla que vemos al utilizar el comando "describe".
Tomamos como ejemplo la tabla "libros":


Field  Type   Null Key Default Extra
______________________________________________________________________
codigo  int(11)   7 b.. NO PRI auto_increment
titulo  varchar(20) 11 b.. YES  (NULL)
autor  varchar(30) 11 b.. YES  (NULL)
editorial varchar(15) 11 b.. YES  (NULL)
precio  float   5 b.. YES  (NULL)

La primera columna indica el tipo de dato de cada campo.

La segunda columna "Null" especifica si el campo permite valores nulos; vemos que en el campo "codigo", aparece "NO" y en las demás "YES", esto significa que el primer campo no acepta valores nulos (porque es clave primaria) y los otros si los permiten.

La tercera columna "Key", muestra los campos que son clave primaria; en el campo "codigo" aparece "PRI" (es clave primaria) y los otros están vacíos, porque no son clave primaria.

La cuarta columna "Default", muestra los valores por defecto, esto es, los valores que MySQL ingresa cuando omitimos un dato o colocamos un valor inválido; para todos los campos, excepto para el que es clave primaria, el valor por defecto es "null".

La quinta columna "Extra", muestra algunos atributos extra de los campos; el campo "codigo" es "auto_increment". 

Vamos a explicar los valores nulos.

"null' significa "dato desconocido" o "valor inexistente". No es lo mismo que un valor 0, una cadena vacía o una cadena literal "null".

A veces, puede desconocerse o no existir el dato correspondiente a algún campo de un registro. En estos casos decimos que el campo puede contener valores nulos. Por ejemplo, en nuestra tabla de libros, podemos tener valores nulos en el campo "precio" porque es posible que para algunos libros no le hayamos establecido el precio para la venta.

En contraposición, tenemos campos que no pueden estar vacíos jamás, por ejemplo, los campos que identifican cada registro, como los códigos de identificación, que son clave primaria.

Por defecto, es decir, si no lo aclaramos en la creación de la tabla, los campos permiten valores nulos.
Imaginemos que ingresamos los datos de un libro, para el cual aún no hemos definido el precio:

insert into libros (titulo,autor,editorial,precio) 
values ('El aleph','Borges','Planeta',null);
 
Note que el valor "null" no es una cadena de caracteres, no se coloca entre comillas.

Si un campo acepta valores nulos, podemos ingresar "null" cuando no conocemos el valor.

Los campos establecidos como clave primaria no aceptan valores nulos. Nuestro campo clave primaria, está definido "auto_increment"; si intentamos ingresar el valor "null" para este campo, no lo tomará y seguirá la secuencia de incremento.

El campo "titulo", no debería aceptar valores nulos, para establecer este atributo debemos crear la tabla con la siguiente sentencia:

create table libros(
  codigo int auto_increment,
  titulo varchar(20) not null
  autor varchar(30),
  editorial varchar(15),
  precio float,
  primary key (codigo)
 );

Entonces, para que un campo no permita valores nulos debemos especificarlo luego de definir el campo, agregando "not null". Por defecto, los campos permiten valores nulos, pero podemos especificarlo igualmente agregando "null".

Explicamos que "null" no es lo mismo que una cadena vacía o un valor 0 (cero).

Para recuperar los registros que contengan el valor "null" en el campo "precio" no podemos utilizar los operadores relacionales vistos anteriormente: = (igual) y <> (distinto); debemos utilizar los operadores "is null" (es igual a null) y "is not null" (no es null):

select * from libros
 where precio is null;
 
La sentencia anterior tendrá una salida diferente a la siguiente:

select * from libros
 where precio=0;
 
Con la primera sentencia veremos los libros cuyo precio es igual a "null" (desconocido); con la segunda, los libros cuyo precio es 0.

Igualmente para campos de tipo cadena, las siguientes sentencias "select" no retornan los mismos registros:

select * from libros where editorial is null;
 select * from libros where editorial='';
 
Con la primera sentencia veremos los libros cuya editorial es igual a "null", con la segunda, los libros cuya editorial guarda una cadena vacía.


Problema Resuelto: 

Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla, si existe:

drop table if exists libros;
 
Creamos la tabla estableciendo con la siguiente estructura:

create table libros(
  codigo integer auto_increment,
  titulo varchar(20) not null,
  autor varchar(30),
  editorial varchar(15),
  precio float,
  primary key(codigo)
 );
 
Al visualizar la estructura de la tabla con "describe", vemos lo siguiente:

Field  Type   Null Key Default Extra
______________________________________________________________________
codigo  int(11)   7 b.. NO PRI (NULL) auto_increment
titulo  varchar(20) 11 b.. NO
autor  varchar(30) 11 b.. YES  (NULL)
editorial varchar(15) 11 b.. YES  (NULL)
precio  float   5 b.. YES  (NULL)

Vemos que el campo "codigo" y el campo "titulo" no permiten valores nulos. Y que el campo "codigo" es clave primaria y "auto_increment". Los demás campos permiten valores nulos.

Ingresamos algunos registros:

insert into libros (titulo,autor,editorial,precio)
 values('El aleph','Borges','Planeta',null);
 
ingresamos "null" para el precio, campo que permite valores nulos. Note que el valor "null" no se coloca entre comillas porque no es una cadena de caracteres.

Si intentamos ingresar el valor "null" en un campo que no lo permite (titulo), aparece un mensaje de error indicando tal situación:

insert into libros (titulo,autor,editorial,precio)
 values (null,'Paenza','Paidos',10.30);
 
Si intentamos ingresar el valor "null" para el campo "codigo", que es clave primaria y "auto_increment", no lo tomará y seguirá la secuencia de incremento:

insert into libros (codigo,titulo,autor,editorial,precio)
  values (null,'El quijote de la mancha', 'Cervantes Saavedra', 'Emece',25.50);
 
Podemos ingresar valores nulos en los campos que lo permiten, por ejemplo, en "editorial":

insert into libros (titulo,autor,editorial,precio)
 values ('Harry Potter y la piedra filosofal', 'J.K. Rowling',null,30.00);
 
Ingresemos otros valores que nos servirán luego para verificar que los valores "null" son diferentes de 0 y de cadenas vacías.

insert into libros (titulo,autor,editorial,precio)
 values ('Matematica estas ahi','Paenza','Paidos',0);
 insert into libros (titulo,autor,editorial,precio)
 values ('Martin Fierro','Jose Hernandez','',22.50);
 
Explicamos que "null" no es lo mismo que una cadena vacía o un valor 0.

Para recuperar los registros que contengan el valor "null" en el campo "precio" tipeamos:

select * from libros
 where precio is null;
 
La salida será diferente a:

select * from libros
 where precio=0;
 
Verifiquemos que las siguientes sentencias no retornan el mismo resultado:

select * from libros
 where editorial is null;
 select *from libros
 where editorial='';
 
Con la primera sentencia recuperamos los libros cuya editorial es "null"; con la segunda, los libros cuya editorial guarda una cadena vacía.


Problema Propuesto:
 
Retome la tabla llamada "medicamentos" que almacena la información de los 
productos que se venden en una farmacia.

1- Elimine la tabla, si existe.

2- Cree la tabla con la siguiente estructura: 
 
create table medicamentos(
  codigo integer auto_increment,
  nombre varchar(20) not null,
  laboratorio varchar(20),
  precio float,
  cantidad integer not null,
  primary key (codigo)
 );

3- Visualice la estructura de la tabla "medicamentos".

4- Ingrese los siguientes registros:
 (nombre,laboratorio,precio,cantidad)
  Sertal gotas,Roche,5.2,100
  Sertal compuesto,Roche,7.1,150
  Buscapina,Roche,null,200
  Amoxidal 500,Bayer,15.60,0
  Amoxidal jarabe,Bayer,25,120
  Amoxinil,null,25,120
  Bayaspirina,'',0,150

5- Verifique que el campo "codigo" generó los valores de modo automático.

6- Recupere los registros que contengan valor "null" en el campo 
"laboratorio", luego los que tengan una cadena vacía en el mismo 
campo. Note que el resultado es diferente:
 

7- Recupere los registros que contengan valor "null" en el campo "precio", 
   luego los que tengan el valor 0 en el mismo campo. Note que el resultado 
es diferente:
 
8- Intente ingresar el siguiente registro con valor "null" para el campo 
"nombre":
 
  null,Bayer,10.20,100
 
 Aparece un mensaje de error.

8- Intente ingresar el siguiente registro con valor "null" para el campo 
"cantidad":
 
  Benadryl comprimidos,Bayer,10.20,null
 
Aparece un mensaje de error.

9- Ingrese el siguiente registro con valor "null" para el campo 
correspondiente al código:
 
null,Benadryl comprimidos,Bayer,10.20,null
 
 No muestra un mensaje de error. Si recuperamos todos los registros, 
verá que almacenó el siguiente valor de la secuencia de autoincremento.

10- Recupere los registros cuyo precio sea distinto de 0, luego los que 
    sean distintos de "null":
 
Note que la salida de la primera sentencia no muestra los registros con 
valor 0 y tampoco los que tienen valor nulo; el resultado de la segunda 
sentencia muestra los registros con valor para el campo precio (incluso 
el valor 0). Esto es porque los valores "null" no pueden compararse con 
operadores relacionales.

11- Recupere los registros en los cuales el laboratorio no contenga una 
cadena vacía, luego los que sean distintos de "null":
 
Note que la primera sentencia solicita los registros que no tengan cadena 
vacía, es decir, los que guardan una cadena, como "null" no es una cadena, 
no retorna los registros con valor nulo.
 
El resultado de la segunda sentencia solicita que no muestre los valores
nulos, es decir, que muestre cualquier cadena, incluso vacía.
 
 
Otros problemas: 
Trabaje con la tabla que almacena los datos sobre películas, llamada 
"peliculas".

1- Elimine la tabla.

2- Créela con la siguiente estructura:
 
 -codigo (entero, autoincremento),
 -titulo (cadena de 30, not null),
 -actor (cadena de 20),
 -duracion (entero),
 -clave primaria (codigo).

3- Visualice la estructura de la tabla.

4- Ingrese los siguientes registros:
 
 (titulo,actor,duracion)
  Mision imposible,Tom Cruise,120
  Harry Potter y la piedra filosofal,Daniel R.,180
  Harry Potter y la camara secreta,Daniel R.,190
  Mision imposible 2,Tom Cruise,150
  Titanic,L. Di Caprio,220
  Mujer bonita,R. Gere-J. Roberts,200

5- Recupere todos los registros para verificar la carga 
automática de los códigos.

6- Ingrese un registro con valor nulo para el campo clave primaria:
 
  null,Elsa y Fred,China Zorrilla,90
 
Verifique que acepta el registro pero pasa por alto el dato ingresado 
para el código colocando en su lugar el valor siguiente de la secuencia.

7- Intente ingresar un registro con valor nulo para el campo "titulo". 
Verifique que no realiza la acción.

8- Ingrese un registro con valor nulo para los campos "actor" y "duracion":
 
 Mr. Johns,null,null 
 
Verifique que el registro ha sido ingresado.

9- Ingrese un registro con cadenas vacías para los campos varchar y valor 
0 para los campos numéricos:
 
  0,'','',0 
 
Visualice el registro para ver cómo almacenó MySQL el registro ingresado 
anteriormente.

10- Coloque 120 en la duración de la película cuyo valor de duración sea 
nulo (1 registro actualizado):

11- Coloque 'Desconocido' en el campo "actor" en los registros que tengan 
valor nulo en dicho campo (1 registro afectado):
 
12- Muestre todos los registros. Note que el cambio anterior no afectó al 
registro con valor nulo en el campo "actor".

13- Coloque 'Desconocido' en el campo "actor" en los registros que tengan 
cadena vacía en dicho campo (1 registro afectado):
 
14- Elimine los registros cuyo título sea una cadena vacía:
 




       

No hay comentarios:

Publicar un comentario