mysql数据库count使用姿势

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: (有什么问题欢迎指教,QQ:2172243813 源码资源:www.ttkmwl.com) 数据表描述 mysql> select vip,port,status from vip_full limit 10; +----------------+------+--------+ | vip  .


数据表描述


mysql> select vip,port,status from vip_full limit 10;
+----------------+------+--------+
| vip            | port | status |
+----------------+------+--------+
| 123.125.52.231 |   80 |      0 |
| 10.143.153.101 | 1986 |      1 |
| 123.125.52.231 |  443 |      1 |
| 10.143.153.71  | 5477 |      1 |
| 10.143.153.71  | 5480 |      0 |
| 10.143.153.72  | 5481 |      1 |
| 10.143.153.71  | 5495 |      1 |
| 10.143.153.71  | 5492 |      0 |
| 10.143.153.71  | 5493 |      0 |
| 10.143.153.71  | 5497 |      1 |
+----------------+------+--------+
10 rows in set

status=0表示未完成,1表示完成。

要统计一个vip下有多少完成的数量,有多少未完成的数量(附加条件,完成数量大于0,未完成数量大于0)

第一次写下了这么一个语句

mysql> select count(status=1) as status1,count(status=0) as status0,vip from vip_full group by vip having status1>0 and status0>0 limit 10;
+---------+---------+---------------+
| status1 | status0 | vip           |
+---------+---------+---------------+
|       1 |       1 | 1.192.137.217 |
|       2 |       2 | 1.192.137.230 |
|       1 |       1 | 1.192.137.232 |
|       2 |       2 | 1.192.137.234 |
|       2 |       2 | 1.192.137.244 |
|       1 |       1 | 1.192.137.245 |
|       2 |       2 | 1.192.137.246 |
|       1 |       1 | 1.192.137.247 |
|       1 |       1 | 1.192.137.248 |
|       1 |       1 | 1.192.137.249 |
+---------+---------+---------------+
10 rows in set

检验:

mysql> select vip,port,status from vip_full where vip="1.192.137.217";
+---------------+------+--------+
| vip           | port | status |
+---------------+------+--------+
| 1.192.137.217 |   80 |      0 |
+---------------+------+--------+
1 row in set
从上面的查询接口可以看出,统计数据中,vip为1.192.137.217,status=0和1的应该各为1个啊,而检验中,该vip下只有一个未完成的,并没有完成的。

可以看出,第一次count的数据是不正确的,正确语句应该如下

mysql> select count(status=1 or null) as status1,count(status=0 or null) as status0,vip from vip_full group by vip having status1>0 and status0>0 limit 10;
+---------+---------+----------------+
| status1 | status0 | vip            |
+---------+---------+----------------+
|      36 |       1 | 10.131.199.249 |
|      75 |       1 | 10.131.199.254 |
|       1 |       1 | 10.138.245.78  |
|     173 |       1 | 10.139.230.127 |
|       2 |       1 | 10.139.230.68  |
|      37 |       1 | 10.142.234.19  |
|      50 |       1 | 10.142.234.20  |
|     152 |       1 | 10.143.153.107 |
|      39 |       1 | 10.143.153.186 |
|       2 |       1 | 10.143.153.63  |
+---------+---------+----------------+
10 rows in set

检验:

mysql> select * from vip_full where vip = "10.143.153.63";
+-------+------+---------------+------+-----------+----------------------------+----------------------+--------+---------------+-------+
| id    | idc  | vip           | port | sms_alarm | email_alarm                | department           | status | sbusiname     | istag |
+-------+------+---------------+------+-----------+----------------------------+----------------------+--------+---------------+-------+
| 46489 | bjcc | 10.143.153.63 |   80 | add_ops   | sys_weblvs_alarm_emailonly | innerlbs.huajiao.com |      1 | 花椒 附近的人 |     0 |
| 46551 | bjcc | 10.143.153.63 | 8088 | add_ops   | sys_weblvs_alarm_emailonly | innerlbs.huajiao.com |      0 | NULL          |     1 |
| 46552 | bjcc | 10.143.153.63 | 8888 | add_ops   | sys_weblvs_alarm_emailonly | innerlbs.huajiao.com |      1 | 花椒 附近的人 |     0 |
+-------+------+---------------+------+-----------+----------------------------+----------------------+--------+---------------+-------+
3 rows in set
结果正确,解释如下

因为 当 status 不是 0 时 ,status=0 结果false 不是 NULL,

Count在 值是NULL是 不统计数, 至于加上or NULL , 很像其他编程里的or运算符,第一个表达式是true就是不执行or后面的表达式,第一个表达式是false 执行or后面的表达式 。当 status 不为 0 时 status = 0 or NULL 的结果是NULL,Count才不会统计上这条记录数,否则会不管是不是0的都统计。


(有什么问题欢迎指教,QQ:2172243813 更多资讯尽在www.ttkmwl.com)

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
13天前
|
存储 缓存 关系型数据库
MySQL的count()方法慢
MySQL的 `COUNT()`方法在处理大数据量时可能会变慢,主要原因包括数据量大、缺乏合适的索引、InnoDB引擎的设计以及复杂的查询条件。通过创建合适的索引、使用覆盖索引、缓存机制、分区表和预计算等优化方案,可以显著提高 `COUNT()`方法的执行效率,确保数据库查询性能的提升。
438 12
|
23天前
|
缓存 NoSQL 关系型数据库
MySQL战记:Count( *)实现之谜与计数策略的选择
本文深入探讨了MySQL中`count(*)`的不同实现方式,特别是MyISAM和InnoDB引擎的区别,以及各种计数方法的性能比较。同时,文章分析了使用缓存系统(如Redis)与数据库保存计数的优劣,并强调了在高并发场景下保持数据一致性的挑战。
MySQL战记:Count( *)实现之谜与计数策略的选择
|
2月前
|
SQL 关系型数据库 MySQL
MySQL性能探究:count(*)与count(1)的性能对决
在MySQL数据库的性能优化中,对查询语句的细微差别有着深入的理解是非常重要的。`count(*)`和`count(1)`是两种常用的聚合函数,用于计算行数。在面试中,面试官经常会问到这两种函数的性能差异。本文将探讨`count(*)`与`count(1)`的性能对比,并整理十道经典的MySQL面试题,帮助你在面试中游刃有余。
91 3
|
2月前
|
关系型数据库 MySQL 索引
MySQL的group by与count(), *字段使用问题
正确使用 `GROUP BY`和 `COUNT()`函数是进行数据聚合查询的基础。通过理解它们的用法和常见问题,可以有效避免查询错误和性能问题。无论是在单列分组、多列分组还是结合其他聚合函数的场景中,掌握这些技巧和注意事项都能大大提升数据查询和分析的效率。
202 0
|
3月前
|
存储 关系型数据库 MySQL
深度剖析:MySQL聚合函数 count(expr) 如何工作?如何选择?
本文详细探讨了MySQL中count(expr)函数的不同形式及其执行效率,包括count(*)、count(1)、count(主键)、count(非主键)等。通过对InnoDB和MyISAM引擎的对比分析,解释了它们在不同场景下的实现原理及性能差异。文章还通过实例演示了事务隔离级别对统计结果的影响,并提供了源码分析和总结建议。适合希望深入了解MySQL统计函数的开发者阅读。
77 0
|
5月前
|
关系型数据库 MySQL
Mysql中count(1)、count(*)以及count(列)的区别
Mysql中count(1)、count(*)以及count(列)的区别
63 0
|
6月前
|
SQL 数据库 关系型数据库
MySQL设计规约问题之为什么统计表中记录数时推荐使用COUNT(*)而不是COUNT(primary_key)或COUNT(1)
MySQL设计规约问题之为什么统计表中记录数时推荐使用COUNT(*)而不是COUNT(primary_key)或COUNT(1)
|
7月前
|
关系型数据库 MySQL 开发者
Mysql COUNT() 函数详解
【6月更文挑战第19天】Mysql COUNT() 函数详解,包括 COUNT() 的用法及 COUNT() 带条件查询的操作
|
7月前
|
SQL 关系型数据库 MySQL
MySQL数据库——SQL优化(3/3)-limit 优化、count 优化、update 优化、SQL优化 小结
MySQL数据库——SQL优化(3/3)-limit 优化、count 优化、update 优化、SQL优化 小结
314 0
|
8月前
|
SQL 关系型数据库 MySQL
Mysql中count(*)和limit同时使用的问题
Mysql中count(*)和limit同时使用的问题
191 0