SQL中count(1)、count(*) 与 count(列名)的区别详细解释
目录
- 前言
- 1. COUNT(1)
- 2. COUNT(*)
- 3. COUNT(列名)
- 示例代码
- 执行速度
- 详细解释
- 1. COUNT(1)
- 2. COUNT(*)
- 3. 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(列名)
的性能可能略低一些。排序如下:
- COUNT(1)
- COUNT(*)
- 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(1)、count(*) 与 count(列名)内容请搜索编程网(www.lsjlt.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网(www.lsjlt.com)!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
SQL中count(1)、count(*) 与 count(列名)的区别详细解释
下载Word文档到电脑,方便收藏和打印~
相关文章
- 在 Java 中怎样生成随机正方形坐标?(Java中如何生成随机正方形坐标)
- 如何在 Java 中定义 list 并实现反转?(Java定义list怎样实现反转)
- Java 中 SimpleDateFormat 如何巧妙处理闰年?(Java SimpleDateFormat如何处理闰年)
- Java 中 BeanUtils 工具类常用方法有哪些?(Java BeanUtils工具类常用方法有哪些)
- 如何在 Java 数据分析中应用 ARIMA 模型?(ARIMA模型在Java数据分析中的应用)
- 如何使用 Java 的 Scanner 读取二进制文件?(Java的Scanner如何读取二进制文件)
- 在 Java 中如何进行变量的声明?(Java中怎么声明一个变量)
- 如何将 Java 父类强制转换成子类?(java父类怎么强制转换成子类)
- 在 Java 中,add()函数的最佳实践究竟是什么?(在Java中add()函数最佳实践是什么)
- 为什么要选择 Gosling Java 而不是其他版本呢?(为什么选择Gosling Java而不是其他版本)
猜你喜欢
SQL中count(1)、count(*) 与 count(列名)的区别详细解释
浅聊 count(1)、count(*) 与 count(列名) 的区别
count(*)、count(1)和count(列名)的区别是什么
Mysql中count(*)、count(1)、count(主键id)与count(字段)的区别
oracle中count(1)与count(*)的区别是什么
MySQL中count()和count(1)有何区别以及哪个性能最好详解
编程热搜
[mysql]mysql8修改root密码
use mysqlselect * from user where user="root";update user set password=password("mysql@2020") where user="root";ERROR 1064 (42000)MySQL专题3之MySQL管理
1、启动以及关闭MySQL服务器- 首先,我们需要通过以下命令来检查MySQL服务器是否已经启动:ps -ef | grep mysqld- 如果MySQL已经启动,以上命令将输出mysql进程列表,如果mysql未启动,你可以使用以下
编程资源站
- 资料下载
- 历年试题
目录
留言反馈