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

33次阅读

答案是使用='language-default'>='language-default'>IS ='language-default'>='language-default'>NULL='language-default'>='language-default'>IS NOT ='language-default'>='language-default'>NULL操作符及='language-default'>='language-default'>COALESCE等函数处理='language-default'>='language-default'>NULL值。因为='language-default'>='language-default'>NULL代表未知,与任何值比较结果均为='language-default'>='language-default'>='language-default'>UNKNOWN,故='language-default'>='language-default'>WHERE子句中需用='language-default'>='language-default'>IS ='language-default'>='language-default'>NULL/='language-default'>='language-default'>IS NOT ='language-default'>='language-default'>NULL判断;JOIN='language-default'>='language-default'>NULL无法匹配,可用LEFT JOIN结合='language-default'>='language-default'>COALESCE处理;聚合函数自动忽略='language-default'>='language-default'>NULL='language-default'>COUNT(*)包含='language-default'>='language-default'>NULL行;排序时='language-default'>='language-default'>NULL位置因数据库而异,应使用='language-default'>='language-default'>NULLS FIRST/LAST明确指定。

='language-default'>="https://img.php.cn/upload/article/001/242/473/175851306211196.jpeg" alt='language-default'>="SQL 如何处理 ='language-default'>='language-default'>NULL 值的查询问题?">

SQL处理='language-default'>='language-default'>NULL值查询的核心,在于理解='language-default'>='language-default'>NULL并非零、空字符串或任何具体的值,它代表的是“未知”或“不存在”。正是这种不确定性,导致我们在使用常规的等式(

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>=

)或不等式(

='language-default'>="position:relative; padding:0px; margin:0px;">

!='language-default'>=

,

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'><>

)进行比较时,='language-default'>='language-default'>NULL值会表现出一种“隐形”的行为,即任何与='language-default'>='language-default'>NULL进行的比较操作,结果都会是

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>='language-default'>UNKNOWN

,而不是

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>TRUE

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>FALSE

。因此,要正确查询或筛选包含='language-default'>='language-default'>NULL值的数据,我们必须使用专门的

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>IS ='language-default'>='language-default'>NULL

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>IS NOT ='language-default'>='language-default'>NULL

操作符,或者借助一些函数来转换或替代='language-default'>='language-default'>NULL值,才能让查询逻辑如我们所愿地工作。

解决方案

处理SQL中的='language-default'>='language-default'>NULL值查询,首先要抛开我们日常编程中对“等于”的直观理解。在我看来,='language-default'>='language-default'>NULL的这种特殊性是SQL设计哲学的一个体现,它迫使我们更严谨地思考数据的完整性和未知状态。

最直接也是最基础的方法,就是使用

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>IS ='language-default'>='language-default'>NULL

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>IS NOT ='language-default'>='language-default'>NULL

。例如,如果你想找出所有

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>email

字段为空的客户,你不能写

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>WHERE ='language-default'>='language-default'>email ='language-default'>= ='language-default'>='language-default'>NULL

,这几乎总是会返回空结果集,因为

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL ='language-default'>= ='language-default'>='language-default'>NULL

的结果也是

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>='language-default'>UNKNOWN

。正确的做法是

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>WHERE ='language-default'>='language-default'>email ='language-default'>='language-default'>IS ='language-default'>='language-default'>NULL

。反之,要查找所有

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>email

不为空的客户,则是

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>WHERE ='language-default'>='language-default'>email ='language-default'>='language-default'>IS NOT ='language-default'>='language-default'>NULL

。这种明确的指定,避免了与

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>='language-default'>UNKNOWN

结果的纠缠。

再进一步,当我们需要在查询结果中把='language-default'>='language-default'>NULL值替换成一个有意义的默认值时,

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>COALESCE

函数就显得非常有用。

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>COALESCE(='language-default'>='language-default'>expr1, ='language-default'>expr2, ..., exprN)

会返回其参数列表中第一个非='language-default'>='language-default'>NULL的表达式。这在报表生成或数据展示时尤为重要。比如,一个用户可能没有填写

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>phone_number

,我们希望显示为“未提供”,那么

='language-default'>="position:relative; padding:0px; margin:0px;">

SELECT ='language-default'>='language-default'>COALESCE(='language-default'>phone_number, '未提供') AS contact_info FROM users;

就能实现。类似的函数还有

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>IF='language-default'>='language-default'>NULL

(MySQL)、

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>NVL

(Oracle)等,它们通常只接受两个参数,但核心思想一致。

在进行数据聚合时,='language-default'>='language-default'>NULL值的处理也值得深思。大多数聚合函数(如

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>SUM()

,

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>AVG()

,

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>COUNT()

,

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>MAX()

,

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>MIN()

)在计算时会默认忽略='language-default'>='language-default'>NULL值。这通常是符合预期的,因为我们通常不希望“未知”的值影响到平均值或总和。但如果你确实想把='language-default'>='language-default'>NULL值计入,例如在计算平均值时把='language-default'>='language-default'>NULL视为0,那么你需要在聚合函数内部使用

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>COALESCE

='language-default'>="position:relative; padding:0px; margin:0px;">

AVG(='language-default'>='language-default'>COALESCE(score, 0))

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>COUNT(*)

会计算所有行,包括含有='language-default'>='language-default'>NULL值的行,而

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>COUNT(='language-default'>column_name)

则只计算

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>column_name

='language-default'>='language-default'>NULL的行。

另外,

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>='language-default'>NULLIF(='language-default'>='language-default'>expr1, ='language-default'>expr2)

函数也很有趣,它在

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>expr1

等于

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>expr2

时返回='language-default'>='language-default'>NULL,否则返回

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>expr1

。这在处理一些特殊数据清洗场景时,可以将某些特定值(例如,用0表示“无数据”但又不想它参与计算)转换为='language-default'>='language-default'>NULL,从而利用聚合函数忽略='language-default'>='language-default'>NULL的特性。

理解这些基本操作和函数,是有效处理SQL中='language-default'>='language-default'>NULL值的关键。它不仅仅是语法上的要求,更是一种数据思维上的转变。

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值在

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>WHERE

子句中的“隐形”行为解析

当我们谈论

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>WHERE

子句中的

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值时,我总觉得它像一个“隐形人”,你不能直接指着它说“你就是我想要找的那个”,因为一旦你尝试用

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>=

='language-default'>="position:relative; padding:0px; margin:0px;">

!='language-default'>=

去指认它,它就会变得“不可比较”。这种行为,说实话,一开始确实让人摸不着头脑,甚至会犯错。

核心在于SQL的三值逻辑(

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>TRUE

,

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>FALSE

,

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>='language-default'>UNKNOWN

)。任何与

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

的比较,无论是

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL ='language-default'>= 1

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL !='language-default'>= 1

,甚至

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL ='language-default'>= ='language-default'>='language-default'>NULL

,其结果都不是

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>TRUE

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>FALSE

,而是

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>='language-default'>UNKNOWN

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>WHERE

子句只返回那些评估结果为

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>TRUE

的行。这意味着,如果你的条件最终评估为

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>='language-default'>UNKNOWN

,那么对应的行就不会被包含在结果集中。

举个例子,假设你有一个

='language-default'>="position:relative; padding:0px; margin:0px;">

products

表,其中

='language-default'>="position:relative; padding:0px; margin:0px;">

discount_percentage

字段可能为

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

。 如果你写:

='language-default'>="position:relative; padding:0px; margin:0px;">

SELECT * FROM products ='language-default'>='language-default'>WHERE discount_percentage ='language-default'>= 0;

,这会返回所有折扣百分比明确为0的产品。 如果你写:

='language-default'>="position:relative; padding:0px; margin:0px;">

SELECT * FROM products ='language-default'>='language-default'>WHERE discount_percentage !='language-default'>= 0;

,这会返回所有折扣百分比明确不为0(例如10%, 20%)的产品。 但如果你想找出所有没有折扣的产品,包括那些

='language-default'>="position:relative; padding:0px; margin:0px;">

discount_percentage

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

(未知是否有折扣)和

='language-default'>="position:relative; padding:0px; margin:0px;">

discount_percentage

='language-default'>="position:relative; padding:0px; margin:0px;">

0

(明确无折扣)的产品,那么

='language-default'>="position:relative; padding:0px; margin:0px;">

discount_percentage ='language-default'>= 0 OR discount_percentage ='language-default'>='language-default'>IS ='language-default'>='language-default'>NULL

才是正确的做法。

这种“隐形”行为也延伸到了

='language-default'>="position:relative; padding:0px; margin:0px;">

NOT IN

操作符。

='language-default'>="position:relative; padding:0px; margin:0px;">

NOT IN

的内部逻辑实际上是一系列

='language-default'>="position:relative; padding:0px; margin:0px;">

AND

连接的不等式比较。如果

='language-default'>="position:relative; padding:0px; margin:0px;">

NOT IN

的列表中包含

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

,那么整个表达式的结果就可能变成

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>='language-default'>UNKNOWN

,导致查询返回空集或不完整的结果。比如,

='language-default'>="position:relative; padding:0px; margin:0px;">

SELECT * FROM users ='language-default'>='language-default'>WHERE user_id NOT IN (SELECT blocked_user_id FROM blocked_users);

如果

='language-default'>="position:relative; padding:0px; margin:0px;">

blocked_users

表中

='language-default'>="position:relative; padding:0px; margin:0px;">

blocked_user_id

字段有

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值,那么这个查询可能会出现非预期的结果。为了安全起见,通常需要确保

='language-default'>="position:relative; padding:0px; margin:0px;">

NOT IN

子查询的结果集中不包含

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值,例如通过

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>WHERE blocked_user_id ='language-default'>='language-default'>IS NOT ='language-default'>='language-default'>NULL

来过滤。

理解这种

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>='language-default'>UNKNOWN

的传递性,是避免

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>WHERE

子句中

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值陷阱的关键。它要求我们对数据状态有更清晰的认识,并用

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>IS ='language-default'>='language-default'>NULL

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>IS NOT ='language-default'>='language-default'>NULL

或适当的函数来明确表达我们的意图。

如何巧妙地在

='language-default'>="position:relative; padding:0px; margin:0px;">

JOIN

操作中驾驭

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

='language-default'>="position:relative; padding:0px; margin:0px;">

JOIN

操作中处理

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值,这可真是个让人头疼又充满挑战的场景。我个人觉得,这里面的“坑”比

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>WHERE

子句还要隐蔽一些,因为它常常涉及到两个表之间的数据关联逻辑。

首先要明确的是,

='language-default'>="position:relative; padding:0px; margin:0px;">

JOIN

条件中的

='language-default'>="position:relative; padding:0px; margin:0px;">

ON

子句也遵循SQL的三值逻辑。这意味着,如果你的

='language-default'>="position:relative; padding:0px; margin:0px;">

JOIN

条件是

='language-default'>="position:relative; padding:0px; margin:0px;">

table1.column_a ='language-default'>= table2.column_b

,并且

='language-default'>="position:relative; padding:0px; margin:0px;">

column_a

='language-default'>="position:relative; padding:0px; margin:0px;">

column_b

(或两者)为

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

,那么这个比较的结果就是

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>='language-default'>UNKNOWN

。对于

='language-default'>="position:relative; padding:0px; margin:0px;">

INNER JOIN

,只有当

='language-default'>="position:relative; padding:0px; margin:0px;">

ON

条件评估为

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>TRUE

时,行才会被匹配。因此,含有

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值的行永远不会通过常规的等式

='language-default'>="position:relative; padding:0px; margin:0px;">

JOIN

条件被

='language-default'>="position:relative; padding:0px; margin:0px;">

INNER JOIN

匹配。

='language-default'>="https://phps.yycxw.com/ai/%E7%AE%80%E7%AF%87ai%E6%8E%92%E7%89%88">='language-default'>="https://img.php.cn/upload/ai_manual/000/000/000/175680265669916.png" alt='language-default'>="SQL 如何处理 ='language-default'>='language-default'>NULL 值的查询问题?">

='language-default'>="https://phps.yycxw.com/ai/%E7%AE%80%E7%AF%87ai%E6%8E%92%E7%89%88">简篇AI排版

AI排版工具,上传图文素材,秒出专业效果!

='language-default'>="https://phps.yycxw.com/static/images/card_xiazai.png" alt='language-default'>="SQL 如何处理 ='language-default'>='language-default'>NULL 值的查询问题?">200

='language-default'>="https://phps.yycxw.com/ai/%E7%AE%80%E7%AF%87ai%E6%8E%92%E7%89%88"> 查看详情 ='language-default'>="https://phps.yycxw.com/static/images/cardxiayige-3.png" alt='language-default'>="SQL 如何处理 ='language-default'>='language-default'>NULL 值的查询问题?">

举个例子,假设我们有两个表:

='language-default'>="position:relative; padding:0px; margin:0px;">

employees

='language-default'>="position:relative; padding:0px; margin:0px;">

employee_id

,

='language-default'>="position:relative; padding:0px; margin:0px;">

manager_id

)和

='language-default'>="position:relative; padding:0px; margin:0px;">

managers

='language-default'>="position:relative; padding:0px; margin:0px;">

manager_id

,

='language-default'>="position:relative; padding:0px; margin:0px;">

manager_name

)。如果某个员工的

='language-default'>="position:relative; padding:0px; margin:0px;">

manager_id

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

(表示他没有直接经理或者他是最高层),那么

='language-default'>="position:relative; padding:0px; margin:0px;">

INNER JOIN employees ON employees.manager_id ='language-default'>= managers.manager_id

将不会把这个员工匹配到任何经理,这是符合预期的。

但如果我们的业务逻辑要求将那些

='language-default'>="position:relative; padding:0px; margin:0px;">

manager_id

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

的员工也包含进来,并且我们想为他们显示一个特定的状态(比如“顶层员工”),这时候

='language-default'>="position:relative; padding:0px; margin:0px;">

LEFT JOIN

就派上用场了。

='language-default'>="position:relative; padding:0px; margin:0px;">

LEFT JOIN

会返回左表中的所有行,即使右表中没有匹配的行。对于那些没有匹配的行,右表对应的列将显示为

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

。然后,我们就可以利用

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>COALESCE

等函数在

='language-default'>="position:relative; padding:0px; margin:0px;">

SELECT

列表中处理这些

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值。

='language-default'>="position:relative; padding:0px; margin:0px;">

SELECT e.employee_id, e.manager_id, ='language-default'>='language-default'>COALESCE(m.manager_name, '顶层员工') AS manager_name_display FROM employees e LEFT JOIN managers m ON e.manager_id ='language-default'>= m.manager_id;

这里有个更复杂但很有用的技巧:如果你想在

='language-default'>="position:relative; padding:0px; margin:0px;">

JOIN

条件中将

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值也视为“相等”来匹配,例如,两个字段都为

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

时,你也认为它们是匹配的。常规的

='language-default'>="position:relative; padding:0px; margin:0px;">

ON table1.col ='language-default'>= table2.col

是做不到的。这时候,你可以使用

='language-default'>="position:relative; padding:0px; margin:0px;">

IS NOT DISTINCT FROM

(SQL标准,但并非所有数据库都支持,例如MySQL就不支持)或者更通用的

='language-default'>="position:relative; padding:0px; margin:0px;">

OR

条件:

='language-default'>="position:relative; padding:0px; margin:0px;">

SELECT * FROM table1 t1 JOIN table2 t2 ON (t1.col ='language-default'>= t2.col OR (t1.col ='language-default'>='language-default'>IS ='language-default'>='language-default'>NULL AND t2.col ='language-default'>='language-default'>IS ='language-default'>='language-default'>NULL));

这种写法虽然稍微冗长,但它明确地处理了

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

的匹配情况,确保了即使在

='language-default'>="position:relative; padding:0px; margin:0px;">

JOIN

中,

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值也能按照特定的业务逻辑进行关联。在我看来,这正是SQL灵活性和强大之处的体现,它允许我们精确控制数据行为。

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值对 SQL 聚合函数与排序结果的深远影响

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值在聚合函数和排序操作中的行为,是我在数据分析中经常需要注意的地方。它不像简单的筛选那么直接,而是对最终的统计结果和数据呈现顺序有着微妙但深远的影响。

正如前面提到的,大多数聚合函数(

='language-default'>="position:relative; padding:0px; margin:0px;">

SUM

,

='language-default'>="position:relative; padding:0px; margin:0px;">

AVG

,

='language-default'>="position:relative; padding:0px; margin:0px;">

MAX

,

='language-default'>="position:relative; padding:0px; margin:0px;">

MIN

,

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>COUNT(='language-default'>column_name)

)在计算时会默认“跳过”

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值。这通常是符合我们直觉的,因为一个“未知”的数值不应该参与到求和或平均值的计算中去,否则会歪曲真实的数据趋势。比如,如果你有一个

='language-default'>="position:relative; padding:0px; margin:0px;">

sales

表,

='language-default'>="position:relative; padding:0px; margin:0px;">

amount

字段可能为

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

(表示这笔交易金额未知或未完成),那么

='language-default'>="position:relative; padding:0px; margin:0px;">

SUM(amount)

只会计算那些有明确金额的交易,这通常是我们想要的。如果想把

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

当成0来计算总和,那就得用

='language-default'>="position:relative; padding:0px; margin:0px;">

SUM(='language-default'>='language-default'>COALESCE(amount, 0))

。这种细微的差别,在做财务或绩效报表时,如果处理不当,可能会导致完全错误的结论。

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>COUNT(*)

='language-default'>="position:relative; padding:0px; margin:0px;">

COUNT(1)

则是一个例外,它们会计算所有行的数量,包括那些包含

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值的行。而

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>COUNT(='language-default'>column_name)

则只会计算

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>column_name

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

的行。理解这三者的区别,对于准确统计数据至关重要。

再来说说排序 (

='language-default'>="position:relative; padding:0px; margin:0px;">

ORDER BY

)。

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值在排序时的位置,不同数据库系统有不同的默认行为,这有时候会让人感到困惑。

  • MySQL: 默认情况下,
    ='language-default'>="position:relative; padding:0px; margin:0px;">

    ='language-default'>='language-default'>NULL

    值在升序 (

    ='language-default'>="position:relative; padding:0px; margin:0px;">

    ASC

    ) 排序时排在最前面,降序 (

    ='language-default'>="position:relative; padding:0px; margin:0px;">

    DESC

    ) 排序时排在最后面。

  • PostgreSQL: 默认情况下,
    ='language-default'>="position:relative; padding:0px; margin:0px;">

    ='language-default'>='language-default'>NULL

    值在升序 (

    ='language-default'>="position:relative; padding:0px; margin:0px;">

    ASC

    ) 排序时排在最后面,降序 (

    ='language-default'>="position:relative; padding:0px; margin:0px;">

    DESC

    ) 排序时排在最前面。

  • SQL Server / Oracle: 默认行为与PostgreSQL类似,
    ='language-default'>="position:relative; padding:0px; margin:0px;">

    ='language-default'>='language-default'>NULL

    ='language-default'>="position:relative; padding:0px; margin:0px;">

    ASC

    时靠后,

    ='language-default'>="position:relative; padding:0px; margin:0px;">

    DESC

    时靠前。

为了消除这种不确定性,并确保跨数据库系统的一致性,SQL标准提供了

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULLS FIRST

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULLS LAST

子句。 例如,

='language-default'>="position:relative; padding:0px; margin:0px;">

ORDER BY ='language-default'>column_name ASC ='language-default'>='language-default'>NULLS FIRST

会将

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值排在最前面,即使是升序。

='language-default'>="position:relative; padding:0px; margin:0px;">

ORDER BY ='language-default'>column_name DESC ='language-default'>='language-default'>NULLS LAST

会将

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值排在最后面,即使是降序。

我个人在编写需要精确排序的查询时,总是倾向于明确指定

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULLS FIRST

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULLS LAST

。这不仅仅是为了兼容性,更是为了让查询的意图清晰可见,避免因为

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值的默认排序行为而产生意外的结果。毕竟,数据分析的价值在于其准确性和可信度,而

='language-default'>="position:relative; padding:0px; margin:0px;">

='language-default'>='language-default'>NULL

值的处理正是构建这种可信度的重要一环。

='language-default'>="display: inline-flex;"> 相关标签:

='language-default'>="display:flex;"> ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/zt/15713.html" target='language-default'>="_blank">mysql ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/zt/15715.html" target='language-default'>="_blank">oracle ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/zt/17539.html" target='language-default'>="_blank">ai ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/zt/21094.html" target='language-default'>="_blank">数据清洗 ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/zt/27988.html" target='language-default'>="_blank">区别 ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/zt/51779.html" target='language-default'>="_blank">聚合函数 ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=sql" target='language-default'>="_blank">sql ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=mysql" target='language-default'>="_blank">mysql ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=='language-default'>='language-default'>NULL" target='language-default'>="_blank">='language-default'>='language-default'>NULL ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=count" target='language-default'>="_blank">count ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=select" target='language-default'>="_blank">select ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=字符串" target='language-default'>="_blank">字符串 ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=oracle" target='language-default'>="_blank">oracle ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=postgresql" target='language-default'>="_blank">postgresql ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=数据库" target='language-default'>="_blank">数据库 ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=数据分析" target='language-default'>="_blank">数据分析

大家都在看:

='language-default'>="https://phps.yycxw.com/faq/1521834.html" title='language-default'>="MySQL数据源故障怎么排查_MySQL数据源常见问题解决方法">MySQL数据源故障怎么排查_MySQL数据源常见问题解决方法 ='language-default'>="https://phps.yycxw.com/faq/1521620.html" title='language-default'>="如何监控MySQL数据源状态_MySQL数据源连接状态监控方法">如何监控MySQL数据源状态_MySQL数据源连接状态监控方法 ='language-default'>="https://phps.yycxw.com/faq/1521346.html" title='language-default'>="如何配置MySQL连接池数据源_MySQL连接池数据源设置详解">如何配置MySQL连接池数据源_MySQL连接池数据源设置详解 ='language-default'>="https://phps.yycxw.com/faq/1517191.html" title='language-default'>="如何配置MySQL多数据源_MySQL多个数据源同时连接方法">如何配置MySQL多数据源_MySQL多个数据源同时连接方法 ='language-default'>="https://phps.yycxw.com/faq/1514149.html" title='language-default'>="如何建立MySQL数据源_MySQL数据源配置详细步骤解析">如何建立MySQL数据源_MySQL数据源配置详细步骤解析

='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/zt/15713.html" target='language-default'>="_blank">mysql ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/zt/15715.html" target='language-default'>="_blank">oracle ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/zt/17539.html" target='language-default'>="_blank">ai ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/zt/21094.html" target='language-default'>="_blank">数据清洗 ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/zt/27988.html" target='language-default'>="_blank">区别 ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/zt/51779.html" target='language-default'>="_blank">聚合函数 ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=sql" target='language-default'>="_blank">sql ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=mysql" target='language-default'>="_blank">mysql ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=='language-default'>='language-default'>NULL" target='language-default'>="_blank">='language-default'>='language-default'>NULL ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=count" target='language-default'>="_blank">count ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=select" target='language-default'>="_blank">select ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=字符串" target='language-default'>="_blank">字符串 ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=oracle" target='language-default'>="_blank">oracle ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=postgresql" target='language-default'>="_blank">postgresql ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=数据库" target='language-default'>="_blank">数据库 ='language-default'>="hits_log(2,'www',this);" href-data='language-default'>="/search?word='language-default'>=数据分析" target='language-default'>="_blank">数据分析

text=ZqhQzanResources