最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL?count()聚合函數(shù)詳解

 更新時(shí)間:2025年06月28日 14:25:43   作者:十六點(diǎn)五  
MySQL中的COUNT()函數(shù),它是SQL中最常用的聚合函數(shù)之一,用于計(jì)算表中符合特定條件的行數(shù),本文給大家介紹MySQL count()聚合函數(shù),感興趣的朋友一起看看吧

深入剖析一下 MySQL 中的 COUNT() 函數(shù)。它是 SQL 中最常用的聚合函數(shù)之一,用于計(jì)算表中符合特定條件的行數(shù)。

核心功能

COUNT() 函數(shù)的核心功能是計(jì)數(shù)。它可以用來:

  1. 統(tǒng)計(jì)表中所有行的總數(shù)。

  2. 統(tǒng)計(jì)表中特定列的非 NULL 值的數(shù)量。

  3. 結(jié)合 WHERE 子句,統(tǒng)計(jì)滿足特定條件的行的數(shù)量。

  4. 結(jié)合 GROUP BY 子句,統(tǒng)計(jì)每個(gè)分組中的行數(shù)。

語法形式

COUNT() 函數(shù)主要有三種語法形式,它們?cè)谛袨楹托阅苌嫌兴煌?/p>

  1. COUNT(*)

    • 功能: 統(tǒng)計(jì)查詢結(jié)果集中的總行數(shù)

    • 計(jì)數(shù)方式: 它計(jì)算所有行,不管該行中的列是否包含 NULL 值。即使整行所有列都是 NULL,COUNT(*) 也會(huì)將其計(jì)入。

    • 性能: 在大多數(shù)現(xiàn)代 MySQL 版本(尤其是 InnoDB 存儲(chǔ)引擎)中,COUNT(*) 通常經(jīng)過高度優(yōu)化。MySQL 知道 COUNT(*) 只需要行數(shù),而不需要檢查任何具體的列值。這是獲取表總行數(shù)或分組行數(shù)的推薦方式。

    • 示例:

      -- 統(tǒng)計(jì) `users` 表中的總用戶數(shù)
      SELECT COUNT(*) FROM users;
      -- 統(tǒng)計(jì)每個(gè)部門 (`dept_id`) 的員工數(shù)量
      SELECT dept_id, COUNT(*) AS employee_count
      FROM employees
      GROUP BY dept_id;
  2. COUNT(expression)

    • 功能: 統(tǒng)計(jì)表達(dá)式 expression 計(jì)算結(jié)果為非 NULL 值的行數(shù)。

    • 計(jì)數(shù)方式: 對(duì)每一行計(jì)算給定的表達(dá)式 (expression)。如果表達(dá)式的結(jié)果是 非 NULL,則計(jì)數(shù)加 1;如果結(jié)果是 NULL,則不計(jì)入。

    • expression 可以是:

      • 一個(gè)列名 (COUNT(column_name)):統(tǒng)計(jì)該列中非 NULL 值的數(shù)量。這是最常見的使用方式。

      • 一個(gè)常量 (COUNT(1)COUNT('abc')):因?yàn)槌A坑肋h(yuǎn)是非 NULL 的,所以 COUNT(1) 或 COUNT('任何常量') 的行為幾乎總是等同于 COUNT(*),統(tǒng)計(jì)總行數(shù)。現(xiàn)代 MySQL 優(yōu)化器通常會(huì)將 COUNT(1) 轉(zhuǎn)換為 COUNT(*) 來執(zhí)行。

      • 一個(gè)表達(dá)式 (COUNT(UPPER(name))COUNT(price * quantity)):先計(jì)算表達(dá)式,然后判斷結(jié)果是否為 NULL。

    • 性能: 如果 expression 是一個(gè)列名,MySQL 需要檢查該列的值是否為 NULL。如果該列沒有索引,對(duì)于大表來說,這可能比 COUNT(*) 稍慢一些(因?yàn)?nbsp;COUNT(*) 可以利用存儲(chǔ)引擎的內(nèi)部?jī)?yōu)化)。如果 expression 是常量,性能通常與 COUNT(*) 相當(dāng)。

    • 示例:

      -- 統(tǒng)計(jì) `users` 表中設(shè)置了郵箱 (`email` 列非 NULL) 的用戶數(shù)
      SELECT COUNT(email) FROM users;
      -- 統(tǒng)計(jì) `orders` 表中總金額 (`total_amount`) 大于 100 的訂單數(shù)量 (假設(shè) total_amount 可為 NULL)
      SELECT COUNT(total_amount > 100) FROM orders;
      -- 注意:`total_amount > 100` 的結(jié)果是布爾值 (TRUE, FALSE, 或 NULL)。在 MySQL 中,TRUE=1, FALSE=0, NULL=NULL。所以 COUNT 只會(huì)計(jì)入結(jié)果為 TRUE (1) 的非 NULL 行。
      -- 更常見的寫法是結(jié)合 WHERE: SELECT COUNT(*) FROM orders WHERE total_amount > 100;
      -- 統(tǒng)計(jì) `products` 表中 `name` 字段非 NULL 的產(chǎn)品數(shù)量 (等同于 COUNT(name))
      SELECT COUNT(*) FROM products WHERE name IS NOT NULL; -- 另一種寫法
  3. COUNT(DISTINCT expression)

    • 功能: 統(tǒng)計(jì)表達(dá)式 expression 計(jì)算結(jié)果中不同(唯一、去重后)的非 NULL 值的數(shù)量。

    • 計(jì)數(shù)方式: 首先計(jì)算所有行中 expression 的值,然后去除結(jié)果集中的 NULL 值,最后對(duì)剩下的非 NULL 值進(jìn)行去重,統(tǒng)計(jì)去重后的數(shù)量。

    • 性能: 這是性能開銷最大的一種形式,因?yàn)樗婕暗綄?duì)所有非 NULL 值進(jìn)行排序或使用哈希表來去重。對(duì)于大表,尤其是在沒有合適索引的情況下,可能會(huì)比較慢。

    • 示例:

      -- 統(tǒng)計(jì) `users` 表中來自不同城市 (`city`) 的數(shù)量 (忽略 city 為 NULL 的行)
      SELECT COUNT(DISTINCT city) FROM users;
      -- 統(tǒng)計(jì) `orders` 表中每個(gè)客戶 (`customer_id`) 下了多少種不同商品 (`product_id`) 的訂單
      SELECT customer_id, COUNT(DISTINCT product_id) AS unique_products_ordered
      FROM orders
      GROUP BY customer_id;

重要特性與行為

  1. COUNT() 與 NULL:

    • COUNT(*)不關(guān)心 NULL,統(tǒng)計(jì)所有行。

    • COUNT(expression):只統(tǒng)計(jì) expression 計(jì)算結(jié)果為非 NULL 的行。

    • COUNT(DISTINCT expression):只統(tǒng)計(jì) expression 計(jì)算結(jié)果為非 NULL 的值,并且對(duì)這些非 NULL 值進(jìn)行去重計(jì)數(shù)。

  2. 聚合函數(shù): COUNT() 是一個(gè)聚合函數(shù)。它通常作用于一組行(可能是整個(gè)表,或者 GROUP BY 定義的每個(gè)組),并返回一個(gè)單一的匯總值。

  3. 與 WHERE 結(jié)合: WHERE 子句在聚合發(fā)生之前過濾行。COUNT() 只會(huì)計(jì)入通過 WHERE 條件過濾后的行。

    SELECT COUNT(*) FROM orders WHERE order_date >= '2024-01-01'; -- 統(tǒng)計(jì)2024年及之后的訂單數(shù)
  4. 與 GROUP BY 結(jié)合: GROUP BY 將數(shù)據(jù)分成多個(gè)組,COUNT() 會(huì)為每個(gè)組單獨(dú)計(jì)算行數(shù)或非 NULL 值的數(shù)量。

    SELECT status, COUNT(*) AS order_count FROM orders GROUP BY status; -- 統(tǒng)計(jì)每種訂單狀態(tài)的數(shù)量
  5. 與 HAVING 結(jié)合: HAVING 子句在聚合發(fā)生之后過濾分組結(jié)果。它基于聚合結(jié)果(如 COUNT(*))來篩選哪些分組應(yīng)該出現(xiàn)在最終結(jié)果中。

    SELECT country, COUNT(*) AS user_count
    FROM users
    GROUP BY country
    HAVING user_count > 100; -- 只顯示用戶數(shù)超過100的國家
  6. COUNT() 返回類型: COUNT() 函數(shù)返回一個(gè) BIGINT 類型的值(64位整數(shù))。即使結(jié)果很小,返回類型也是 BIGINT

  7. 沒有匹配行: 如果查詢沒有匹配任何行(例如,WHERE 條件太嚴(yán)格),COUNT() 將返回 0。COUNT(DISTINCT ...) 在沒有非 NULL 值時(shí)也返回 0。

  8. 性能考慮(MyISAM vs InnoDB):

    • MyISAM: 對(duì)于 COUNT(*) 且沒有 WHERE 條件的查詢(如 SELECT COUNT(*) FROM myisam_table;),MyISAM 引擎會(huì)極其快速地返回結(jié)果,因?yàn)樗苯釉诒淼脑獢?shù)據(jù)中存儲(chǔ)了精確的總行數(shù)。

    • InnoDB: InnoDB 引擎不存儲(chǔ)精確的總行數(shù)在元數(shù)據(jù)中。它需要掃描表(或最小的可用索引)來計(jì)算 COUNT(*)(即使沒有 WHERE 子句)。這是因?yàn)?MVCC(多版本并發(fā)控制)機(jī)制使得同時(shí)存在的事務(wù)可能看到表中不同版本的行數(shù)。因此,對(duì)于非常大的 InnoDB 表,SELECT COUNT(*) FROM huge_innodb_table; 可能會(huì)比較慢。估算行數(shù)可以考慮查詢 information_schema.TABLES 表的 TABLE_ROWS 列(注意這是估算值,不精確?。蛘呤褂糜?jì)數(shù)器表、緩存等技術(shù)。

如何選擇使用哪種形式?

  1. 需要總行數(shù)? ?? 優(yōu)先使用 COUNT(*)。它是語義最清晰(計(jì)算行數(shù)),且在 MySQL 中通常性能最佳。

  2. 需要統(tǒng)計(jì)特定列的非 NULL 值數(shù)量? ?? 使用 COUNT(column_name)

  3. 需要統(tǒng)計(jì)滿足特定條件的行數(shù)? ?? 結(jié)合 WHERE 子句使用 COUNT(*) (推薦) 或 COUNT(1)

    • SELECT COUNT(*) FROM table WHERE condition;

  4. 需要統(tǒng)計(jì)某一列中不同值的數(shù)量(去重計(jì)數(shù))? ?? 使用 COUNT(DISTINCT column_name)

  5. 需要統(tǒng)計(jì)滿足某個(gè)表達(dá)式條件的行數(shù)? ?? 使用 COUNT(expression),或者更常見的,使用 COUNT(*) + WHERE 子句。

    • SELECT COUNT(IF(score > 90, 1, NULL)) FROM students; -- 統(tǒng)計(jì)分?jǐn)?shù)大于90的學(xué)生數(shù)

    • 等價(jià)于 SELECT COUNT(*) FROM students WHERE score > 90; (通常更推薦后者)

總結(jié)

COUNT() 函數(shù)是 MySQL 中用于計(jì)數(shù)的核心聚合函數(shù)。理解 COUNT(*)、COUNT(expression) 和 COUNT(DISTINCT expression) 之間的區(qū)別至關(guān)重要:

  • COUNT(*)統(tǒng)計(jì)所有行(推薦用于計(jì)數(shù)總行數(shù)或分組行數(shù))。

  • COUNT(expression)統(tǒng)計(jì) expression 結(jié)果非 NULL 的行數(shù)(用于統(tǒng)計(jì)特定列的非 NULL 值)。

  • COUNT(DISTINCT expression)統(tǒng)計(jì) expression 結(jié)果中不同(唯一)的非 NULL 值的數(shù)量(用于去重計(jì)數(shù))。

根據(jù)你的具體需求(是統(tǒng)計(jì)行數(shù)、特定列的非 NULL 值數(shù)、還是唯一值數(shù))選擇正確的形式,并結(jié)合 WHEREGROUP BY、HAVING 子句來精確控制計(jì)數(shù)范圍

到此這篇關(guān)于MySQL count()聚合函數(shù)詳解的文章就介紹到這了,更多相關(guān)mysql  count() 聚合函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL 連接查詢的原理和應(yīng)用

    MySQL 連接查詢的原理和應(yīng)用

    這篇文章主要介紹了MySQL 連接查詢的原理和應(yīng)用,幫助大家更好的理解和學(xué)習(xí)MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-11-11
  • 詳細(xì)講一講MySQL中Select語句的執(zhí)行順序

    詳細(xì)講一講MySQL中Select語句的執(zhí)行順序

    SQL和MySQL的語句執(zhí)行順序是數(shù)據(jù)庫操作中的關(guān)鍵概念,理解這一順序有助于編寫更高效、更精確的查詢,這篇文章主要介紹了MySQL中Select語句執(zhí)行順序的相關(guān)資料,需要的朋友可以參考下
    2026-01-01
  • MySQL如何查詢Binlog 生成時(shí)間

    MySQL如何查詢Binlog 生成時(shí)間

    這篇文章主要介紹了MySQL如何查詢Binlog 生成時(shí)間,通過讀取 Binlog FORMAT_DESCRIPTION_EVENT header 時(shí)間戳來實(shí)現(xiàn)讀取 Binlog 生產(chǎn)時(shí)間,本文給大家詳細(xì)講解,需要的朋友可以參考下
    2023-03-03
  • 一文簡(jiǎn)單介紹mysql的事務(wù)、鎖以及MVCC

    一文簡(jiǎn)單介紹mysql的事務(wù)、鎖以及MVCC

    在MySQL的InnoDB存儲(chǔ)引擎中,鎖是用于管理并發(fā)訪問的一種機(jī)制,MVCC的核心思想是通過維護(hù)數(shù)據(jù)的多個(gè)版本來實(shí)現(xiàn)并發(fā)控制,這篇文章主要介紹了mysql事務(wù)、鎖以及MVCC的相關(guān)資料,需要的朋友可以參考下
    2025-12-12
  • MySQL?到Oracle?實(shí)時(shí)數(shù)據(jù)同步

    MySQL?到Oracle?實(shí)時(shí)數(shù)據(jù)同步

    這篇文章主要介紹了MySQL?到Oracle?實(shí)時(shí)數(shù)據(jù)同步,本次?MySQL?數(shù)據(jù)實(shí)時(shí)同步到?Oracle大概只花了幾分鐘就完成。使用的工具是Tapdata?Cloud?,這個(gè)工具是永久免費(fèi)的,需要的朋友可以參考一下
    2022-01-01
  • MySQL與SQLserver的差異對(duì)比

    MySQL與SQLserver的差異對(duì)比

    SQLServer和MySQL是兩種常見的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),們?cè)诠δ芎陀猛旧嫌泻芏嘞嗨浦帲灿幸恍╋@著的差異,本文將詳細(xì)介紹SQLServer和MySQL之間的差異,并對(duì)它們的優(yōu)缺點(diǎn)進(jìn)行比較,以及使用時(shí)需要注意的事項(xiàng)
    2023-05-05
  • SQL中count(1)、count(*)?與?count(列名)的區(qū)別詳細(xì)解釋

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

    count(1)和count(*)是SQL中用于統(tǒng)計(jì)行數(shù)的兩種常見方式,它們的區(qū)別在于統(tǒng)計(jì)的對(duì)象不同,下面這篇文章主要給大家介紹了關(guān)于SQL中count(1)、count(*)?與?count(列名)區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • MySQL 實(shí)現(xiàn)數(shù)據(jù)分片進(jìn)行數(shù)據(jù)查詢的方案

    MySQL 實(shí)現(xiàn)數(shù)據(jù)分片進(jìn)行數(shù)據(jù)查詢的方案

    本文介紹MySQL數(shù)據(jù)分片技術(shù),包括垂直分片和水平分片,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08
  • MySQL不使用子查詢的原因及優(yōu)化案例

    MySQL不使用子查詢的原因及優(yōu)化案例

    對(duì)于mysql,不推薦使用子查詢,效率太差,執(zhí)行子查詢時(shí),MYSQL需要?jiǎng)?chuàng)建臨時(shí)表,查詢完畢后再刪除這些臨時(shí)表,所以,子查詢的速度會(huì)受到一定的影響,本文給大家詳細(xì)介紹了MySQL不使用子查詢的原因及優(yōu)化案例,需要的朋友可以參考下
    2025-01-01
  • MySQL中查詢的有關(guān)英文字母大小寫問題的分析

    MySQL中查詢的有關(guān)英文字母大小寫問題的分析

    這篇文章主要介紹了MySQL中查詢的有關(guān)英文字母大小寫問題的分析,作者從多個(gè)角度進(jìn)行了實(shí)驗(yàn),需要的朋友可以參考下
    2015-05-05

最新評(píng)論

丰原市| 文昌市| 鄢陵县| 黄陵县| 宁南县| 高邑县| 永康市| 宿迁市| 金溪县| 北海市| 西乌| 自贡市| 弥渡县| 家居| 山阴县| 刚察县| 三原县| 汕尾市| 南溪县| 乐至县| 定远县| 会昌县| 青龙| 襄樊市| 团风县| 寿宁县| 天镇县| 昭觉县| 杨浦区| 昭通市| 郁南县| 弋阳县| 渝中区| 汾西县| 罗定市| 手游| 仪陇县| 商洛市| 敖汉旗| 林甸县| 香格里拉县|