返回单一值的函数称做聚集函数(aggregate function)。通过应用程序访问下列聚集函数的结果时,包含结果的“字段名”就是你所使用的实际函数。例如,在分析你的数据库结果时,结果数组的键值可能如下所示:
$keyname = “COUNT(*)”;
$resultkey = “AVG(net_amount)”;
COUNT
COUNT函数计算出结果集合中的数据行数。和其他函数一样它接受一个参数。以下的基本示例能告诉你数据表内的行数:SELECT COUNT(*) FROM Sales;
你也可以用它来计算任何结果集合中的行数。
SELECT COUNT(*) FROM Sales WHERE net_amount > 100;
如果你想看看某特定列有多少行包含非空值,那你不妨对该列使用COUNT函数。注意,除非数据库设置为字段为空时缺省填充NULL否则将返回表内数据行的总数。另外,列出的列在超出一个的情况下会引起错误。
SELECT COUNT(company) FROM Sales;
COUNT还可以用来计算DISTINCT结果集合中的行数。
SELECT COUNT(DISTINCT company, last_name) FROM Sales;
COUNT语句通常用在程序中确定FOR循环的循环次数。

COUNT() 函数返回匹配指定条件的行数。

SQL COUNT() 语法

SQL COUNT(column_name) 语法

COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):

SELECT COUNT(column_name) FROM table_name

SQL COUNT(*) 语法

COUNT(*) 函数返回表中的记录数:

SELECT COUNT(*) FROM table_name

SQL COUNT(DISTINCT column_name) 语法

COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:

SELECT COUNT(DISTINCT column_name) FROM table_name

注释:COUNT(DISTINCT) 适用于 ORACLE 和 Microsoft SQL Server,但是无法用于 Microsoft Access。

SQL COUNT(column_name) 实例

我们拥有下列 "Orders" 表:

O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter

现在,我们希望计算客户 "Carter" 的订单数。

我们使用如下 SQL 语句:

SELECT COUNT(Customer) AS CustomerNilsen FROM OrdersWHERE Customer='Carter'

以上 SQL 语句的结果是 2,因为客户 Carter 共有 2 个订单:

CustomerNilsen
2

SQL COUNT(*) 实例

如果我们省略 WHERE 子句,比如这样:

SELECT COUNT(*) AS NumberOfOrders FROM Orders

结果集类似这样:

NumberOfOrders
6

这是表中的总行数。

SQL COUNT(DISTINCT column_name) 实例

现在,我们希望计算 "Orders" 表中不同客户的数目。

我们使用如下 SQL 语句:

SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders

结果集类似这样:

NumberOfCustomers
3

这是 "Orders" 表中不同客户(Bush, Carter 和 Adams)的数目。

在有关SQL Server的讨论中,时常遇到这样一个问题:到底应该使用COUNT(*)还是使用COUNT(columnname),其中 columnname是要计算纪录数的列名。一些讨论区和邮件列表给出的建议往往都是使用COUNT(columnname)比使用COUNT(*)更 好。但这并不总是对的,有时甚至完全错了。尽管有些场合可以(或者说是应该)使用COUNT(columnname),但不能总是这样使用。给出错误建议 的原因可能是人们对SQL Server处理数据的内部机制还缺乏了解。

COUNT()详解

首先要了解使用COUNT()与其它替代方法之间有何不同,以及这个不同的成因。COUNT()的完整语法是:

COUNT ( { [ ALL | DISTINCT ] expr ession } | * ) )

其 中,expr ession可以是任意表达式,但不能处理唯一标识符,文本,二进制或图像数据,也不能使用聚合函数与子查询。虽然表达式大多都是针对表中的 一个列,但ALL是缺省的,所以COUNT(expr ession)等价于COUNT(ALL expr ession)。

COUNT(*) 返回表的所有纪录数,而COUNT(expr ession)则返回符合表达式计算结果的非空纪录数。通常情况 下,COUNT(DISTINCT expr ession)将相同的纪录只计算为一个。可以看到,根据不同的COUNT()描述,可以得到不同的查询结 果。

实践出真知

如前所说,有人以为COUNT(columnname)比COUNT(*)要快,因为 COUNT(*)必须读取所有列的纪录(就象运行Select * FROM MYTABLE指令),而COUNT(columnname)只需读取指定 列的纪录。这个理解是错误的,有好几个理由。

首先,如果SQL Server不读取整行纪录就无法得到单个列的内容。 SQL Server用磁盘上8KB的数据页来储存各行纪录。这些页面中安放一行或多行纪录(取决于每行纪录的大小。在有些意外情况下,一行纪录可能大于 8060 字节),当SQL Server要处理这些页面数据时就将数据读到内存(RAM)中。为确定单行(或多行)纪录的值,要将完整的 磁盘页 读到内存中。这些页面可能已经缓存在内存,这样就会加快运行速度。但SQL仍然要从内存中读取整页的数据来检查一行纪录中的某个列数据。

因为只要求获得纪录数(行数),SQL Server不是读取这些数据页,而是读取索引数据 - 如果有索引的话。索引的存储方法与数据一样,也使用一个8  KB 的索引页。索引总是比整行数据要小(索引只包括数列甚至一列的数据),一个索引页可以安放比一个数据页更多行的纪录。这意味着SQL Server用索引页检查纪录数时读取的页面数量比用数据页要少,这是好事。

不 但COUNT(索引域名)这样做,COUNT(*)同样也使用索引来计算行数。有时,COUNT(columnname)中指定的列不是索引列,而表中有 其它列做索引。在这种情况下,COUNT(*)可以使用索引列来计算纪录数,而COUNT(非索引域名)就不得不通过读取数据页来计算非空纪录数了。

可以用SQL Query

Analyzer来测试下面的脚本(如果测试器未将结果显示设置为文本方式,可按Ctrl-T设置):

USE Northwind
GO
SET STATISTICS IO ON
Select COUNT(*) FROM orders
Select COUNT(CustomerId) FROM orders
Select * FROM orders
SET STATISTICS IO OFF

指 令SET STATISTICS IO ON要求SQL Server输出执行查询时所需的I/O使用数量,可以用这个量来比较不同查询语句中的资源使用 情况,从而决定该用哪种查询。脚本执行后立即可得到统计结果。这里关心的是读取逻辑和/或物理页的数量。逻辑页是从内存读取数据(数据页和/或索引页)的 页面数量,物理页是从磁盘读取的页面数量。在我的机器上用二个COUNT()得到的纪录数都是830,如果从没有在Order表中增删过纪录,那么你也应 该得到这个数。现在来看看从运行上述脚本后得到的逻辑页读次数(多运行几次脚本,可以缓存物理页),我的第一条指令读取3次逻辑页,而第二条指令读取了 21次逻辑页。因为Order表中的CustomerId列没有建索引,所以第二条指令读取的是数据页,而第一条指令读取的是索引页(我的机器 上,Order表有ShippersOrders索引)。

到底用哪条指令好?

如上阐明,用COUNT(*)肯定 不会更差。相反,有时用COUNT(expr ession)反而更差。通常表中都有索引列,所以不会遇到上述问题。但糟糕的是COUNT的使用不当可能得 到与预期不同的结果!比方说,一个早期的应用中用COUNT(columnname)来计算指定列的行数,而这个列是不许有空值(NULL)的。后来又把 这个列设定为允许空值,这时应用得到的不是整个表的行数,而是表中指定列的非空行数!这可能不是早先设计的目的并可能因此导致大错。

但是...

通 常情况下,没有理由不使用COUNT(*)。但正如本文开始所说,有时要(或应该)用COUNT(expr ession)。一个明显的例子是只想得到指定 列的非空行数。另一个特例是在使用COUNT()的同时使用还要用聚合函数。例如,有个表要对数据进行排序,某些行内存在空值(NULL )。现在要求列 的平均值。通常可以用AVG()来达到目的。但为了说明问题,我们不使用这个函数。

比较以下二个指令就能看到问题症结所在:

Select SUM(column) / COUNT(*) FROM table
Select SUM(column) / COUNT(column) FROM table

这 二个指令将返回不同的结果。因为SUM()是忽略NULL值的(NULL不按0计算)。如果总数(sum)是1500,行数为150,其中column列 有50行纪录为空值,那么,第一条查询指令得到的结果是10(1500/150),而第二条查询指令得到的结果是15(1500/100)。在我的数据库 咨询工作中经常遇到这个问题。这也是那些不了解不同聚合函数(如上述的SUM()和COUNT())处理空值的不同方式的SQL程序员所遇到的问题所在。

SQL count详细用法相关推荐

  1. sql count用法_SQL学习笔记3:count(*)函数

    1.count(*)函数用法 COUNT(*) 函数返回表中的记录数,具体来说,返回值是一个数字. 语法: 返回表中所有记录的数量:SELECT COUNT(*) FROM table_name 返回 ...

  2. sql not exists用法_牛客网数据库SQL实战详细剖析(5160)(更新完结)

    文章来源:大数据肌肉猿 作者:无精疯 这是一个系列文章,总共61题,分6期,有答案以及解题思路,并附上解题的一个思考过程. 具体题目可参考牛客网的SQL实战模块: https://www.nowcod ...

  3. SQL COUNT() 语法总结及用法【原创】

    Author:张继飞             char sql[200];             int rc, ncols, iCount;             char *tail;     ...

  4. sql replace替换多个字符_牛客网数据库SQL实战详细剖析(4150)

    文章来源:大数据肌肉猿 作者:无精疯 这是一个系列文章,总共61题,分6期,有答案以及解题思路,并附上解题的一个思考过程.具体题目可参考牛客网的SQL实战模块:https://www.nowcoder ...

  5. C# SqlSugar框架的学习使用(五)-- 更新和删除数据的详细用法

    前言 上一篇<C# SqlSugar框架的学习使用(四)-- 插入数据的详细用法>我们已经把SqlSugar的插入多种用法实现了,这篇我们就来说说更新数据和删除数据的多种用法.我们就用上一 ...

  6. Android命令行工具logcat详细用法!

    logcat是Android中一个命令行工具,可以用于得到程序的log信息. 见板凳详细说明!      本贴内容来自网络,引用网址为:http://hi.baidu.com/%C9%C1%D2%AB ...

  7. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦 ...

  8. SQL CASE WHEN用法

    SQL CASE WHEN用法 CASE 可能是 SQL 中被误用最多的关键字之一.虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法.例如,你可以在 WHERE 子句中使用 CASE . ...

  9. mysql left/right join算法效率分析_mysql left join,right join,inner join超详细用法分析

    MySQL left join,right join,inner join超详细用法分析 下面是例子分析 表A记录如下: aID        aNum 1           a20050111 2 ...

最新文章

  1. 这样的烂代码,我实习的时候都写不出来!
  2. Golang结构体struct的使用(结构体嵌套, 匿名结构体等)
  3. torch_geometric 笔记:global_mean_pool
  4. 阿里巴巴的云原生与开发者
  5. 音视频技术开发周刊 | 194
  6. Spark _04集群搭建及测试
  7. 英语中十二个月份的由来
  8. 计算机三级网络技术题库第15套,第15套 上机操作题
  9. Django 如何展示Media底下的图片
  10. 达芬奇调色软件被曝两个远程代码执行缺陷
  11. php 做圆形头像,php制作圆形用户头像方法
  12. 窗体最小化时隐藏窗体_delphi基础
  13. Diamond书写FPGA代码
  14. Navicat连接Mysql方法教程
  15. python 画图工具——matplotlib命令式函数
  16. 三天两夜,1M图片优化到100kb/肝都熬爆了
  17. 原来String、StringBuffer、StringBuilder底层是这么回事
  18. 驰骋工作流引擎-督查督办系统
  19. 微信小程序上传图片裁剪工具image-cropper使用
  20. 神经网络的图谱是什么,图神经网络和神经网络

热门文章

  1. 使用opencv调用摄像头识别颜色(python版)
  2. SQL Server 触发器( trigger ) ------- 用例详解( 你需要举一反三的触发器实用方法都在这了 )
  3. LeetCode刷题记录(一)
  4. while、dowhile和for循环
  5. 韩顺平Linux视频教程—笔记(全)
  6. Sql server找不到启动图标
  7. pytest parametrize 传参和启动pytest项目报错make sure your test modules/packages have valid Python names
  8. SLAM总结(二)-数学基础之求导和线性方程求解
  9. android listview替代,Android笔记——RecyclerView替代ListView
  10. 小白的模拟电路初步学习20日打卡(14)