Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > SQL中count(1)、count(*) 与 count(列名)

SQL中count(1)、count(*) 与 count(列名)的区别详细解释

作者:灰_灰丶灰

count(1)和count(*)是SQL中用于统计行数的两种常见方式,它们的区别在于统计的对象不同,下面这篇文章主要给大家介绍了关于SQL中count(1)、count(*) 与 count(列名)区别的相关资料,需要的朋友可以参考下

前言

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

1. COUNT(1)

SELECT COUNT(1) FROM employees;

2. COUNT(*)

SELECT COUNT(*) FROM employees;

3. COUNT(列名)

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(列名)

示例验证

为了验证上述结论,可以使用以下 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(列名) 的执行时间可能稍长一些。

总结

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

您可能感兴趣的文章:
阅读全文