Manipulação de valores NULL do MySQL

Vimos o SQL SELECT comando junto com o WHERE cláusula para buscar dados de uma tabela MySQL, mas quando tentamos dar uma condição, que compara o campo ou o valor da coluna com NULL, ele não funciona corretamente.

Para lidar com tal situação, o MySQL oferece três operadores -

  • IS NULL - Este operador retorna verdadeiro, se o valor da coluna for NULL.

  • IS NOT NULL - Este operador retorna verdadeiro, se o valor da coluna não for NULL.

  • <=> - Este operador compara valores, que (ao contrário do operador =) é verdadeiro mesmo para dois valores NULL.

As condições envolvendo NULL são especiais. Você não pode usar =NULL ou! = NULLpara procurar valores NULL nas colunas. Essas comparações sempre falham porque é impossível dizer se são verdadeiras ou não. Às vezes, mesmo NULL = NULL falha.

Para procurar colunas que são ou não NULL, use IS NULL ou IS NOT NULL.

Usando valores NULL no prompt de comando

Suponha que haja uma mesa chamada tcount_tbl no banco de dados TUTORIALS e contém duas colunas, a saber tutorial_author e tutorial_count, onde um tutorial_count NULL indica que o valor é desconhecido.

Exemplo

Experimente os seguintes exemplos -

root@host# 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>

Você pode ver que = e != não trabalhe com valores NULL da seguinte maneira -

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 localizar os registros em que a coluna tutorial_count é ou não NULL, as consultas devem ser escritas conforme mostrado no programa a seguir.

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)

Manipulação de valores NULL em um script PHP

Você pode usar o if...else condição para preparar uma consulta com base no valor NULL.

Exemplo

O exemplo a seguir pega o tutorial_count externo e depois compara com o valor disponível na tabela.

<?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);
?>