欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SQL中count(1)、count(*)?與?count(列名)的區(qū)別詳細解釋

 更新時間:2024年08月15日 08:31:40   作者:灰_灰丶灰  
count(1)和count(*)是SQL中用于統(tǒng)計行數(shù)的兩種常見方式,它們的區(qū)別在于統(tǒng)計的對象不同,下面這篇文章主要給大家介紹了關(guān)于SQL中count(1)、count(*)?與?count(列名)區(qū)別的相關(guān)資料,需要的朋友可以參考下

前言

在 SQL 中,COUNT 函數(shù)用于計算查詢結(jié)果集中的行數(shù)。COUNT(1)、COUNT(*) 和 COUNT(列名) 都可以用來統(tǒng)計行數(shù),但它們在實現(xiàn)細節(jié)和使用場景上有一些區(qū)別。以下是詳細的解釋:

1. COUNT(1)

  • 定義COUNT(1) 計算查詢結(jié)果集中的行數(shù)。
  • 實現(xiàn): 在執(zhí)行過程中,COUNT(1) 會將 1 作為一個非空的常量值,并對每一行進行計數(shù)。
  • 效率: 現(xiàn)代的 SQL 優(yōu)化器通常會將 COUNT(1) 和 COUNT(*) 優(yōu)化為相同的執(zhí)行計劃,因此性能基本相同。
  • 用途: 適用于計算總行數(shù),與 COUNT(*) 無區(qū)別。
SELECT COUNT(1) FROM employees;

2. COUNT(*)

  • 定義COUNT(*) 計算查詢結(jié)果集中的總行數(shù),包括所有列,不會忽略任何行,即使某些列包含 NULL。
  • 實現(xiàn): SQL 優(yōu)化器會對 COUNT(*) 進行優(yōu)化,將其轉(zhuǎn)換為統(tǒng)計行數(shù)的操作。
  • 效率: 通常是最常用和推薦的方式,因為其語義明確且優(yōu)化器能夠很好地處理。
  • 用途: 適用于計算總行數(shù),性能通常優(yōu)于 COUNT(列名)
SELECT COUNT(*) FROM employees;

3. COUNT(列名)

  • 定義COUNT(列名) 計算查詢結(jié)果集中某一列非 NULL 值的行數(shù)。
  • 實現(xiàn): 只有當(dāng)指定列的值不為 NULL 時,該行才會被計入結(jié)果。
  • 效率: 由于需要檢查每行中的特定列是否為 NULL,性能可能略低于 COUNT(*) 和 COUNT(1)
  • 用途: 適用于計算某一特定列中非 NULL 值的數(shù)量。
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(列名) 進行統(tǒng)計查詢。請根據(jù)需要調(diào)整數(shù)據(jù)庫連接字符串、用戶名、密碼和 SQL 語句。

執(zhí)行速度

對 COUNT(1)、COUNT(*) 和 COUNT(列名) 的執(zhí)行速度進行排序,通常在現(xiàn)代的 SQL 數(shù)據(jù)庫管理系統(tǒng)中,COUNT(1) 和 COUNT(*) 的性能基本相同,而 COUNT(列名) 的性能可能略低一些。排序如下:

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

詳細解釋

1. COUNT(1)

  • 執(zhí)行速度COUNT(1) 只是將每一行的計數(shù)加一,現(xiàn)代 SQL 優(yōu)化器通常會將 COUNT(1) 和 COUNT(*) 優(yōu)化為相同的執(zhí)行計劃,因此執(zhí)行速度非???。
  • 優(yōu)化器行為: 優(yōu)化器能夠識別 COUNT(1) 的語義并進行優(yōu)化處理,使其與 COUNT(*) 的性能基本一致。

2. COUNT(*)

  • 執(zhí)行速度COUNT(*) 計算表中所有行的數(shù)量,包括所有列,不忽略任何行。現(xiàn)代 SQL 優(yōu)化器對此有非常好的優(yōu)化,因此執(zhí)行速度也非常快,通常與 COUNT(1) 無異。
  • 優(yōu)化器行為: 優(yōu)化器會將 COUNT(*) 優(yōu)化為高效的行計數(shù)操作。

3. COUNT(列名)

  • 執(zhí)行速度COUNT(列名) 只計算指定列非 NULL 值的行數(shù)。在執(zhí)行過程中,數(shù)據(jù)庫需要檢查每一行中特定列是否為 NULL,這會增加一些額外的處理時間。
  • 優(yōu)化器行為: 盡管現(xiàn)代優(yōu)化器對 COUNT(列名) 也有優(yōu)化,但由于需要額外的 NULL 檢查,性能可能略低于 COUNT(1) 和 COUNT(*)。

示例驗證

為了驗證上述結(jié)論,可以使用以下 SQL 腳本在 MySQL 或其他 SQL 數(shù)據(jù)庫中進行測試。請確保表中有足夠多的數(shù)據(jù),以便更明顯地觀察執(zhí)行時間的差異。

創(chuàng)建測試表并插入數(shù)據(jù)

CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    department_id INT,
    name VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 插入大量數(shù)據(jù)
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;

執(zhí)行計數(shù)查詢并記錄執(zhí)行時間

-- 計時 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 語句的執(zhí)行時間。通常,COUNT(1) 和 COUNT(*) 的執(zhí)行時間幾乎相同,而 COUNT(列名) 的執(zhí)行時間可能稍長一些。

總結(jié)

  • COUNT(1): 計算查詢結(jié)果集中的行數(shù),性能與 COUNT(*) 基本相同。
  • COUNT(*): 計算查詢結(jié)果集中的總行數(shù),包括所有列,不忽略任何行,通常是最常用和推薦的方式。
  • COUNT(列名): 計算查詢結(jié)果集中某一列非 NULL 值的行數(shù),適用于統(tǒng)計特定列中的有效數(shù)據(jù)。

到此這篇關(guān)于SQL中count(1)、count(*) 與 count(列名)區(qū)別的文章就介紹到這了,更多相關(guān)SQL中count(1)、count(*) 與 count(列名)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL的主從復(fù)制原理詳細分析

    MySQL的主從復(fù)制原理詳細分析

    這篇文章主要介紹了MySQL的主從復(fù)制原理詳細分析,讀寫分離是基于主從復(fù)制來實現(xiàn)的。文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • MySQL優(yōu)化之InnoDB優(yōu)化

    MySQL優(yōu)化之InnoDB優(yōu)化

    InnoDB是為Mysql處理巨大數(shù)據(jù)量時的最大性能設(shè)計。它的CPU效率可能是任何其它基于磁盤的關(guān)系數(shù)據(jù)庫引擎所不能匹敵的。在數(shù)據(jù)量大的網(wǎng)站或是應(yīng)用中Innodb是倍受青睞的。那么它就不需要優(yōu)化了嗎,答案很顯然:當(dāng)然不是!??!
    2017-03-03
  • 深入理解Mysql的四種隔離級別

    深入理解Mysql的四種隔離級別

    開發(fā)工作中我們會使用到事務(wù),那你們知道事務(wù)又分哪幾種嗎?MYSQL標(biāo)準(zhǔn)定義了4類隔離級別,用來限定事務(wù)內(nèi)外的哪些改變是可見的,哪些是不可見的。低的隔離級一般支持更高的并發(fā)處理,并擁有更低的系統(tǒng)開銷。下面通過這篇文章我們來一起深入理解Mysql中的四種隔離級別。
    2016-11-11
  • MySQL使用select語句查詢指定表中指定列(字段)的數(shù)據(jù)

    MySQL使用select語句查詢指定表中指定列(字段)的數(shù)據(jù)

    本文介紹MySQL數(shù)據(jù)庫中執(zhí)行select查詢語句,查詢指定列的數(shù)據(jù),即指定字段的數(shù)據(jù),需要的朋友可以參考下
    2016-11-11
  • MySQL高級查詢語法分析

    MySQL高級查詢語法分析

    在面試過程中經(jīng)常會遇到sq查詢問題,今天小編通過本文給大家介紹下MySQL高級查詢語法分析,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • sql如何使用group by分組,同時查詢其它字段

    sql如何使用group by分組,同時查詢其它字段

    文章介紹了使用SQL的GROUP BY進行分組查詢時的一些規(guī)則和技巧,主要強調(diào)了在SELECT后面的字段要么是聚合函數(shù)的一部分,要么必須包含在GROUP BY子句中,此外,文章還討論了如何在GROUP BY時查詢其他字段,通過使用MAX或MIN函數(shù)來實現(xiàn)
    2024-12-12
  • 使用PDO防sql注入的原理分析

    使用PDO防sql注入的原理分析

    這篇文章主要給大家介紹了關(guān)于使用PDO防sql注入的原理的相關(guān)資料,文中還給大家介紹了使用PDO的注意事項,通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 解決mysql 組合AND和OR帶來的問題

    解決mysql 組合AND和OR帶來的問題

    這篇文章主要介紹了解決mysql 組合AND和OR帶來的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 詳解如何使用DockerHub官方的MySQL鏡像

    詳解如何使用DockerHub官方的MySQL鏡像

    MySQL是一個廣泛使用的開源關(guān)系型數(shù)據(jù)庫,那如何獲取Mysql Docker鏡像?下面通過這篇文章來一起看看如何使用DockerHub官方的MySQL鏡像,有需要的朋友們可以參考借鑒。
    2016-12-12
  • mysql 8.0.12 安裝使用教程

    mysql 8.0.12 安裝使用教程

    這篇文章主要為大家詳細介紹了mysql 8.0.12 安裝使用教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08

最新評論