SQL-为什么缺少 COUNT(*) 会导致总行数返回1
背景:
数据放在数据库中,然后可以接受用户指定查询n条,就展示n条,但是如果用户输入的n大于数据库中实际的总数据,那就展示实际总数据。
此时数据库有三条数据:
但是运行时,用户指定输入查询为3,却只能查到一条数据:
然后进行debug,发现总数据totalRows总是为1(实际应该为3):
错误分析:
查询语句写错了:
错误写法:String sql = "SELECT * FROM success";
正确写法:String sql = "SELECT COUNT(*) FROM success";
正确代码:
// 获取总历史记录数量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 |
细节:
-
聚合函数与非聚合查询的区别:
-
COUNT(*)
是聚合函数,返回单行单列的结果 -
SELECT *
是普通查询,返回多行多列的结果集
-
-
列访问方式:
-
使用列名(如
rs.getInt("total")
)比位置索引(rs.getInt(1)
)更安全可靠
-