做后台管理、写报表、或者调试 SQL 的时候,经常要确认某张表里到底存了多少条记录——比如‘用户表里注册用户真有 5000 人吗?’‘订单表今天新增了几单?’这时候别傻乎乎地 SELECT * FROM users 然后数滚动条,太慢还卡浏览器。
最常用也最靠谱:COUNT(*)
直接用 COUNT(*),它统计的是表中所有行的数量(包括字段为 NULL 的行),不挑不拣,又快又准:
SELECT COUNT(*) FROM users;执行完立马返回一个数字,比如 1284,说明当前有 1284 条用户记录。
想加条件?带上 WHERE 就行
查‘今天注册的用户有多少’?加个时间条件:
SELECT COUNT(*) FROM users WHERE create_time >= '2024-06-15 00:00:00';查‘已支付的订单数量’?
SELECT COUNT(*) FROM orders WHERE status = 'paid';注意:COUNT(*) 是统计行数,不是统计某个字段的非空值。如果想统计某列有多少非 NULL 值,才用 COUNT(列名),比如 COUNT(phone) 只算手机号不为空的用户数。
小技巧:别用 COUNT(*) 查大表总条数去分页
有人喜欢先 COUNT(*) 算总数,再分页显示——比如“共 234567 条,当前第 1 页”。但对上百万行的大表,这句 COUNT 很可能卡住几秒,尤其没走索引时。实际开发中,更推荐用游标分页或限制最大页码(比如只允许翻到第 100 页),避免被 COUNT 拖垮响应速度。
顺便提一句:COUNT(1) 和 COUNT(*) 有区别吗?
没有实质区别。MySQL、PostgreSQL、SQL Server 都会把 COUNT(1) 当作 COUNT(*) 优化处理,性能几乎一样。写哪个看你团队习惯,但建议统一用 COUNT(*),语义更清晰——就是‘数行数’,不是‘数常量 1’。
下次看到“查条数”三个字,手指别犹豫,敲上 SELECT COUNT(*) FROM 表名,回车,答案就出来了。