mysql中搜索NULL的情况2009年09月01日 星期二 13:30 今天做sql语句,出现了个问题:
使用这个sql语句:
SELECT COUNT(*)
FROM unit_detail ud
JOIN property p ON (ud.property_id = p.property_id )
JOIN language_district ld ON (ld.district_id = p.district_id AND ld.lang_id = '1' AND ld.city_id = 'Shanghai' )
LEFT OUTER JOIN district_zone dz ON (dz.plate_id = p.zone_id AND dz.lang_id = '1')
JOIN property_details pd ON (pd.property_id = p.property_id AND pd.lang_id = '1')
WHERE 1 AND ud.villa_type = '1' AND ud.catmain_id = 2 AND ud.vl_approve = 'approve' AND ud.property_tag <> 5 AND p.district_id = 'BaoShan'
去搜索后,发觉得出的结果是0;但是在去掉AND ud.property_tag <> 5后,得出的结果为49,查了下,发现去掉AND ud.property_tag <> 5后的值里,property_tag的值大部分为NULL,按照我的理解,在property_tag <> 5的情况下,这部分的值应该会出来的,可是为什么没有出来呢?后来查了下,原来是这个原因:(注意那句:’NULL值在于任何其他值甚至NULL值比较时 总是假的(FALSE)。包含NULL的一个表达式总是产生一个NULL值,除非在包含在表达式中的运算符和函数的文档中指出‘这个就是关键)
NULL值的概念是造成SQL的新手的混淆的普遍原因,他们经常认为NULL是和一个空字符串''的一样的东西。不是这样的!例如,下列语句是完全不同的:
mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ("");
两个语句把值插入到phone列,但是第一个插入一个NULL值而第二个插入一个空字符串。第一个的含义可以认为是“电话号码不知道”,而第二个则可意味着“她没有电话”。
在SQL中,NULL值在于任何其他值甚至NULL值比较时总是假的(FALSE)。包含NULL的一个表达式总是产生一个NULL值,除非在包含在表达式中的运算符和函数的文档中指出。在下列例子,所有的列返回NULL:
mysql> SELECT NULL,1+NULL,CONCAT('Invisible',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 = "";
在MySQL中,就像很多其他的SQL服务器一样,你不能索引可以有NULL值的列。你必须声明这样的列为NOT NULL,而且,你不能插入NULL到索引的列中。
当用LOAD DATA INFILE读取数据时,空列用''更新。如果你想要在一个列中有NULL值,你应该在文本文件中使用N。字面上的词'NULL'也可以在某些情形下使用。见7.16 LOAD DATA INFILE句法。
当使用ORDER BY时,首先呈现NULL值。如果你用DESC以降序排序,NULL值最后显示。当使用GROUP BY时,所有的NULL值被认为是相等的。
为了有助于NULL的处理,你能使用IS NULL和IS NOT NULL运算符和IFNULL()函数。
对某些列类型,NULL值被特殊地处理。如果你将NULL插入表的第一个TIMESTAMP列,则插入当前的日期和时间。如果你将NULL插入一个AUTO_INCREMENT列,则插入顺序中的下一个数字。
mysql中搜索NULL:等您坐沙发呢!