使用 SQL 資料庫時,高效率的資料檢索和操作至關重要。一個常見的操作是對錶中的行進行計數,這可以使用COUNT函數來完成。此函數的兩個常用變體是COUNT(*)COUNT(1) 。儘管乍一看它們似乎相同,但它們的用法存在細微的差異和含義。本文將深入探討這些差異,讓您清楚了解何時以及如何使用每個差異。

了解基礎知識

COUNT(*) :此函數計算表中的所有行,包括具有NULL值的行。這是取得總行數最直接的方法。

COUNT(1) :此函數計算括號內表達式的值不為NULL所有行。由於1是常數且絕不為NULL ,因此它可以像COUNT(*)一樣有效地計算所有行。

主要差異

  1. 語法和意圖
  • COUNT(*) :計算表中的每一行,無論這些行中有什麼。

  • COUNT(1) :計算表達式1的值不為NULL每一行。由於1始終不為NULL ,因此它會計算所有行。

  1. 表現
  • 從歷史上看,某些資料庫系統可能以不同的方式優化這些查詢。然而,現代資料庫系統在效能方面對COUNT(*)COUNT(1)處理類似。如果沒有WHERE子句,它們都會導致全表掃描。

  • 在大多數現代 RDBMS(包括 MySQL、PostgreSQL 和 SQL Server)中,效能差異可以忽略不計。這些系統的優化器了解這兩個查詢本質上要求的是同一件事:行數。

  1. 可讀性
  • 出於可讀性考慮,通常首選COUNT(*)因為它清楚地表明了對所有行進行計數的意圖。對於閱讀程式碼的人來說更直觀。

  • 有些開發人員可能會使用COUNT(1) ,他們知道它與COUNT(*)等效,但由於個人或歷史原因而更喜歡它的出現。

實際考慮

  1. 索引利用率
  • 在計算大型表中的行數時,擁有適當的索引可以顯著加快查詢速度。 COUNT(*)COUNT(1)都可以從索引中受益。

  • 如果資料列已建立索引且不包含NULL值,則使用COUNT(column_name)對特定資料列進行計數會更快。這是因為資料庫可以掃描索引而不是整個表。

  1. 計數具體條件
  • 如果需要根據特定條件對行進行計數, COUNT(*)COUNT(1)都可以與WHERE子句一起使用。例如:
     SELECT COUNT(*) FROM employees WHERE department = 'Sales';
     SELECT COUNT(1) FROM employees WHERE department = 'Sales';
  • 兩者之間的選擇仍然取決於個人喜好和可讀性,因為表現仍然具有可比性。
  1. 相容性:
  • COUNT(*)COUNT(1)都是標準 SQL,所有主要關聯式資料庫系統都支援。選擇其中一個不會影響 SQL 程式碼的可移植性。

結論

總之,在大多數現代 SQL 資料庫中, COUNT(*)COUNT(1)在功能上是等效的,都提供表格的總行數。雖然效能差異很小,但COUNT(*)通常因其清晰性和可讀性而受到青睞。在編寫 SQL 查詢時,請理解這些微妙之處可以幫助您編寫更具可讀性和可維護性的程式碼,儘管在大多數情況下它不會對效能產生重大影響。

對於大多數情況,請使用COUNT(*)來計算行數,除非根據您對資料庫最佳化器的理解或個人偏好有特定原因而偏好COUNT(1) 。始終考慮程式碼的可讀性和可維護性,因為未來的開發人員將欣賞清晰易懂的查詢。

透過選擇適當的COUNT函數並有效地利用索引,您可以確保您的 SQL 查詢既高效又易於理解。


原文出處:https://dev.to/msnmongare/count-vs-count1-in-sql-understanding-the-differences-2j4d


共有 0 則留言