MySQL查询NULL值处理函数详解

我们已经看到使用WHERE子句的SQL SELECT命令来从MySQL表获取数据。但是,当我们试图给的条件比较字段或列的值为NULL,它不能正常工作。

为了处理这种情况,MySQL提供了三大运算符

IS NULL: 此运算符返回true,当列的值是NULL。

IS NOT NULL: 运算符返回true,当列的值不是NULL。

<=> 操作符比较值(不同于=运算符)为ture,即使两个NULL值

涉及NULL条件是特殊的。不能使用 =NULL 或 !=NULL 寻找NULL值的列。这种比较总是告诉他们是否是真正的失败,因为这是不可能的。即使是NULL=NULL失败。

如果要查找是或不是NULL的列,请使用IS NULL或IS NOT NULL。

如果你想要寻找值是NULL的列,你不能使用=NULL测试。下列语句不返回任何行,因为对任何表达式,

expr = NULL是假的:

 代码如下 复制代码

mysql> SELECT * FROM my_table WHERE phone = NULL;

要想寻找NULL值,你必须使用IS NULL测试。下例显示如何找出NULL电话号码和空的电话号码:

 代码如下 复制代码

mysql> SELECT * FROM my_table WHERE phone IS NULL;

mysql> SELECT * FROM my_table WHERE phone = "";

为了有助于NULL的处理,你能使用IS NULL和IS NOT NULL运算符和IFNULL()函数。

例子:
试试下面的例子:

 代码如下 复制代码

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>

可以看到=和!=不使用NULL值,如下所示:

 代码如下 复制代码
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)

要找到,其中tutorial_count列是或不是NULL的记录,查询应该这样写:

 代码如下 复制代码

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)

子查询 NOT IN 与 NOT EXISTS 中的NULL

有些情况下 NOT IN 形式的子查询返回空结果集,但是将其改写为 NOT EXISTS 形式后则恢复正常,如下所示:
建表:

  

 代码如下 复制代码
  mysql> CREATE TABLE t2 (col1 int default NULL, col2 int default NULL);  
    Query OK, 0 rows affected (0.01 sec)  
    mysql> CREATE TABLE t3 (col1 int default NULL, col2 int default NULL);  
    Query OK, 0 rows affected (0.01 sec) 

加入数据:

 代码如下 复制代码

    mysql> INSERT INTO t2 VALUES (1,2),(1,3);  
    Query OK, 2 rows affected (0.00 sec)  
    Records: 2 Duplicates: 0 Warnings: 0  
    mysql> INSERT INTO t3 VALUES (1,2),(1,NULL);  
    Query OK, 2 rows affected (0.00 sec)  
    Records: 2 Duplicates: 0 Warnings: 0 

执行如下查询:

 

 代码如下 复制代码
   mysql> SELECT * FROM t2 WHERE col2 NOT IN (SELECT col2 FROM t3);  
    Empty set (0.00 sec)  
    mysql> SELECT * FROM t2 WHERE NOT EXISTS (SELECT 1 FROM t3 WHERE t3.col2 = t2.col2);  
    +------+------+  
    | col1 | col2 |  
    +------+------+  
    | 1 | 3 |  
    +------+------+  
    1 row in set (0.00 sec) 

为什么会这样呢?这要从MySQL数据库NULL的特殊性说起:

在MySQL中有三种状态:True、False、Unknown,任何NULL的比较操作都是Unknown状态,如下所示:

   

 代码如下 复制代码
mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;  
    +----------+-----------+----------+----------+  
    | 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |  
    +----------+-----------+----------+----------+  
    | NULL | NULL | NULL | NULL |  
    +----------+-----------+----------+----------+  
    1 row in set (0.00 sec) 

而且所有的查询条件(ON, WHERE, HAVING)都是将Unknown状态当做False处理。

所以第一条查询的查询田间等同于:col2 NOT IN (2, NULL) => col2 <> 2 AND col2 <> NULL => true AND Unknow => Unknow => False
查询条件永为False,故该查询没有返回结果。

而 NOT EXISTS 是循环执行的

他首先执行 SELECT 1 FROM t3 WHERE t3.col2 = 2

返回了结果,经 NOT EXISTS 操作后查询条件为 False,故不做任何输出,

接下来执行 SELECT 1 FROM t3 WHERE t3.col2 = 3

无返回结果。经 NOT EXISTS 操作后查询条件为 True,于是输出本次查询结果。

所以,如果当一个 NOT IN 子查询没有返回结果的时候,应该特别注意内层查询的结果集是否包含空值,若包含的话,应尝试将查询改写为 NOT EXISTS 形式。

时间: 2024-12-04 12:08:44

MySQL查询NULL值处理函数详解的相关文章

mysql中时间和日期函数详解(1/3)

一.MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间(date + time)函数:now()  代码如下 复制代码 mysql> select now(); +–-------+ | now() | +–-------+ | 2008-08-08 22:20:46 | +–-------+ 除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数:  代码如下 复制代码 current_timestamp() ,current_timestamp ,localt

mysql常用日期与时间函数详解

  MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型        存储空间       日期格式                 日期范围 ------------  ---------   --------------------- ----------------------------------------- datetime       8 bytes   YYYY-MM-DD HH:MM:SS   1000-01-01 00:00:00 ~ 9999-12-

PHP 使用MySQL管理Session的回调函数详解_php技巧

复制代码 代码如下: <?php class MySession extends DBSQL {   /**   * __construct()   */  public function __construct() {   parent::__construct ();   }   /**   * open()   *    * @param <String> $sSavePath   * @param <String>$sSessionNames   *    * @re

MySQL字符串函数详解(推荐)_Mysql

一.ASCII ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回NULL. 二.ORD ORD(str) 如果字符串str最左面字符是一个多字节字符,通过以格式((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]返回字符的ASCII代码值来返回多字节字符代码.如果最左面的字符不是一个多字节字符.返回与A

MySQL常用聚合函数详解_Mysql

一.AVG AVG(col) 返回指定列的平均值 二.COUNT COUNT(col) 返回指定列中非NULL值的个数 三.MIN/MAX MIN(col):返回指定列的最小值 MAX(col):返回指定列的最大值 四.SUM SUM(col) 返回指定列的所有值之和 五.GROUP_CONCAT GROUP_CONCAT([DISTINCT] expr [,expr ...]              [ORDER BY {unsigned_integer | col_name | expr}

MySQL常用时间函数详解(推荐)_Mysql

2.6 DATE_SUB/DATE_ADD DATE_SUB(date,INTERVAL expr type) date 参数是合法的日期表达式.expr 参数是您希望添加的时间间隔. SELECT id FROM my_table WHERE create_time >= date_sub(now(), INTERVAL 3 HOUR) AND create_time < now(); Type 值 •MICROSECOND •SECOND •MINUTE •HOUR •DAY •WEEK

asp.net 函数的定义 返回值 调用方法详解说明(vb.net/c#)

asp教程.net 函数的定义 返回值 调用方法详解说明(vb.net/c#),首页我们来看一个vb.net中开的asp.net教程创建一个函数的做法,如下 <script runat="server" language="VB">       Function getName() As String         Return "a"       End Function       Sub Page_Load(s As Obje

SQL Server COALESCE函数详解及实例_Mysql

SQL Server COALESCE函数详解 很多人知道ISNULL函数,但是很少人知道Coalesce函数,人们会无意中使用到Coalesce函数,并且发现它比ISNULL更加强大,其实到目前为止,这个函数的确非常有用,本文主要讲解其中的一些基本使用:   首先看看联机丛书的简要定义:  返回其参数中第一个非空表达式语法:  COALESCE ( expression [ ,...n ] ) 如果所有参数均为 NULL,则 COALESCE 返回 NULL.至少应有一个 Null 值为 NU

PL/SQL单行函数和组函数详解

函数|详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 组函数 本文将讨论如何利用单行函数以及使用规则. SQL中的单行函数 SQL和PL/SQL中自带很多类型的函数,有字符.数字.日期.转换.和混合型等多种函数用于处理单行数据,因此这些都可被统称为单行函数.这些函数均可用于SELECT,WHERE.ORDER BY等子句中,例如下面的例子中就包含了TO_CHAR,UPPER