Manejo de valores NULL de MySQL

Hemos visto el SQL SELECT comando junto con el WHERE cláusula para obtener datos de una tabla MySQL, pero cuando intentamos dar una condición, que compara el campo o el valor de la columna con NULL, no funciona correctamente.

Para manejar tal situación, MySQL proporciona tres operadores:

  • IS NULL - Este operador devuelve verdadero, si el valor de la columna es NULL.

  • IS NOT NULL - Este operador devuelve verdadero, si el valor de la columna no es NULL.

  • <=> - Este operador compara valores, que (a diferencia del operador =) es verdadero incluso para dos valores NULL.

Las condiciones que involucran NULL son especiales. No puedes usar =NULL o! = NULLpara buscar valores NULL en columnas. Estas comparaciones siempre fallan porque es imposible saber si son ciertas o no. A veces, incluso NULL = NULL falla.

Para buscar columnas que sean o no NULL, use IS NULL o IS NOT NULL.

Usar valores NULL en el símbolo del sistema

Suponga que hay una tabla llamada tcount_tbl en la base de datos TUTORIALS y contiene dos columnas a saber tutorial_author y tutorial_count, donde un tutorial_count NULL indica que el valor es desconocido.

Ejemplo

Pruebe los siguientes ejemplos:

[email protected]# mysql -u root -p password;
Enter password:*******

mysql> use TUTORIALS;
Database changed

mysql> create table tcount_tbl
   -> (
   -> tutorial_author varchar(40) NOT NULL,
   -> tutorial_count  INT
   -> );
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO tcount_tbl
   -> (tutorial_author, tutorial_count) values ('mahran', 20);

mysql> INSERT INTO tcount_tbl
   -> (tutorial_author, tutorial_count) values ('mahnaz', NULL);

mysql> INSERT INTO tcount_tbl
   -> (tutorial_author, tutorial_count) values ('Jen', NULL);

mysql> INSERT INTO tcount_tbl
   -> (tutorial_author, tutorial_count) values ('Gill', 20);

mysql> SELECT * from tcount_tbl;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
|     mahran      |       20       |
|     mahnaz      |      NULL      |
|      Jen        |      NULL      |
|     Gill        |       20       |
+-----------------+----------------+
4 rows in set (0.00 sec)

mysql>

Puedes ver que = y != no funciona con valores NULL de la siguiente manera:

mysql> SELECT * FROM tcount_tbl WHERE tutorial_count = NULL;
Empty set (0.00 sec)

mysql> SELECT * FROM tcount_tbl WHERE tutorial_count != NULL;
Empty set (0.01 sec)

Para encontrar los registros donde la columna tutorial_count es o no NULL, las consultas deben escribirse como se muestra en el siguiente programa.

mysql> SELECT * FROM tcount_tbl 
   -> WHERE tutorial_count IS NULL;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
|     mahnaz      |      NULL      |
|      Jen        |      NULL      |
+-----------------+----------------+
2 rows in set (0.00 sec)
mysql> SELECT * from tcount_tbl 
   -> WHERE tutorial_count IS NOT NULL;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
|     mahran      |       20       |
|     Gill        |       20       |
+-----------------+----------------+
2 rows in set (0.00 sec)

Manejo de valores NULL en un script PHP

Puedes usar el if...else condición para preparar una consulta basada en el valor NULL.

Ejemplo

El siguiente ejemplo toma el tutorial_count desde fuera y luego lo compara con el valor disponible en la tabla.

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root';
   $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);

   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   if( isset($tutorial_count )) {
      $sql = 'SELECT tutorial_author, tutorial_count
         FROM  tcount_tbl
         WHERE tutorial_count = $tutorial_count';
   } else {
      $sql = 'SELECT tutorial_author, tutorial_count
         FROM  tcount_tbl
         WHERE tutorial_count IS $tutorial_count';
   }

   mysql_select_db('TUTORIALS');
   $retval = mysql_query( $sql, $conn );
   
   if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Author:{$row['tutorial_author']}  <br> ".
         "Count: {$row['tutorial_count']} <br> ".
         "--------------------------------<br>";
   } 
   echo "Fetched data successfully\n";
   mysql_close($conn);
?>