MySQL查询中的非空问题

数据库 MySQL
在MySQL查询过程中,难免会出现一些问题,而由于字段没有设置NOT NULL而带来的问题,尤其值得我们去注意。

MySQL查询是我们经常会用到的操作,下面将为您分析MySQL查询中的非空问题,希望对您学习MySQL查询方面能够有些许的帮助。

表的订单状态字段设计为varchar类型,有以下值:NULL,pending,pending refund,refund,cancel.我们知道查询状态为cancel的订单,SQL语句可以这样写:

  1. SELECT o.oid,o.moneyreceipt,o.moneyget,o.thecurrency,o.status FROM qorder o WHERE o.status = 'cancel' 

SQL语句能查询出正确的数据,但是当我们想查询状态为非cancel的订单时,可能会出麻烦, 因为status字段没有设置NOT NULL,所以大部分订单的status值都是NULL,这样的话,用'<>'查询出来的数据不正确,只有status除了cancel之外 的非空数据查询出来了,而为NULL的没有查询出来。SELECT o.oid,o.moneyreceipt,o.moneyget,o.thecurrency,o.status FROM qorder o WHERE o.status <> 'cancel'原 因:NULL值操作
NULL值可能令人感 到奇怪直到你习惯它。概念上,NULL意味着“没有值”或“未知值”,且它被看作与众不同的值。为了测试NULL,你不能使用算术比较 操作符例如=、<或!=。为了说明它,试试下列查询:

  1. mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;  
  2. +----------+-----------+----------+----------+  
  3. 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |  
  4. +----------+-----------+----------+----------+  
  5. |     NULL |      NULL |     NULL |     NULL |  
  6. +----------+-----------+----------+----------+  

很 显然你不能通过这些比较得到有意义的结果。相反使用IS NULL和IS NOT NULL操作符:

  1. mysql> SELECT 1 IS NULL, 1 IS NOT NULL;  
  2. +-----------+---------------+  
  3. | 1 IS NULL | 1 IS NOT NULL |  
  4. +-----------+---------------+  
  5. |         0 |             1 |  
  6. +-----------+---------------+  

请注意在MySQL中,0或 NULL意味着假而其它值意味着真。布尔运算的默认真值是1。根据以上的NULL值操作结果,最终使用此种方式解决:SELECT o.oid,o.moneyreceipt,o.moneyget,o.thecurrency,o.status FROM qorder o WHERE IFNULL(o.status,'pending') <> 'cancel'学习:IFNULL(expr1,expr2)
如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值,取决于它被使 用的上下文环境。

  1. mysql> select IFNULL(1,0);  ->1  
  2. mysql> select IFNULL(0,10);  ->0  
  3. mysql> select IFNULL(1/0,10);  ->10.0000  
  4. mysql> select IFNULL(1/0,'yes');          
  5.  
  6. ->'yes'IF(expr1,expr2,expr3)  
  7.  

如果expr1是TRUE(expr1<>0且expr1<>NULL),那么IF()返回 expr2,否则它返回expr3。IF()返回一个数字或字符串值,取决于它被使用的上下文。

  1. mysql> select IF(1>2,2,3);  -> 3  
  2. mysql> select IF(1<2,'yes','no'); -> 'yes'  
  3. mysql> select IF(strcmp('test','test1'),'yes','no'); -> 'no'  

expr1作为整数值被计算,它意味着如 果你正在测试浮点或字符串值,你应该使用一个比较操作来做。

  1. mysql> select IF(0.1,1,0);  -> 0  
  2. mysql> select IF(0.1<>0,1,0);  -> 1  

在上面的第一种情况中,IF(0.1)返回0,因为0.1被变换 到整数值, 导致测试IF(0)。这可能不是你期望的。在第二种情况中,比较测试原来的浮点值看它是否是非零,比较的结果被用作一个整数。

  1. CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END   
  2.  
  3. CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END   
  4.  

第一个版本返回 result,其中value=compare-value。第二个版本中如果第一个条件为真,返回result。如果没有匹配的result值,那么结 果在ELSE后的result被返回。如果没有ELSE部分,那么NULL被返回。

  1. mysql> SELECT CASE 1 WHEN 1 THEN "one" WHEN 2 THEN "two" ELSE "more" END; -> "one"  
  2. mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END;  -> "true"  
  3. mysql> SELECT CASE BINARY "B" when "a" then 1 when "b" then 2 END; -> NULL   

 

 

 

【编辑推荐】

MySQL查询超时问题的解决

MySQL无重复查询的实现

详解mysql命令行给列起假名

MySQL查询优化器的工作原理

MySQL日期函数和时间函数

 

责任编辑:段燃 来源: 互联网
相关推荐

2010-11-25 11:15:11

MySQL查询超时

2010-01-04 13:44:41

SQL

2010-10-14 09:15:20

MySQL查询

2010-11-25 15:57:49

mysql查询语句

2009-10-14 13:43:12

综合布线系统

2011-05-18 10:24:55

Oracle

2010-10-27 13:39:34

Oracle查询

2010-11-25 16:09:58

mysql查询大小写

2011-07-25 09:03:30

WAMPMySQL空密码

2022-07-08 17:13:32

MySQL数据死锁

2010-09-02 14:59:23

非授权DHCP

2021-10-20 20:27:55

MySQL死锁并发

2010-06-07 14:50:50

jsp MySQL

2018-12-14 15:35:20

MySQL索引数据库

2010-09-24 15:46:23

SQL查询

2010-07-02 13:26:56

SQL Server处

2011-04-01 14:14:42

SQL Server空值

2009-04-24 09:33:12

LINQ查询非泛型

2009-06-04 09:47:48

MySQL隐藏控件TMPDIR

2010-05-28 18:05:22

jsp MySQL
点赞
收藏

51CTO技术栈公众号