请教关于Mysql的IFNULL和ISNULL

mysql中isnull、ifnull、nullif的用法如下。
isnull(expr)用法:如果expr为null,则isnull()返回值为1,否则返回值为0。
使用mysql>selectisnull(1+1);->0mysql>selectisnull(1/0);->1=比较null值一般是不正确的。
isnull()函数具有一些与isnull比较运算符相同的属性。
请参阅有关isnull的注释。
IFNULL(expr1,expr2)用法:如果expr1不为NULL,则IFNULL()的返回值为expr1。
否则,返回值为expr2。
IFNULL()的返回值是数字或字符串,具体取决于使用它的上下文。
mysql>SELECTIFNULL(1,0);->1mysql>SELECTIFNULL(NULL,10);->10mysql>SELECTIFNULL(1/0,10);->10mysql>SELECTIFNULL(1/0,'是');->'yes'IFNULL(expr1,expr2)的默认结果值为STRING、REAL或INTEGER是两个顺序表达式中更“通用”的一个。
假设基于表达式的表的情况,或者MySQL需要将IFNULL()的返回值存储在内存中的临时表中。
在此示例中,测试列是CHAR(4)。
NULLIF(expr1,expr2)用法:如果expr1=expr2为true,则返回值为NULL,否则返回值为expr1。
这相当于CASEWHENexpr1=expr2THENNULLELSEexpr1END。
mysql>SELECTNULLIF(1,1);->NULLmysql>SELECTNULLIF(1,2);->1如果参数不一样,MySQL中两次得到的值都是expr1。

MySQLNULL值处理详细说明

在讨论null之前,我们先看一下示例表数据如下:

然后,如果我们想查找所有名称不为'chen'的行记录,我们可以这样写:

但是结果并不是我们所期望的。
找不到ID为1的记录。
为什么我找不到它?

NUll值很容易让初学者感到困惑。
尽管null和空字符串通常被认为是相同的,但实际上它们非常不同。
"missingunknownvalue",字符串''是一个确定值,但本质上是不同的。

示例:

第一条插入语句表示手机号码未知,unknownphonenumber缺失,第二条语句表示手机号码确定。
手机号码为空字符串

处理涉及null的比较,可以使用mysql中的isnull、isnotnull、<=>、is。
null()用于测试和比较。
不能使用=、<和<>来比较和测试空值。
空值和函数运算任何值与运算(包括空值本身)相比的结果都是空值。

我可以用以下三个例子来说明问题:

但凡事都有例外。
即使用independent、groupby、orderby时,计算时不同的null值被认为是相等的。

所以回顾一下原来的例子,当where条件为name!='chen'时,是与id=1的行进行比较,即'chen'!='。
chen'测试结果为0(假),因此未找到id=1的行。
接下来,再次尝试测试。
测试'zhang'!='chen'结果为1,这是正确的,因此我们可以找到id=2行。
接下来,再次测试。
NULL!='chen'测试结果为NULL,因此为false,因此未找到行id=3。
所以最终结果是只检索id=2行的数据。
那么你需要做什么来实现你的目标呢?

推荐第一种方法。
因为mysql具有检测空列的查询优化功能:

而第二种向列添加函数的查询在使用索引时将不起作用。

其他说明

提高mysql查询效率的方法有哪些

1.尽量不要在适当的地方包含子查询;对于时态查询,尽量不要写成:Whereto_char(dif_date,'yyyy-mm-dd')=to_char('2007-07-01′,'yyyy-mm-dd')2、过去的过滤条件当中,条件应该放在where子句的末尾,可以过滤最大条数的记录;FROM语句中最后写入的表(基表、驱动表)将首先处理,FROM语句中将处理多条记录,如果是表,应选择记录数最少的表作为基表。
桌子。
如果有超过三个连接查询,则需要选择一个交集表作为主表。
交叉表是指一个表被其他表引用;3.使用绑定变量4.WHERE中尽量不要使用OR5将IN替换为EXIST,NOTIN替换为NOTIN6.避免对索引列使用算术运算:WHERESAL*12>25000;7.使用IN代替OR:WHERELOC_ID=15ORLOC_ID=208。
避免在索引列中使用ISNULL和ISNOTNULL9.始终使用索引的第一列;11、避免索引改变引用列类型:SELECT...FROMEMPWHEREEMPNO='123',由于隐式数据类型转换,to_char(EMPNO)='123',因此,不会使用索引,一般会出现在动态SQL中带字符串的语句将它们放在一起12.'!='不会使用索引;13.改进GROUPBY;14.避免KE参数使用LI通配符,LIKE'4YE%'使用索引,但LIKE'%YE'不使用索引;15.避免使用困难的正则表达式,例如如Select*fromcustomerwherezipcodelike如“98__”,即使索引是在zip上创建的,这里这种情况下仍然采用顺序扫描。
如果将语句改为指定*fromcustomerwherezipcode>"98000",则执行查询时将使用查询的索引,这显然会大大提高速度16.尽量清晰地完成SQL语句,使数据库工作如下。
尽可能少,尽可能多。
例如,在编写SELECT语句时,需要显式指明查询字段的表名。
尽量不要使用SELECT*语句。
在组织SQL语句时,尽量按照数据库习惯来组织。