AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 8504
Accepted
Richard
Richard
Asked: 2011-11-29 14:48:18 +0800 CST2011-11-29 14:48:18 +0800 CST 2011-11-29 14:48:18 +0800 CST

为什么 NULL 首先排序?

  • 772

为什么当我们在一列中有一个NULL值并且我们按值升序排序时,NULL首先排序?

select 1 as test
union all
select 2
union all
select NULL
union all
select 3
union all
select 4
order by test

结果是

NULL
1
2
3
4

我一直认为 NULL 意味着“不确定”或可能的“未知”。如果这是真的,他们不会排在最后吗,因为该值可能大于所有其他值?(或者这是某个地方的排序选项?)

我在 SQL Server 2008R2 上,但我怀疑这在所有 SQL Server 中都是如此,并且可能在所有 RDBMS 中都是如此。

sql-server database-theory
  • 4 4 个回答
  • 26948 Views

4 个回答

  • Voted
  1. Best Answer
    Mark Storey-Smith
    2011-11-29T15:18:03+08:002011-11-29T15:18:03+08:00

    BOL : NULL 值表示该值未知。NULL 值不同于空值或零值。没有两个空值是相等的。两个空值之间或 NULL 与任何其他值之间的比较返回未知,因为每个 NULL 的值都是未知的。

    NULL 表示未知。没有其他解释是有效的。

    如果这是真的,他们不会排在最后吗,因为该值可能大于所有其他值?

    不可能。_ 没有潜在价值。未知就是未知。

    至于为什么它出现在第一个而不是最后一个,这不是已发布的 SQL 标准所满足的,不幸的是由 RDBMS 供应商自行决定:

    Wikipedia:SQL 标准没有明确定义 Null 的默认排序顺序。相反,在符合标准的系统上,可以分别使用 ORDER BY 列表的 NULLS FIRST 或 NULLS LAST 子句将 Null 排序在所有数据值之前或之后。然而,并非所有 DBMS 供应商都实现了此功能。未实现此功能的供应商可能会为 DBMS 中的 Null 排序指定不同的处理方式。

    • 20
  2. ypercubeᵀᴹ
    2011-11-29T15:02:28+08:002011-11-29T15:02:28+08:00

    你是对的,NULL可能意味着“不确定”或“未知”或“未知”或“未申请”。但是没有理由将 Nulls 放在首位或放在最后。如果我们不知道实际值,那么 tehy 可能很小也可能很大。

    我认为在排序过程中确定 Null 所需行为的标准是:

    ORDER BY 
        test NULLS LAST                      --- or NULLS FIRST for the opposite
    

    不幸的是,SQL-Server 还没有采用这种语法。如果我没记错的话,PostgreSQL 和 Oracle 都有。

    一种解决方案:

    ORDER BY 
         CASE WHEN test IS NOT NULL 
                THEN 0 
              ELSE 1 
         END 
       , test
    

    另一种需要根据数据类型进行调整的解决方案 - 但不会很好地执行,因为它不能在 上使用索引(test):

    ORDER BY 
        COALESCE(test, 2147483647)               --- if it's a 4-byte signed integer
    
    • 6
  3. Simon Righarts
    2011-11-29T15:20:07+08:002011-11-29T15:20:07+08:00

    我不知道为什么要这样做,但根据定义,NULLS 不能与非 NULLS 进行比较,因此它们要么必须在开始或结束时进行(马克的回答对此进行了更详细的介绍)。

    要获得您想要的行为 - 据我所知,没有排序选项可以将空值放在最后,因此您必须使用计算列强制它们最后放置。CASE WHEN ...但是,在 SQL Server 中,当您的数据包含集合运算符 ( ) 时,您不能按计算列 ( ) 进行排序UNION ALL。所以:

    CREATE TABLE #sorttest(test int)
    INSERT INTO #sorttest values(1)
    INSERT INTO #sorttest values(5)
    INSERT INTO #sorttest values(4)
    INSERT INTO #sorttest values(NULL)
    INSERT INTO #sorttest values(3)
    INSERT INTO #sorttest values(2)
    SELECT test
    FROM #sorttest
    ORDER BY CASE WHEN test IS NULL THEN 1 ELSE 0 END, test
    
    DROP TABLE #sorttest
    

    最后将用于对空值进行排序。如果您必须使用UNION(或EXCEPT或INTERSECTS)来生成数据集,则将数据转储到上述临时表中。

    • 4
  4. Luca
    2016-04-08T01:10:05+08:002016-04-08T01:10:05+08:00

    如果您正在处理数字,您也可以使用

    ORDER BY -test DESC
    

    NULL是可能的最低值,因此DESC将它们放在最后。同时,非空值的符号倒置,因此DESC实际上是ASC真实值。这应该比CASE我想查询优化器也可以在test列上使用索引更快。

    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve