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

【SQL】count(1)、count(*) 与 count(列名) 的区别

在 SQL 中,COUNT 函数用于计算查询结果集中的行数。COUNT(1)COUNT(*)COUNT(列名) 都可以用来统计行数,但它们在实现细节和使用场景上有一些区别。以下是详细的解释:

1. COUNT(1)

  • 定义: COUNT(1) 计算查询结果集中的行数。
  • 实现: 在执行过程中,COUNT(1) 会将 1 作为一个非空的常量值,并对每一行进行计数。
  • 效率: 现代的 SQL 优化器通常会将 COUNT(1)COUNT(*) 优化为相同的执行计划,因此性能基本相同。
  • 用途: 适用于计算总行数,与 COUNT(*) 无区别。
SELECT COUNT(1) FROM employees;

2. COUNT(*)

  • 定义: COUNT(*) 计算查询结果集中的总行数,包括所有列,不会忽略任何行,即使某些列包含 NULL
  • 实现: SQL 优化器会对 COUNT(*) 进行优化,将其转换为统计行数的操作。
  • 效率: 通常是最常用和推荐的方式,因为其语义明确且优化器能够很好地处理。
  • 用途: 适用于计算总行数,性能通常优于 COUNT(列名)
SELECT COUNT(*) FROM employees;

3. COUNT(列名)

  • 定义: COUNT(列名) 计算查询结果集中某一列非 NULL 值的行数。
  • 实现: 只有当指定列的值不为 NULL 时,该行才会被计入结果。
  • 效率: 由于需要检查每行中的特定列是否为 NULL,性能可能略低于 COUNT(*)COUNT(1)
  • 用途: 适用于计算某一特定列中非 NULL 值的数量。
SELECT COUNT(department_id) FROM employees;

示例代码

下面是一个使用 JDBC 示例代码,展示如何使用 COUNT(1)COUNT(*)COUNT(列名)

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;public class CountExample {private static final String JDBC_URL = "jdbc:mysql://localhost:3306/yourdatabase";private static final String JDBC_USER = "yourusername";private static final String JDBC_PASSWORD = "yourpassword";public static void main(String[] args) {try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);Statement stmt = conn.createStatement()) {// 使用 COUNT(1)String count1SQL = "SELECT COUNT(1) AS total FROM employees";ResultSet rs1 = stmt.executeQuery(count1SQL);if (rs1.next()) {int total1 = rs1.getInt("total");System.out.println("Total rows (COUNT(1)): " + total1);}// 使用 COUNT(*)String countAllSQL = "SELECT COUNT(*) AS total FROM employees";ResultSet rsAll = stmt.executeQuery(countAllSQL);if (rsAll.next()) {int totalAll = rsAll.getInt("total");System.out.println("Total rows (COUNT(*)): " + totalAll);}// 使用 COUNT(column)String countColumnSQL = "SELECT COUNT(department_id) AS total FROM employees";ResultSet rsColumn = stmt.executeQuery(countColumnSQL);if (rsColumn.next()) {int totalColumn = rsColumn.getInt("total");System.out.println("Total rows (COUNT(department_id)): " + totalColumn);}} catch (SQLException e) {e.printStackTrace();}}
}

在上述代码中,演示了如何使用 COUNT(1)COUNT(*)COUNT(列名) 进行统计查询。请根据需要调整数据库连接字符串、用户名、密码和 SQL 语句。

执行速度

COUNT(1)COUNT(*)COUNT(列名) 的执行速度进行排序,通常在现代的 SQL 数据库管理系统中,COUNT(1)COUNT(*) 的性能基本相同,而 COUNT(列名) 的性能可能略低一些。排序如下:

  1. COUNT(1)
  2. COUNT(*)
  3. COUNT(列名)

详细解释

1. COUNT(1)
  • 执行速度: COUNT(1) 只是将每一行的计数加一,现代 SQL 优化器通常会将 COUNT(1)COUNT(*) 优化为相同的执行计划,因此执行速度非常快。
  • 优化器行为: 优化器能够识别 COUNT(1) 的语义并进行优化处理,使其与 COUNT(*) 的性能基本一致。
2. COUNT(*)
  • 执行速度: COUNT(*) 计算表中所有行的数量,包括所有列,不忽略任何行。现代 SQL 优化器对此有非常好的优化,因此执行速度也非常快,通常与 COUNT(1) 无异。
  • 优化器行为: 优化器会将 COUNT(*) 优化为高效的行计数操作。
3. COUNT(列名)
  • 执行速度: COUNT(列名) 只计算指定列非 NULL 值的行数。在执行过程中,数据库需要检查每一行中特定列是否为 NULL,这会增加一些额外的处理时间。
  • 优化器行为: 尽管现代优化器对 COUNT(列名) 也有优化,但由于需要额外的 NULL 检查,性能可能略低于 COUNT(1)COUNT(*)

示例验证

为了验证上述结论,可以使用以下 SQL 脚本在 MySQL 或其他 SQL 数据库中进行测试。请确保表中有足够多的数据,以便更明显地观察执行时间的差异。

创建测试表并插入数据
CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY,department_id INT,name VARCHAR(255),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);-- 插入大量数据
INSERT INTO employees (department_id, name) 
SELECT FLOOR(RAND() * 10), CONCAT('Employee', FLOOR(RAND() * 1000))
FROM (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) t1
CROSS JOIN (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) t2
CROSS JOIN (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) t3
CROSS JOIN (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) t4
CROSS JOIN (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) t5;
执行计数查询并记录执行时间
-- 计时 COUNT(1)
SET @start_time = NOW(6);
SELECT COUNT(1) FROM employees;
SELECT TIMEDIFF(NOW(6), @start_time) AS execution_time;-- 计时 COUNT(*)
SET @start_time = NOW(6);
SELECT COUNT(*) FROM employees;
SELECT TIMEDIFF(NOW(6), @start_time) AS execution_time;-- 计时 COUNT(department_id)
SET @start_time = NOW(6);
SELECT COUNT(department_id) FROM employees;
SELECT TIMEDIFF(NOW(6), @start_time) AS execution_time;

这些查询将显示每个 COUNT 语句的执行时间。通常,COUNT(1)COUNT(*) 的执行时间几乎相同,而 COUNT(列名) 的执行时间可能稍长一些。

总结

  • COUNT(1): 计算查询结果集中的行数,性能与 COUNT(*) 基本相同。
  • COUNT(*): 计算查询结果集中的总行数,包括所有列,不忽略任何行,通常是最常用和推荐的方式。
  • COUNT(列名): 计算查询结果集中某一列非 NULL 值的行数,适用于统计特定列中的有效数据。

相关文章:

【SQL】count(1)、count(*) 与 count(列名) 的区别

在 SQL 中,COUNT 函数用于计算查询结果集中的行数。COUNT(1)、COUNT(*) 和 COUNT(列名) 都可以用来统计行数,但它们在实现细节和使用场景上有一些区别。以下是详细的解释: 1. COUNT(1) 定义: COUNT(1) 计算查询结果集中的行数。实现: 在执行…...

03-ES6新语法

1. ES6 函数 1.1 函数参数的扩展 1.1.1 默认参数 function fun(name,age17){console.log(name","age); } fn("张美丽",18); // "张美丽",18 fn("张美丽",""); // "张美丽" fn("张美丽"); // &…...

Linux中的文本编辑器vi与vim

摘要: 本文将深入探讨VI和VIM编辑器的基本概念、特点、使用方法以及它们在Linux环境中的重要性。通过对这两款强大的文本编辑器的详细分析,读者将能够更全面地理解它们的功能,并掌握如何有效地使用它们进行日常的文本编辑和处理任务。 引言&…...

MATLAB基础应用精讲-【数模应用】三因素方差(附R语言、MATLAB和python代码实现)

目录 几个高频面试题目 群体分布是否服从高斯分布? 数据是否不匹配? “误差”是否独立存在? 您是否真的想比较平均值? 是否存在三项因素? 这三项因素是否均属于“固定因素”,而非“随机因素”? 算法原理 EXCEL spss三因素方差分析步骤 一、spss三因素…...

Linux ubuntu安装pl2303USB转串口驱动

文章目录 1.绿联PL2303串口驱动下载2.驱动安装3.验证方法 1.绿联PL2303串口驱动下载 下载地址:https://www.lulian.cn/download/16-cn.html 也可以直接通过CSDN下载:https://download.csdn.net/download/Axugo/89447539 2.驱动安装 下载后解压找到Lin…...

关于使用命令行打开wps word文件

前言 在学习python-docx时,想在完成运行时使用命令行打开生成的docx文件。 总结 在经过尝试后,得出以下代码: commandrstart "C:\Users\86136\AppData\Local\Kingsoft\WPS Office\12.1.0.16929\office6\wps.exe" "./result…...

将Vite添加到您现有的Web应用程序

Vite(发音为“veet”)是一个新的JavaScript绑定器。它包括电池,几乎不需要任何配置即可使用,并包括大量配置选项。哦——而且速度很快。速度快得令人难以置信。 本文将介绍将现有项目转换为Vite的过程。我们将介绍别名、填充webp…...

Apache Kafka与Spring整合应用详解

引言 Apache Kafka是一种高吞吐量的分布式消息系统,广泛应用于实时数据处理、日志聚合和事件驱动架构中。Spring作为Java开发的主流框架,通过Spring Kafka项目提供了对Kafka的集成支持。本文将深入探讨如何使用Spring Kafka整合Apache Kafka&#xff0c…...

SpringBoot配置第三方专业缓存技术Redis

Redis缓存技术 Redis(Remote Dictionary Server)是一个开源的内存中数据结构存储系统,通常用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等,并提供了丰富的功能和灵活的…...

javascript的toFixed()以及使用

toFixed() 是 JavaScript 中数字类型(Number)的一个方法,用来将数字转换为指定小数位数的字符串表示形式。 使用方式和示例: let num 123.45678; let fixedNum num.toFixed(2); console.log(fixedNum); // 输出 "123.46&qu…...

软件功能测试和性能测试包括哪些测试内容?又有什么联系和区别?

软件功能测试和性能测试是保证软件质量和稳定性的重要手,无论是验证软件的功能正确性,还是评估软件在负载下的性能表现,这些测试都是必不可少的。 一、软件功能测试   软件功能测试是指对软件的各项功能进行验证和确认,确保软件…...

从工具产品体验对比spark、hadoop、flink

作为一名大数据开发,从工具产品的角度,对比一下大数据工具最常使用的框架spark、hadoop和flink。工具无关好坏,但人的喜欢有偏好。 目录 评价标准1 效率2 用户体验分析从用户的维度来看从市场的维度来看从产品的维度来看 3 用户体验的基本原则…...

【软件设计】详细设计说明书(word原件,项目直接套用)

软件详细设计说明书 1.系统总体设计 2.性能设计 3.系统功能模块详细设计 4.数据库设计 5.接口设计 6.系统出错处理设计 7.系统处理规定 软件全套资料:本文末个人名片直接获取或者进主页。...

java本地缓存(map,Guava,echcache,caffeine)优缺点,以及适用场景

前言 在高并发系统环境下,jvm本地缓存扮演着至关重要的角色,合理的应用能够使系统响应迅速,提高用户体验感,而分布式缓存redis则存在着网络io,以及流量消耗问题,需要和本地缓存搭配使用,才能使…...

Monica

在 《long long ago》中,我论述了on是一个刚出生的孩子的脐带连接在其肚子g上的形象,脐带就是long的字母l和字母n,l表脐带很长,n表脐带曲转冗余和连接之性,on表一,是孩子刚诞生的意思,o是身体&a…...

国产数据库中读写分离实现机制

在数据库高可用架构下会存在1主多备的部署,备节点可以根据业务场景分发一部分流量以充分利用资源,并减轻主库的压力,因此在数据库的功能上需要读写分离来实现。 充分利用备节点的资源,提升业务的吞吐量;防止运维等非业…...

kubernetes部署dashboard

kubernetes部署dashboard 1. 简介 Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息&#…...

FPGA早鸟课程第二弹 | Vivado 设计静态时序分析和实际约束

在FPGA设计领域,时序约束和静态时序分析是提升系统性能和稳定性的关键。社区推出的「Vivado 设计静态时序分析和实际约束」课程,旨在帮助工程师们掌握先进的设计技术,优化设计流程,提高开发效率。 课程介绍 关于课程 权威认证&…...

STM32项目分享:家庭环境监测系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.…...

华为HCIP Datacom H12-821 卷5

1.单选题 下列哪种工具不能被 route-policy 的 apply 子句直接引用? A、IP-Prefix B、tag C、community D、origin 正确答案: A 解析: 因route-policy工具中, apply 后面跟的是路由的相关属性。 但是ip-prefix是用来匹配路由的工具。 2.单选题...

Mongodb数据库基本操作

本文为在命令行模式下Mongodb数据库的基本操作整理。 目录 数据库操作 创建数据库 查看所有数据 查看当前数据库 删除数据库 断开连接 查看命令api 集合操作 查看当前数据库下集合 创建集合 删除当前数据库中的集合 文档操作 插入文档 insertOne()方法 insertMa…...

【机器学习】基于Softmax松弛技术的离散数据采样

1.引言 1.1.离散数据采样的意义 离散数据采样在深度学习中起着至关重要的作用,它直接影响到模型的性能、泛化能力、训练效率、鲁棒性和解释性。 首先,采样方法能够有效地平衡数据集中不同类别的样本数量,使得模型在训练时能够更均衡地学习…...

.NET+Python量化【1】——环境部署和个人资金账户信息查询

前言:量化资料很少,.NET更少。那我就来开个先河吧~ 以下是使用QMT进行量化开发的环境部署和基础信息获取有关操作。 1、首先自己申请券商的QMT权限,此步骤省略。 2、登陆QMT,选择极简模式,或者独立交易模式之类的。会进…...

洛谷 P10584 [蓝桥杯 2024 国 A] 数学题(整除分块+杜教筛)

题目 思路来源 登录 - Luogu Spilopelia 题解 参考了两篇洛谷题解&#xff0c;第一篇能得出这个式子&#xff0c;第二篇有比较严格的复杂度分析 结合去年蓝桥杯洛谷P9238&#xff0c;基本就能得出这题的正确做法 代码 #include<bits/stdc.h> #include<iostream&g…...

深入讲解C++基础知识(一)

目录 一、基本内置类型1. 类型的作用2. 分类3. 整型3.1 内存描述及查询3.2 布尔类型 —— bool3.3 字符类型 —— char3.4 其他整型 4. 有符号类型和无符号类型5. 浮点型6. 如何选择类型7. 类型转换7.1 自动类型转换7.2 强制类型转换7.3 类型转换总结 8. 类型溢出8.1 注意事项 …...

Python爬虫实战:批量下载网站图片

1.获取图片的url链接 首先&#xff0c;打开百度图片首页&#xff0c;注意下图url中的index 接着&#xff0c;把页面切换成传统翻页版&#xff08;flip&#xff09;&#xff0c;因为这样有利于我们爬取图片&#xff01; 对比了几个url发现&#xff0c;pn参数是请求到的数量。…...

使用 JavaScript 获取电池状态

在现代的移动设备和笔记本电脑上&#xff0c;了解电池状态是一项非常有用的功能。使用 JavaScript 可以轻松地获取电池的充电状态、电量百分比等信息。本文将介绍如何使用 JavaScript 访问这些信息&#xff0c;并将其显示在网页上。 1. HTML 结构 首先&#xff0c;我们需要一…...

java—类反射机制

简述 反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息&#xff08;如成员变量&#xff0c;构造器&#xff0c;成员方法等&#xff09;&#xff0c;并能操作对象的属性及方法。反射机制在设计模式和框架底层都能用到。 类一旦加载&#xff0c;在堆中会产生…...

浏览器-服务器架构 (BS架构) 详解

目录 前言1. BS架构概述1.1 BS架构的定义1.2 BS架构的基本原理 2. BS架构的优势2.1 客户端简化2.2 易于更新和维护2.3 跨平台性强2.4 扩展性高 3. BS架构的劣势3.1 网络依赖性强3.2 安全性问题3.3 用户体验局限 4. BS架构的典型应用场景4.1 企业内部应用4.2 电子商务平台4.3 在…...

微型操作系统内核源码详解系列五(四):cm3下svc启动任务

系列一&#xff1a;微型操作系统内核源码详解系列一&#xff1a;rtos内核源码概论篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列二&#xff1a;微型操作系统内核源码详解系列二&#xff1a;数据结构和对象篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列…...

服装门户系统网站/全渠道营销的概念

最近更新的博客 华为 od 2023 | 什么是华为 od,od 薪资待遇,od 机试题清单华为 OD 机试真题大全,用 Python 解华为机试题 | 机试宝典【华为 OD 机试】全流程解析+经验分享,题型分享,防作弊指南华为 od 机试,独家整理 已参加机试人员的实战技巧本篇题目:停车找车位 or 停车…...

做农产品的网站/景区营销案例100例

在Java GUI应用中&#xff0c;难免用到文件选择框JFileChooser&#xff0c;这个组件可以用来选择打开文件(jFileChooser1.setFileSelectionMode(JFileChooser.OPEN_DIALOG))和保存文件(jFileChooserOut.setFileSelectionMode(JFileChooser.SAVE_DIALOG))&#xff0c;虽然setFil…...

软文写作/东莞网络优化调查公司

通过使用 tr&#xff0c;您可以非常容易地实现 sed 的许多最基本功能。您可以将 tr 看作为 sed 的&#xff08;极其&#xff09;简化的变体&#xff1a;它可以用一个字符来替换另一个字符&#xff0c;或者可以完全除去一些字符。您也可以用它来除去重复字符。这就是所有 tr 所能…...

云服务器快速安装wordpress/成crm软件

1.nrm nrm(npm registry manager )是npm的镜像源管理工具&#xff0c;有时候国外资源太慢&#xff0c;使用这个就可以快速地在 npm 源间切换 2.安装nrm 在命令行执行命令&#xff0c;npm install -g nrm&#xff0c;全局安装nrm。3.使用 执行命令nrm ls查看可选的源。nrm ls …...

广州网站制作开发/市场调研报告的基本框架

div布局之所以要学懂学透&#xff0c;是因为table的布局实在是难堪大用&#xff0c;如果是同处于一个表格之内&#xff0c; 各行的规格分布根本就没法调&#xff0c; 例如下面的一段非常简单的代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transi…...

海洋馆网站建设/网页宣传

虽然大多数人目前还不会购买拥有触控屏的设备&#xff0c;不过在Windows 7的大力推动下&#xff0c;触控操作已经开始流行了起来。然而Linux目前却无法支持这一功能&#xff0c;这让很多用户十分郁闷&#xff0c;不过来自ENAC Interactive Computing实验室的Benjamin Tissoires…...