首页
技术小册
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之外的数据的行数 在数据库管理和数据分析的广阔领域中,处理NULL值是一个常见且重要的任务。NULL在SQL中代表“未知”或“缺失”的值,它在数据查询、分析和统计时可能引发一系列问题,尤其是在需要精确计算非空(即非NULL)记录数时。本章将深入探讨如何在SQL中有效地计算NULL之外的数据行数,包括使用基础SQL函数、条件表达式以及聚合函数等方法。 #### 引言 在数据库表中,字段可能包含NULL值,这些值在统计或分析数据时往往需要被排除在外。例如,假设你正在管理一个员工表,其中包含员工的姓名、部门ID和工资信息。如果某些员工的工资信息尚未录入(即该字段为NULL),在统计平均工资或总工资时,这些NULL值就不应被计入总数中。同样,在需要计算特定条件下的有效记录数时,排除NULL值也是必要的。 #### 使用`COUNT`函数的基本方法 SQL中的`COUNT`函数是计算行数的常用工具,但默认情况下,`COUNT(*)`会计算包括所有NULL值在内的所有行。为了仅计算非NULL值的行数,应使用`COUNT(column_name)`的形式,其中`column_name`是你希望计数的非NULL列名。 **示例**: 假设有一个名为`employees`的表,其中包含`id`(员工ID)、`name`(员工姓名)、`department_id`(部门ID)和`salary`(工资)等字段。要计算工资非NULL的员工数量,可以使用以下SQL查询: ```sql SELECT COUNT(salary) AS non_null_salary_count FROM employees; ``` 这条查询会返回`salary`字段非NULL的行数。 #### 使用`WHERE`子句排除NULL值 虽然直接使用`COUNT(column_name)`可以方便地计算非NULL值的行数,但在某些情况下,你可能需要结合使用`WHERE`子句来基于多个条件筛选记录。此时,虽然`WHERE`子句本身并不直接“计算”行数,但它可以确保只有满足特定条件的记录(包括非NULL值)被纳入`COUNT`函数的统计范围。 **示例**: 如果你只想计算特定部门(如部门ID为5)中工资非NULL的员工数量,可以这样做: ```sql SELECT COUNT(salary) AS non_null_salary_count FROM employees WHERE department_id = 5 AND salary IS NOT NULL; ``` 这个查询通过`WHERE`子句排除了`department_id`不等于5或`salary`为NULL的记录,然后计算剩余记录中`salary`字段非NULL的行数。 #### 使用`CASE`表达式进行条件计数 `CASE`表达式在SQL中提供了一种灵活的方式来根据条件对数据进行转换或评估。在计算非NULL值的行数时,虽然直接使用`COUNT(column_name)`通常是最简单的方法,但`CASE`表达式可以在更复杂的逻辑判断中发挥作用,特别是当你需要根据不同条件对记录进行不同方式的计数时。 **示例**: 假设你想要同时计算`salary`非NULL和`salary`大于某个特定值(比如5000)的员工数量,可以这样写: ```sql SELECT COUNT(CASE WHEN salary IS NOT NULL THEN 1 END) AS non_null_salary_count, COUNT(CASE WHEN salary > 5000 THEN 1 END) AS high_salary_count FROM employees; ``` 这里,`CASE`表达式在`salary`非NULL时返回1(从而被`COUNT`函数计入),否则不返回任何值(不计入总数)。第二个`COUNT`则计算了`salary`大于5000的记录数。 #### 使用聚合函数与`HAVING`子句 虽然`HAVING`子句主要用于过滤聚合函数的结果(如`COUNT`、`SUM`等),但在某些特定情况下,它也可以与`GROUP BY`结合使用来间接地影响非NULL值的行数计算。虽然这不是直接计算非NULL行数的首选方法,但了解`HAVING`如何与聚合函数一起工作对于处理复杂查询是有益的。 **示例**: 假设你想要计算每个部门中工资非NULL的员工数量,并且只关注那些至少有5名工资非NULL员工的部门: ```sql SELECT department_id, COUNT(salary) AS non_null_salary_count FROM employees GROUP BY department_id HAVING COUNT(salary) >= 5; ``` 这里,`GROUP BY`按`department_id`分组记录,`COUNT(salary)`计算每个组中工资非NULL的行数,而`HAVING`子句则过滤出那些至少有5名工资非NULL员工的部门。 #### 结论 计算NULL之外的数据的行数是数据库管理和数据分析中的一项基础且重要的技能。通过熟练使用`COUNT`函数、`WHERE`子句、`CASE`表达式以及聚合函数与`HAVING`子句的组合,你可以灵活地应对各种场景下的非NULL值计数需求。掌握这些技巧将帮助你更有效地从数据库中提取有价值的信息,为决策支持提供坚实的数据基础。
上一篇:
计算表中数据的行数
下一篇:
计算合计值
该分类下的相关小册推荐:
高性能的Postgres SQL
SQL基础教程(下)
PostgreSQL入门教程
SQL基础教程(中)