oracle 中 count(1) 和 count(*) 的區(qū)別在于:count(1) 忽略空值,僅計(jì)算非空行;count(*) 計(jì)算所有行,包括空值;選擇哪個(gè)函數(shù)取決于:是否存在空值、追求性能或一致性的優(yōu)先級(jí)。
Oracle 中 COUNT(1) 和 COUNT(*) 的區(qū)別
在 Oracle 中,COUNT(1) 和 COUNT(*) 都是用于計(jì)算表中記錄數(shù)量的聚合函數(shù),但二者之間存在著細(xì)微的區(qū)別。
COUNT(1)
僅計(jì)算非空值的行。
當(dāng)表中存在空值時(shí),它可以防止錯(cuò)誤計(jì)數(shù)。
因?yàn)樗雎粤丝罩担詧?zhí)行速度比 COUNT(*) 略快。
COUNT(*)
計(jì)算所有行,包括帶空值的。
即使表中有空值,它也會(huì)返回準(zhǔn)確的計(jì)數(shù)。
由于它包括了空值,所以執(zhí)行速度可能比 COUNT(1) 稍慢。
選擇使用哪一個(gè)?
選擇 COUNT(1) 還是 COUNT(*) 取決于以下因素:
是否存在空值:如果表中可能存在空值,使用 COUNT(1) 以避免錯(cuò)誤計(jì)數(shù)。
性能:如果速度至關(guān)重要,并且您確定表中沒(méi)有空值,可以使用 COUNT(1)。
一致性:如果您希望跨所有行進(jìn)行一致的計(jì)數(shù),包括空值,則應(yīng)使用 COUNT(*)。
示例
假設(shè)有一個(gè)名為 students
的表,其中包含以下數(shù)據(jù):
<code>| id | name | age | |---|---|---| | 1 | John | 20 | | 2 | NULL | 25 | | 3 | Mary | 22 |</code>
登錄后復(fù)制
如果使用 COUNT(1) 查詢此表,它將返回以下結(jié)果:
<code>SELECT COUNT(1) FROM students; 2</code>
登錄后復(fù)制
這是因?yàn)?COUNT(1) 忽略了 NULL 值。
如果使用 COUNT(*) 查詢此表,它將返回以下結(jié)果:
<code>SELECT COUNT(*) FROM students; 3</code>
登錄后復(fù)制
這是因?yàn)?COUNT(*) 包含了 NULL 值。