Navicat 部落格

SQL Count() 函式的多種變體 2020 年 8 月 27 日,由 Robert Gravelle 撰寫

如果你使用了關聯式資料庫(RDBMS)一段時間,幾乎可以肯定你已用過 SQL COUNT() 函式。這樣,你無疑已經知道 COUNT() 函式是用於傳回資料表中由 WHERE 子句中指定條件過濾的列數或欄數。它靈活的語法和廣泛的支援使其成為 SQL 中最多樣化和實用的函式之一。在今天的文章中,我們將了解它的眾多排列並學習如何取得各種計數。

一個函式,多種輸入參數變化

作為 ANSI SQL 函式,COUNT() 接受通用 SQL 2003 ANSI 標準語法中的參數。話雖如此,不同的資料庫供應商可能有不同的方式來套用 COUNT() 函式。MySQL、PostgreSQL 和 Microsoft SQL Server 均依照 ANSI SQL 語法:

COUNT(*)
COUNT( [ALL|DISTINCT] expression )

同時,DB2 和 Oracle 的語法則略有不同:

COUNT ({*|[DISTINCT] expression}) OVER (window_clause)

在本文中,我們將重點介紹 SQL 2003 ANSI 標準語法。以下是所有輸入參數的含義:

  • ALL:顧名思義,ALL 將 COUNT 套用於所有數值,以便它傳回非 Null 值的數量。
  • DISTINCT:忽略重複的值,以便 COUNT 傳回唯一的非 Null 值的數量。
  • Expression:由以下部分組成的運算式:
    • 一個常數、變數、純量函式
    • 一個欄名稱
    • SQL 查詢的一部分,該查詢將數值與其他數值相比較
    運算式不能包含文字或圖像類型。也不能有彙總函式和子查詢。
  • *:無論目標資料表中的列是否包含 NULL,計算所有列。

實際範例

為了對各種語法排列及其對 COUNT 輸出的影響進行取樣,讓我們將 COUNT() 函式套用於以下的員工資料表。這是在 Navicat for MySQL 中顯示的資料表:

employee_table (48K)

現在,這個查詢計算了幾項資料的數量:

  • 員工總人數
  • 經理人數
  • 非經理人數
  • 部門數量
employee_count_query (69K)

如上面的查詢所示,取得不同的計數完全與如何使用 COUNT() 函式有關。關於何時使用特定的欄名稱而不是星號,請注意前者將不計算 Null,而後者通常將計算 Null,因為它包括所有欄。至於何時使用 DISTINCT,請考慮將其用於具有重複值的欄,這通常包含定義為非唯一和/或非主索引鍵的欄。

總結

SQL COUNT() 函式靈活的語法和廣泛的支援使其成為 SQL 中最多樣化和實用的函式之一。至於語法,如果你覺得 COUNT() 函式的語法很難記,Navicat 可以提醒你!它的自動完成建議清單不僅提供資料表名稱和欄名稱,還提供預存程序和函式,包括 COUNT()。你會發現 COUNT() 有兩個版本:一個是簡單用法,另一個是更複雜的用法:

count_function_in_suggestion_list (44K)
Navicat 文章
頻道記錄
分享
部落格封存檔