COUNT函数概述COUNT函数实际是使得您能够根据COUNT关键字之后的参数,以不同的方式对列值进行计数的一组函数。在下列小节中,说明COUNT函数的每一形式。COUNT()函数
COUNT 函数概述
COUNT 函数实际是使得您能够根据
COUNT 关键字之后的参数,以不同的方式对列值进行计数的一组函数。
在下列小节中,说明
COUNT 函数的每一形式。
COUNT(*) 函数
COUNT (*) 函数返回满足 SELECT 语句的 WHERE 子句的行数。
下列示例找到在 stock 表中有多少行在
manu_code 列中有值 HRO:
SELECT COUNT(*) FROM stock WHERE manu_code =
'HRO';
下列示例查询“系统监视接口”(SMI)表之一来找到 customer 表中 extent 的数目:
SELECT COUNT(*) FROM sysextents WHERE dbs_name =
'stores' AND tabname = customer";
您可使用
COUNT(*) 作为此一般格式的查询中的 Projection
子句来从 SMI 表获取信息。要了解关于 sysextents 和其他 SMI 表的信息,请参阅描述 sysmaster 数据库的 GBase 8s 管理员参考手册 章节。
如果 SELECT 语句没有 WHERE 子句,则 COUNT (*) 函数返回该表中行的总数。下列示例找到在 stock 表中有多少行:
SELECT COUNT(*) FROM stock;
如果 SELECT 语句包含 GROUP BY 子句,则 COUNT (*) 函数反映在每一组中值的数目。下列示例按第一个名称分组;如果数据库服务器发现同一名称多次出现,则选择这些行:
SELECT fname, COUNT(*) FROM customer GROUP BY
fname
HAVING COUNT(*) > 1;
如果一行或多行的值为 NULL,则 COUNT
(*) 函数在计数中包括 NULL 列,除非 WHERE 子句显式地省略它们。
COUNT DISTINCT 和 COUNT UNIQUE 函数
COUNT
DISTINCT 和
COUNT UNIQUE 函数返回唯一的值。
COUNT DISTINCT 函数返回列或表达式中唯一值的数目,如下例所示。
SELECT COUNT (DISTINCT item_num) FROM items;
如果
COUNT DISTINCT 函数遇到 NULL 值,则它忽略它们,除非指定的列中的每个值都是 NULL。如果每个列值都是 NULL,则 COUNT DISTINCT 函数返回零(0)。
UNIQUE 关键字与 COUNT 函数中的 DISTINCT 关键字有相同的含义。UNIQUE 关键字指导数据库服务器返回列或表达式中唯一的非 NULL 值的数目。下列示例调用 COUNT UNIQUE 函数,但它等同于调用
COUNT
DISTINCT 函数的前一示例:
SELECT COUNT (UNIQUE item_num) FROM items;
如果 Projection 子句未指定 SELECT 语句的 DISTINCT 或 UNIQUE 关键字,则该查询可包括多个 COUNT 函数,每一函数包括 DISTINCT 或 UNIQUE 关键字作为参数列表中的第一个规范,如下例所示:
SELECT COUNT (UNIQUE item_num), COUNT (DISTINCT order_num) FROM
items;
COUNT 列函数
COUNT 列函数返回列或表达式中非 NULL 值的总数目,如下例所示:
SELECT COUNT (item_num) FROM items;
为清楚起见,可将 ALL 关键字置于指定的列名称前面,但不论您包括 ALL 关键字还是省略它,查询结果都一样。
下列示例展示如何在 COUNT 列函数中包括 ALL 关键字:
SELECT COUNT (ALL item_num) FROM items;
COUNT 函数的参数
COUNT 函数接受其他内建的聚集函数的参数列表中允许的相同的表达式作为它的参数,以及仅
COUNT 支持的星号(*)表示法。支持下列内建的表达式的类别作为
COUNT 的参数,如下列示例所示:
l 算术表达式
COUNT(times(gbasedbt.sysfragments.evalpos,2))
SELECT COUNT(a+1), COUNT(2*a), COUNT(5/a), COUNT(times(a, 2)) FROM myTable;
l 位逻辑函数
COUNT(BITAND(gbasedbt.systables.flags,1))
SELECT COUNT(BITAND(a,1)), COUNT(BITOR(8, 20)), COUNT(BITXOR(41, 33)),
COUNT(BITANDNOT(20,-20)), COUNT(BITNOT(8)) FROM myTable;
l 强制转型表达式
COUNT(NULL::int)
l 条件表达式
COUNT(CASE WHEN stock.description = "baseball gloves" THEN 1 ELSE NULL END)
SELECT COUNT(CASE WHEN s=14 THEN 1 ELSE NULL END) AS cnt14 FROM all_types;
SELECT COUNT(NVL (ch, 'Addr unk')) FROM all_types;
SELECT COUNT(NULLIF(ch, NULL)) FROM all_types;
l 常量表达式
COUNT(CURRENT_ROLE)
COUNT(DATETIME (2007-12-6) YEAR TO DAY)
SELECT COUNT("XX"), COUNT(99),COUNT("t") FROM sysmaster:sysdual;
SELECT COUNT(SET{6, 9, 9, 4}) FROM sysmaster:sysdual;
SELECT COUNT("ROW(7, 3, 6.0, 2.0)") FROM sysmaster:sysdual;
SELECT COUNT(USER), COUNT(CURRENT), COUNT(SYSDATE) from sysmaster:sysdual;
SELECT COUNT(CURRENT_ROLE), COUNT(DEFAULT_ROLE) from sysmaster:sysdual;
SELECT COUNT(DBSERVERNAME), COUNT(TODAY), COUNT(CURRENT) from sysmaster:sysdual;
SELECT COUNT(DATETIME (2007-12-6) YEAR TO DAY) from sysmaster:sysdual;
SELECT COUNT(INTERVAL (16) DAY TO DAY) FROM sysmaster:sysdual;
SELECT COUNT(5 UNITS DAY) FROM sysmaster:sysdual;
l 函数表达式
COUNT(LENGTH ('abc') + LENGTH (stock.description}
COUNT(DBINFO('sessionid'))
COUNT(user_proc()) --> proc() 是用户定义例程列表达式
COUNT(gbasedbt.sysfragauth.fragment)
您还可使用星号(*)字符,或列名称,或带有 ALL、DISTINCT 或 UNIQUE 聚集作用域限定符的列名称作为 COUNT 函数的参数,来检索关于表的不同类型的信息。下面的表格总结带有星号或列名称参数的
COUNT 函数的每一下列形式的含义。
COUNT 函数 |
描述 |
COUNT (*) |
返回满足查询的行的数目。如果您未指定 WHERE 子句,此函数返回表中行的总数目。 |
COUNT (DISTINCT) 或 COUNT (UNIQUE) |
返回指定的类中唯一的非 NULL 值的数目 |
COUNT (column) 或 COUNT (ALL column) |
返回指定的列中非 NULL 值的总数目 |
有些示例可帮助展示引用一列的不同形式的
COUNT 函数之间的差异。大部分下列示例查询对应的是 stores_demo 演示数据库中 orders 表的 ship_instruct 列。要获取关于 orders 表的模式以及 ship_instruct 列中的数据值的信息,请参阅 《GBase 8s SQL 指南:参考》
中对演示数据库的描述。
COUNT(*) 函数的示例
在下列示例中,用户想要知道
orders 表中行的总数目。于是,用户在不带有 WHERE 子句的 SELECT 语句中调用 COUNT(*) 函数:
SELECT COUNT(*) AS total_rows FROM orders;
下列表格展示此查询的结果。
在下列示例中,用户想要知道在
orders 表中有多少行在 ship_instruct 列中有 NULL 值。用户在带有 WHERE 子句的 SELECT 语句中调用 COUNT(*) 函数,并在 WHERE 子句中指定 IS NULL 条件:
SELECT COUNT (*) AS no_ship_instruct FROM orders
WHERE ship_instruct IS NULL;
下列表格展示此查询的结果。
在下列示例中,用户想要知道在
orders 表中有多少行在 ship_instruct 列中有值 express。 于是,用户在 projection 列表中调用 COUNT(*) 函数,并在 WHERE 子句中指定等于(=)关系运算符。
SELECT COUNT (*) AS ship_express FROM ORDERS
WHERE ship_instruct = 'express';
下列表格展示此查询的结果。
COUNT DISTINCT 函数的示例
在下一示例中,用户想要知道在
orders 表的 ship_instruct 列中有多少个唯一的非
NULL 值。用户在 SELECT 语句的 projection 列表中调用 COUNT DISTINCT 函数:
SELECT COUNT(DISTINCT ship_instruct) AS
unique_notnulls
FROM orders;
下列表格展示此查询的结果。
COUNT column 函数的示例
在下列示例中,用户想要知道在
orders 表的 ship_instruct 列中有多少非 NULL 值。该用户在 SELECT 语句的 Projection 列表中调用 COUNT(column) 函数:
SELECT COUNT(ship_instruct) AS total_notnulls
FROM orders;
下列表格展示此查询的结果。
对于
ship_instruct 列中非 NULL 值的一个类似的查询可在跟在 COUNT 关键字之后的圆括号中包括 ALL 关键字:
SELECT COUNT(ALL ship_instruct) AS all_notnulls
FROM orders;
下列表格展示该查询结果,不论您包括还是省略 ALL 关键字(因为缺省值为 ALL),查询结果都一样。