首页
技术小册
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的广阔世界中,`NULL`是一个既特殊又复杂的概念,它代表了“未知”或“无值”的状态。在处理数据库查询时,`NULL`的存在常常给逻辑判断和数据操作带来挑战,尤其是在进行真值(即逻辑上的真或假)判断时。本章节将深入探讨在SQL中遇到`NULL`值时,真值判断的行为模式、常见陷阱以及如何有效处理这些场景。 #### 一、`NULL`的基本性质 首先,我们需要明确`NULL`的几个基本性质: 1. **未知性**:`NULL`表示未知或未定义的值,不是空字符串('')或数字0。 2. **非比较性**:任何与`NULL`的比较操作都会返回`NULL`,而不是`TRUE`或`FALSE`。例如,`NULL = NULL`的结果不是`TRUE`,而是`NULL`。 3. **逻辑运算的特殊性**:在逻辑运算中,`NULL`的参与会直接影响结果的判定。例如,在`AND`、`OR`和`NOT`运算中,`NULL`的存在可能导致整个表达式的结果也为`NULL`。 #### 二、`NULL`与真值判断 在SQL中,真值判断通常涉及条件表达式,如`WHERE`子句中的条件。然而,当条件表达式中包含`NULL`时,真值的判断就变得复杂起来。 ##### 2.1 等于(`=`)与不等于(`<>` 或 `!=`) - **等于(`=`)**:如前所述,`NULL = NULL`的结果是`NULL`,而不是`TRUE`。这意味着,在SQL中,你不能通过简单的等于操作来检测`NULL`值。 - **不等于(`<>` 或 `!=`)**:同样地,`NULL <> NULL`的结果也是`NULL`。这导致无法直接通过不等于操作来排除`NULL`值。 ##### 2.2 IS NULL 与 IS NOT NULL 为了处理`NULL`值的判断,SQL提供了`IS NULL`和`IS NOT NULL`这两个特殊的操作符。 - **`IS NULL`**:用于检测字段是否为`NULL`。如果字段是`NULL`,则表达式为真(`TRUE`)。 - **`IS NOT NULL`**:与`IS NULL`相反,用于检测字段是否不为`NULL`。 ```sql SELECT * FROM employees WHERE salary IS NULL; -- 选择salary为NULL的员工 SELECT * FROM employees WHERE salary IS NOT NULL; -- 选择salary不为NULL的员工 ``` ##### 2.3 逻辑运算符与`NULL` 在涉及`NULL`的逻辑运算中,`AND`、`OR`和`NOT`的行为需要特别注意。 - **`AND`**:如果任何一个操作数为`NULL`,则整个表达式的结果为`NULL`。例如,`NULL AND TRUE`的结果是`NULL`。 - **`OR`**:只有当两个操作数都为`NULL`时,`OR`表达式的结果才是`NULL`。否则,如果任一操作数为`TRUE`(或另一操作数为非`NULL`的假值),则结果为`TRUE`。例如,`NULL OR TRUE`的结果是`TRUE`。 - **`NOT`**:`NOT`操作符用于反转其操作数的真值。对于`NULL`,`NOT NULL`的结果仍然是`NULL`,因为`NULL`不是真值也不是假值。 #### 三、处理含有`NULL`的逻辑表达式 在实际应用中,经常需要编写能够正确处理`NULL`的逻辑表达式。以下是一些策略和技巧: ##### 3.1 使用`CASE`语句 `CASE`语句提供了一种灵活的方式来处理包含`NULL`的逻辑。通过明确检查`NULL`值,并为其指定一个具体的处理逻辑,可以避免意外的`NULL`结果。 ```sql SELECT name, CASE WHEN salary IS NULL THEN 'Unknown' WHEN salary < 30000 THEN 'Low' WHEN salary BETWEEN 30000 AND 70000 THEN 'Medium' ELSE 'High' END AS salary_level FROM employees; ``` ##### 3.2 使用`COALESCE`函数 `COALESCE`函数接受多个参数,并返回第一个非`NULL`的参数。这可以用于在逻辑表达式中替换`NULL`值,以便进行进一步的处理。 ```sql SELECT name, CASE WHEN COALESCE(salary, 0) < 30000 THEN 'Low' WHEN COALESCE(salary, 0) BETWEEN 30000 AND 70000 THEN 'Medium' ELSE 'High' END AS salary_level FROM employees; ``` 在这个例子中,如果`salary`是`NULL`,`COALESCE`会将其视为0,从而允许逻辑表达式继续执行而不会因`NULL`而中断。 ##### 3.3 谨慎使用聚合函数 聚合函数(如`COUNT`、`SUM`、`AVG`等)在处理包含`NULL`的数据时,其行为各不相同。例如,`COUNT(*)`会计算所有行,而`COUNT(column_name)`则只计算该列中非`NULL`值的数量。了解这些差异对于编写准确的查询至关重要。 #### 四、结论 在SQL中,`NULL`的存在给真值判断带来了独特的挑战。通过理解`NULL`的基本性质、掌握与`NULL`相关的逻辑运算符的行为,以及运用`CASE`语句、`COALESCE`函数等技巧,我们可以有效地处理包含`NULL`的逻辑表达式,从而编写出既准确又高效的SQL查询。记住,在涉及`NULL`的逻辑运算中,始终保持警惕,并明确你的数据集中哪些字段可能包含`NULL`值,这将有助于你避免常见的陷阱,并编写出更加健壮的SQL代码。
上一篇:
逻辑运算符和真值
下一篇:
第3章 聚合与排序
该分类下的相关小册推荐:
SQL基础教程(下)
高性能的Postgres SQL
SQL基础教程(中)
PostgreSQL入门教程