但是忽略了一个NULL值问题
对空值 NULL 的处理
当 IN 运算符的两侧有一个为空值 NULL 时,如果找不到匹配项,则返回值为 NULL;如果找到了匹配项,则返回值为 1。
(2)NULL值在in左右两侧
请看下面的 SQL 语句如下:
mysql> SELECT NULL IN (1,3,5,'thks'),10 IN (1,3,NULL,'thks'); +------------------------+-------------------------+ | NULL IN (1,3,5,'thks') | 10 IN (1,3,NULL,'thks') | +------------------------+-------------------------+ | NULL | NULL | +------------------------+-------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> SELECT NULL IN (1,3,5,'thks'),10 IN (1,10,NULL,'thks'); +------------------------+--------------------------+ | NULL IN (1,3,5,'thks') | 10 IN (1,10,NULL,'thks') | +------------------------+--------------------------+ | NULL | 1 | +------------------------+--------------------------+ 1 row in set (0.00 sec)
(3)NULL在NOT IN 的其中一侧
NOT IN 恰好相反,当 NOT IN 运算符的两侧有一个为空值 NULL 时,如果找不到匹配项,则返回值为 NULL;如果找到了匹配项,则返回值为 0。
请看下面的 SQL 语句如下:
mysql> SELECT NULL NOT IN (1,3,5,'thks'),10 NOT IN (1,0,NULL,'thks'); +----------------------------+-----------------------------+ | NULL NOT IN (1,3,5,'thks') | 10 NOT IN (1,0,NULL,'thks') | +----------------------------+-----------------------------+ | NULL | NULL | +----------------------------+-----------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> SELECT NULL NOT IN (1,3,5,'thks'),10 NOT IN (1,10,NULL,'thks'); +----------------------------+------------------------------+ | NULL NOT IN (1,3,5,'thks') | 10 NOT IN (1,10,NULL,'thks') | +----------------------------+------------------------------+ | NULL | 0 | +----------------------------+------------------------------+ 1 row in set (0.00 sec)
根据(3)NULL在NOT IN 的其中一侧的结果,这就可以看出问题
先来查询下面SQL语句,慢慢发现问题
SELECT p_id FROM tree GROUP BY p_id
上面查询结果包含了NULL值
所以查询下面SQL语句就查不到任何东西,这是因为NOT IN返回了NULL
SELECT id FROM tree WHERE id NOT IN ( SELECT p_id FROM tree GROUP BY p_id )
所以要想查询出来结果就要先把NULL值给处理掉!好了,Bug搞定!
这题还有另外一种做法:
SELECT id,( CASE WHEN tree.p_id IS NULL THEN 'Root' WHEN tree.id IN ( SELECT p_id FROM tree GROUP BY p_id ) THEN 'Inner' ELSE 'Leaf' END )TYPE FROM tree
为什么是对的?留给大家想想吧~
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
更多Mysql内容来自木庄网络博客
标签:Mysql
相关阅读 >>
更多相关阅读请进入《mysql》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。