LintCode 1984 · 统计不同教师 id 的数量(count 函数用法)
题目地址:LintCode 1984 · 统计不同教师 id 的数量
题目描述
请编写 SQL 语句,统计课程表 courses 中不同的教师 id teacher_id 的数量,最后返回统计值,结果列名显示为 teacher_count 。
表定义: courses (课程表)
列名 | 类型 | 注释 |
---|
id | int | 主键 | name | varchar | 课程名称 | student_count | int | 学生总数 | created_at | date | 开课时间 | teacher_id | int | 讲师 ID |
- 若
teacher_id 为空,默认该 teacher_id 不存在,则在统计时不计入 - 返回统计结果的列名需要更改
- 如果统计不到数据,则返回 0
样例
样例一: 表内容:courses
id | name | student_count | created_at | teacher_id |
---|
1 | Advanced Algorithms | 880 | 2020/6/1 | 4 | 2 | System Design | 1350 | 2020/7/18 | 3 | 3 | Django | 780 | 2020/2/29 | 3 | 4 | Web | 340 | 2020/4/22 | 4 | 5 | Big Data | 700 | 2020/9/11 | 1 | 6 | Artificial Intelligence | 1660 | 2018/5/13 | 3 | 7 | Java P6+ | 780 | 2019/1/19 | 3 | 8 | Data Analysis | 500 | 2019/7/12 | 1 | 9 | Object Oriented Design | 300 | 2020/8/8 | 4 | 10 | Dynamic Programming | 2000 | 2018/8/18 | 1 |
在运行你的 SQL 语句之后,表应返回:
样例二: 表内容 : courses
id | name | student_count | created_at | teacher_id |
---|
1 | Advanced Algorithms | 880 | 2020/6/1 | | 2 | System Design | 1350 | 2020/7/18 | | 9 | Object Oriented Design | 300 | 2020/8/8 | | 10 | Dynamic Programming | 2000 | 2018/8/18 | |
在运行你的 SQL 语句之后,表应返回:
因为样例二中 teacher_id 均为空,所以统计结果为 0
解题思路
在看到样例一时,第一时间想到使用 distinct 关键字进行去重,于是SQL如下
SELECT COUNT(*) AS teacher_count
FROM (SELECT DISTINCT teacher_id FROM courses) t;
就当我觉得轻轻松松点击提交时候,提示答案不对~~ 然后我才注意到这句话:若 teacher_id 为空,默认该 teacher_id 不存在,则在统计时不计入 修改 SQL 如下:
SELECT COUNT(*) AS teacher_count
FROM (SELECT DISTINCT teacher_id FROM courses) t
WHERE teacher_id IS NOT NULL;
进行提交,答案通过
使用 count 函数
当我查看题解时,发现下面这条 SQL
SELECT COUNT(DISTINCT(teacher_id)) AS teacher_count
FROM courses ;
看了答案以后,还以为 DISTINCT 关键字还有忽略 NULL 的作用 通过 count(*) 和 count(teacher_id) 对比发现 count(列名) 的方式会忽略 NULL 值
在面向百度编程后,得知 count 函数用法如下:
count 函数用法如下:
- COUNT(*):包括所有列,返回表中的记录数,相当于统计表的行数,在统计结果的时候,不会忽略列值为NULL的记录
- COUNT(1):忽略所有列,1表示一个固定值,也可以用count(2)、count(3)代替,在统计结果的时候,不会忽略列值为NULL的记录
- COUNT(列名):只包括列名指定列,返回指定列的记录数,在统计结果的时候,会忽略列值为NULL的记录(不包括空字符串和0),即列值为NULL的记录不统计在内。
- COUNT(DINTINCT 列名):只包括列名指定列,返回指定列的不同值的记录数,在统计结果的时候,在统计结果的时候,会忽略列值为NULL的记录(不包括空字符串和0),即列值为NULL的记录不统计在内。
文章出处:关于mysql中的count()函数
|