SQL-为什么缺少 COUNT(*) 会导致总行数返回1

背景:

数据放在数据库中,然后可以接受用户指定查询n条,就展示n条,但是如果用户输入的n大于数据库中实际的总数据,那就展示实际总数据。

此时数据库有三条数据:

但是运行时,用户指定输入查询为3,却只能查到一条数据:

然后进行debug,发现总数据totalRows总是为1(实际应该为3):


错误分析:

查询语句写错了:

**错误写法:**String sql = "SELECT * FROM success";

正确写法: String sql = "SELECT COUNT(*) FROM success";

正确代码:

java 复制代码
    // 获取总历史记录数量
    private static int getTotalRowCount(Connection conn) throws SQLException{
        String sql = "SELECT COUNT(*) FROM success";
        try(PreparedStatement pstmt = conn.prepareStatement(sql);
            ResultSet rs = pstmt.executeQuery()) {
            return rs.next() ? rs.getInt(1) : 0;
        }
    }

原因分析:

  • 当执行 SELECT * 时,查询所有字段的所有记录

  • rs.getInt(1) 获取的是第一条记录的第一个字段的值(通常是id字段)

  • 如果表中有数据,rs.next() 为true,返回的是第一条记录的id值

  • 而我们表中第一条记录的id是1,所以无论表中有多少条记录,都只返回第一条记录的id值

正确与错误对比:

正确写法 你的错误写法
SQL SELECT COUNT(*) FROM success SELECT * FROM success
返回结果 单行单列,值为总记录数 多行多列,所有记录数据
rs.getInt(1) 获取总记录数 获取第一条记录的第一个字段值
结果表现 返回真实记录总数 返回第一条记录的id

细节:

  1. 聚合函数与非聚合查询的区别

    • COUNT(*) 是聚合函数,返回单行单列的结果

    • SELECT * 是普通查询,返回多行多列的结果集

  2. 列访问方式

    • 使用列名(如 rs.getInt("total"))比位置索引(rs.getInt(1))更安全可靠
相关推荐
草莓熊Lotso4 小时前
Linux 文件描述符与重定向实战:从原理到 minishell 实现
android·linux·运维·服务器·数据库·c++·人工智能
大模型玩家七七4 小时前
基于语义切分 vs 基于结构切分的实际差异
java·开发语言·数据库·安全·batch
岳麓丹枫0015 小时前
PostgreSQL 中 pg_wal 目录里的 .ready .done .history 文件的生命周期
数据库·postgresql
陌上丨11 小时前
Redis的Key和Value的设计原则有哪些?
数据库·redis·缓存
AI_567811 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
ccecw11 小时前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql
JH307311 小时前
达梦数据库与MySQL的核心差异解析:从特性到实践
数据库·mysql
数据知道12 小时前
PostgreSQL 核心原理:如何利用多核 CPU 加速大数据量扫描(并行查询)
数据库·postgresql
麦聪聊数据13 小时前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构
未来之窗软件服务13 小时前
数据库优化提速(四)新加坡房产系统开发数据库表结构—仙盟创梦IDE
数据库·数据库优化·计算机软考