首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第1章 数据库和SQL
1-1 数据库是什么
我们身边的数据库
为什么DBMS那么重要
DBMS的种类
1-2 数据库的结构
RDBMS的常见系统结构
表的结构
1-3 SQL概要
标准SQL
SQL语句及其种类
SQL的基本书写规则
1-4 表的创建
表的内容的创建
数据库的创建(CREATE DATABASE语句)
表的创建(CREATE TABLE语句)
命名规则
数据类型的指定
约束的设置
1-5 表的删除和更新
表的删除(DROP TABLE语句)
表定义的更新(ALTER TABLE语句)
向Product表中插入数据
第2章 查询基础
2-1 SELECT语句基础
列的查询
查询出表中所有的列
为列设定别名
常数的查询
从结果中删除重复行
根据WHERE语句来选择记录
注释的书写方法
算术运算符
需要注意NULL
比较运算符
对字符串使用不等号时的注意事项
不能对NULL使用比较运算符
2-3 逻辑运算符
NOT运算符
AND运算符和OR运算符
通过括号强化处理
逻辑运算符和真值
含有NULL时的真值
第3章 聚合与排序
3-1 对表进行聚合查询
聚合函数
计算表中数据的行数
计算NULL之外的数据的行数
计算合计值
计算平均值
计算值和小值
使用聚合函数删除重复值(关键字DISTINCT)
3-2 对表进行分组
GROUP BY子句
聚合键中包含NULL的情况
使用WHERE子句时GROUP BY的执行结果
与聚合函数和GROUP BY子句有关的常见错误
3-3 为聚合结果指定条件
HAVING子句
HAVING子句的构成要素
相对于HAVING子句,更适合写在WHERE子句中的条件
3-4 对查询结果进行排序
ORDER BY子句
指定升序或降序
指定多个排序键
NULL的顺序
在排序键中使用显示用的别名
ORDER BY子句中可以使用的列
不要使用列编号
当前位置:
首页>>
技术小册>>
SQL基础教程(上)
小册名称:SQL基础教程(上)
### 章节标题:NULL的顺序 在SQL(Structured Query Language)的世界里,`NULL` 是一个特殊的值,它表示“无值”或“未知”的状态。尽管 `NULL` 在数据库中无处不在,其处理方式却常常让初学者感到困惑,尤其是在涉及到排序(Ordering)、比较(Comparison)和逻辑运算时。本章节将深入探讨 `NULL` 在排序中的行为,包括其在不同数据库系统(如MySQL、PostgreSQL、SQL Server等)中的具体表现,以及如何通过SQL语句优雅地处理 `NULL` 的排序顺序。 #### 一、`NULL` 的基本概念 在SQL中,`NULL` 不是一个值,而是一种特殊的标记,用于表示缺失或未知的数据。由于它不是具体的值,因此不能与其他任何值(包括 `NULL` 自身)进行直接的比较操作。这种特性导致了在处理包含 `NULL` 值的查询时,需要特别注意其逻辑和行为。 #### 二、`NULL` 在排序中的行为 在大多数数据库系统中,当对包含 `NULL` 的列进行排序时,`NULL` 的排序顺序并不是固定不变的,而是可以通过SQL语句中的 `ORDER BY` 子句中的特定选项来控制。这些选项允许你指定是将 `NULL` 值视为比所有值都大、比所有值都小,还是将它们置于排序结果的开头或结尾。 ##### 2.1 默认行为 - **MySQL 和 PostgreSQL**:默认情况下,当使用 `ORDER BY` 对某列进行排序时,`NULL` 值会被视为比任何非 `NULL` 值都大,因此它们会出现在排序结果的末尾(升序排序时)或开头(降序排序时)。 - **SQL Server**:在SQL Server中,`NULL` 的排序行为也类似,但在某些版本的SQL Server中,可以通过特定的设置或函数来改变这一行为。 ##### 2.2 使用 `IS NULL` 和 `IS NOT NULL` 进行排序控制 如果你希望将 `NULL` 值明确地置于排序结果的开头或结尾,可以使用 `CASE` 表达式结合 `IS NULL` 和 `IS NOT NULL` 条件来实现更精细的控制。例如: ```sql SELECT column_name FROM table_name ORDER BY CASE WHEN column_name IS NULL THEN 1 ELSE 0 END, column_name; ``` 上述查询将首先把所有 `NULL` 值置于结果集的开头(因为 `CASE` 表达式中 `NULL` 被赋予了较小的值1,而非 `NULL` 值被赋予了较大的值0),然后按照 `column_name` 的值进行升序排序。 ##### 2.3 使用数据库特定的函数或选项 - **PostgreSQL**:在PostgreSQL中,可以使用 `NULLS FIRST` 和 `NULLS LAST` 选项直接在 `ORDER BY` 子句中指定 `NULL` 的排序位置。 ```sql -- 将NULL值置于排序结果的开头 SELECT column_name FROM table_name ORDER BY column_name ASC NULLS FIRST; -- 将NULL值置于排序结果的末尾 SELECT column_name FROM table_name ORDER BY column_name ASC NULLS LAST; ``` - **SQL Server**:虽然SQL Server没有直接的 `NULLS FIRST` 或 `NULLS LAST` 选项,但可以通过类似的 `CASE` 表达式或利用 `ISNULL` 函数结合一个默认值来间接实现。 - **MySQL**:MySQL在8.0之前的版本中不直接支持 `NULLS FIRST` 或 `NULLS LAST`,但在8.0及更高版本中,也加入了这些选项,使得处理 `NULL` 排序更加灵活。 #### 三、`NULL` 排序的应用场景 理解 `NULL` 在排序中的行为对于数据分析和报表生成至关重要。例如,在处理用户数据时,某些字段(如用户的生日、加入日期等)可能为 `NULL`,表示这些信息尚未被提供或未知。在生成用户列表时,根据这些字段排序时如何处理 `NULL` 值,将直接影响到最终结果的呈现方式。 - **用户列表排序**:如果希望将未提供生日的用户置于列表的末尾,可以使用 `NULLS LAST` 选项。 - **性能考虑**:虽然 `NULL` 的排序方式可以灵活调整,但过多的 `CASE` 表达式或复杂的排序逻辑可能会影响查询性能。在设计查询时,应权衡排序需求与查询效率。 #### 四、结论 `NULL` 在SQL中的排序行为是一个既复杂又灵活的话题。不同的数据库系统提供了不同的方法和选项来控制 `NULL` 的排序顺序。通过掌握这些方法和技巧,可以更加精确地控制数据的呈现方式,满足不同的业务需求。无论是利用数据库特定的函数选项,还是通过 `CASE` 表达式等SQL语句实现,重要的是理解 `NULL` 的本质和其在排序中的行为规律,从而编写出既高效又符合业务逻辑的SQL查询。 在本章节中,我们详细介绍了 `NULL` 在排序中的基本概念、行为特征以及如何通过SQL语句来控制其排序顺序。希望这些内容能帮助读者更好地理解和应用SQL中的 `NULL` 排序机制,为数据分析和处理提供有力支持。
上一篇:
指定多个排序键
下一篇:
在排序键中使用显示用的别名
该分类下的相关小册推荐:
高性能的Postgres SQL
PostgreSQL入门教程
SQL基础教程(中)
SQL基础教程(下)