当前位置: 首页 > news >正文

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值

正确与错误对比:

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

细节: 

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

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

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

  2. 列访问方式

    • 使用列名(如 rs.getInt("total"))比位置索引(rs.getInt(1))更安全可靠

http://www.xdnf.cn/news/865333.html

相关文章:

  • Android 轻松实现 增强版灵活的 滑动式表格视图
  • 前端面试三之控制语句
  • el-input限制输入数字,输入中文后数字校验失效
  • 【输入URL到页面展示】
  • 一文读懂RAG流程中用到的请求参数与返回字段
  • HTMLCSS 学习总结
  • (T/SAIAS 020-2024)《医疗大模型语料一体机应用指南》深度解读与实施分析
  • Shiro安全权限框架
  • OpenCV CUDA模块图像处理------图像连通域标记接口函数connectedComponents()
  • iOS UIActivityViewController 组头处理
  • OSPF域间路由
  • fastadmin fildList 动态下拉框默认选中
  • parquet :开源的列式存储文件格式
  • 【PhysUnits】15.13 SI类型级量纲(dimension.rs)
  • 针对KG的神经符号集成综述 两篇
  • 企业级实战之Iptables防火墙案例分析
  • 11. 试学内容-如何理解隔离性2(原理)
  • mysql知识点
  • Axios学习笔记
  • 技术文档的降维打击:3大原则+5步结构+CSDN流量密码
  • 瀚文机械键盘固件开发详解:HWKeyboard.cpp文件解析与应用
  • linux 故障处置通用流程-36计+1计
  • 传输层协议 UDP 介绍 -- UDP 协议格式,UDP 的特点,UDP 的缓冲区
  • OPENCV的AT函数
  • 验证负载均衡与弹性伸缩
  • Nginx+Tomcat负载均衡与动静分离架构
  • 保险丝选型
  • Java基础原理与面试高频考点
  • 沉金PCB电路板制造有哪些操作要点需要注意?
  • 论文导读 | 区间数据管理