京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

SQL中count(1)、count(*) 与 count(列名)的区别具体表明

2024-11-3 05:02| 发布者: 2ae29| 查看: 91| 评论: 0

摘要: 目录媒介1. COUNT(1)2. COUNT(*)3. COUNT(列名)示例代码执行速度具体表明1. COUNT(1)2. COUNT(*)3. COUNT(列名)示例验证创建测试表并插入数据执行计数查询并记载执行时间总结媒介 在 SQL 中,[code]COUNT[/code]&nbs
目录

媒介

在 SQL 中,[code]COUNT[/code] 函数用于盘算查询结果集中的行数。[code]COUNT(1)[/code]、[code]COUNT(*)[/code] 和 [code]COUNT(列名)[/code] 都可以用来统计行数,但它们在实现细节和使用场景上有一些区别。以下是具体的表明:

1. COUNT(1)

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

2. COUNT(*)

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

3. COUNT(列名)

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

示例代码

下面是一个使用 JDBC 示例代码,展示如何使用 [code]COUNT(1)[/code]、[code]COUNT(*)[/code] 和 [code]COUNT(列名)[/code]:

[code]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(); } } } [/code]

在上述代码中,演示了如何使用 [code]COUNT(1)[/code]、[code]COUNT(*)[/code] 和 [code]COUNT(列名)[/code] 举行统计查询。请根据必要调整数据库毗连字符串、用户名、暗码和 SQL 语句。

执行速度

对 [code]COUNT(1)[/code]、[code]COUNT(*)[/code] 和 [code]COUNT(列名)[/code] 的执行速度举行排序,通常在当代的 SQL 数据库管理系统中,[code]COUNT(1)[/code] 和 [code]COUNT(*)[/code] 的性能基本雷同,而 [code]COUNT(列名)[/code] 的性能大概略低一些。排序如下:

  • COUNT(1)
  • COUNT(*)
  • COUNT(列名)

具体表明

1. COUNT(1)

  • 执行速度: [code]COUNT(1)[/code] 只是将每一行的计数加一,当代 SQL 优化器通常会将 [code]COUNT(1)[/code] 和 [code]COUNT(*)[/code] 优化为雷同的执行筹划,因此执行速度非常快。
  • 优化器行为: 优化器能够辨认 [code]COUNT(1)[/code] 的语义并举行优化处理,使其与 [code]COUNT(*)[/code] 的性能基本一致。

2. COUNT(*)

  • 执行速度: [code]COUNT(*)[/code] 盘算表中全部行的数量,包括全部列,不忽略任何行。当代 SQL 优化器对此有非常好的优化,因此执行速度也非常快,通常与 [code]COUNT(1)[/code] 无异。
  • 优化器行为: 优化器会将 [code]COUNT(*)[/code] 优化为高效的行计数操作。

3. COUNT(列名)

  • 执行速度: [code]COUNT(列名)[/code] 只盘算指定列非 [code]NULL[/code] 值的行数。在执行过程中,数据库必要查抄每一行中特定列是否为 [code]NULL[/code],这会增加一些额外的处理时间。
  • 优化器行为: 只管当代优化器对 [code]COUNT(列名)[/code] 也有优化,但由于必要额外的 [code]NULL[/code] 查抄,性能大概略低于 [code]COUNT(1)[/code] 和 [code]COUNT(*)[/code]。

示例验证

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

创建测试表并插入数据

[code]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; [/code]

执行计数查询并记载执行时间

[code]-- 计时 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; [/code]

这些查询将显示每个 [code]COUNT[/code] 语句的执行时间。通常,[code]COUNT(1)[/code] 和 [code]COUNT(*)[/code] 的执行时间险些雷同,而 [code]COUNT(列名)[/code] 的执行时间大概稍长一些。

总结

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

到此这篇关于SQL中count(1)、count(*) 与 count(列名)区别的文章就先容到这了,更多相干SQL中count(1)、count(*) 与 count(列名)内容请搜索脚本之家从前的文章或继续欣赏下面的相干文章希望各人以后多多支持脚本之家!


来源:https://www.jb51.net/database/3259317gg.htm
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
关闭

站长推荐上一条 /6 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2025-7-1 22:05 , Processed in 0.033945 second(s), 18 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

返回顶部