SQL 如何处理 NULL 值的查询问题?

这个NULL的东西真是让人头疼。
让我带您了解一些场景。

1 .在 WHERE 子句中 这是最常见的。
直接写where email=NULL吗?停下来吧,这不起作用。
为什么?因为与任何事物(包括其本身)相比,NULL 会导致 UNKNOWN。
三值逻辑非常复杂。

正确的写法有两种:
如果电子邮件为空,请检查是否为 null
如果电子邮件不为空,则排除空值
NOT IN 还有另一个陷阱。
例如: SQL SELECT FROM USERS WHERE no user_id isn't (SELECTBlocked_user_idFROMBlock_users)
如果子查询包含NULL,则整个条件变为未定义,结果立即为空。
需要添加过滤器: SQL 从用户中选择 user_id 不为空的用户(从 Block_users 中选择阻止的用户 ID,其中 Block_user_id 不为空)
2 、加盟过程中 INNER JOIN 太愚蠢了。
如果触发条件写成=,只要其中一个字段为空,结果就会未知,也就是说不会匹配到。

例如: SQL INNER JOIN 员工到员工.manager_id = 经理.manager_id
如果 manager_id 为空,则忽略所有员工。

LEFT JOIN 可以与 COALESCE 一起使用。
例如,保留所有员工,将没有经理的员工视为“顶级员工”: SQL SELECT e.employee_id, COALESCE(m.manager_name, '顶级员工') AS manager_name 员工 e 左加入经理 m ON e.manager_id = m.manager_id
NULL比NULL更有趣。
应该这样写: SQL 从表 1 中选择 t1 连接表 2 t2 ON (t1 .col = t2 .col OR (t1 .col IS NULL AND t2 .col IS NULL))
3 . 总工作岗位,伙计们 默认情况下,SUM、AVG、MAX 和 MIN 都忽略 NULL。
例如: SQL AVG(score)
如果分数为NULL,则不计入计算。

如果你想把NULL当作0,你应该这样写: SQL AVG(合并(分数, 0))
COUNT是最狡猾的人。
COUNT() 对所有行进行计数,无论是否为 NULL。
COUNT(column_name) 仅计算非空元素。
你必须注意这个区别。

NULLIF也可以播放。
例如,将 0 转换为 NULL: SQL NULLIF(value, 0)
这样0就不会参与计算了。

4 排序 数据库的默认行为也不同。
在 MySQL 升序(ASC)中,NULL 排在第一位,在降序(DESC)中,NULL 排在最后。
PostgreSQL、SQL Server 和 Oracle 则相反。

如果你真的想实现跨数据库的一致性,你必须明确定义以下内容: SQL ORDER BY 列名 ASC NULL 优先; -
NULL 排名第一 按列名 DESC NULLS LAST 排序; -
NULL 出现终于
一般来说,NULL 表示“未知”。
必须使用 ISNULL/ISNOTNULL、COALESCE 或 NULLIF 对其进行处理。
需要注意的主要景点:
不要在 WHERE 子句中直接比较 NULL
用于 JOIN 操作的 LEFT JOIN+COALESCE
聚合函数可以判断是计算所有行还是仅计算非空行。

排序时必须指定NULLSFIRST/LAST。

除非你真正了解NULL,否则SQL查询不可能准确。

sqlserver中为什么出现null

说白了,SQL Server 中的 null 值与“不知道”同义,与 0 或空字符串完全不同。
比如去年的电商项目中,如果user表中的address字段没有填写的话,就会为null,换成0也没有用。
还有一点就是ISNULL函数确实可以解决问题,但是我们去年运行的时候发现,当字段是varchar类型的时候,它换成了数字,就会报错。
说实话,这很令人不安。
很多人不注意这一点。
起初我以为不存在空字符串这样的东西,但后来我意识到我完全错了。
no 表示该类型的所有信息都变得未知。
建议,定期使用ISNULL时,最好检查第一个字段类型,避免报错。
等等,还有一件事,如果替换值本身不包含任何值,则该函数肯定会使用COCO。