这几天学习《MySQL必知必会》发现有一句SQL语句有点绕,所以在这里记录以下,以免日后忘记。
现在由这样两张表,分别是orders表:
customers表:
然后执行以下SQL语句:
得到以下结果:
刚开始看到这个结果很疑惑,想的是子查询中的 COUNT() 不应该是输出一个值吗,为什么这里输出了一列值。其实这个原因很简单,这个子查询的条件是 orderscust_id = customerscust_id ,相当于将orders表中的cust_id与customers表中的 cust_id 比较,对于customers表中的每个 cust_id ,orders表都要比较一次,一共比较5次,所以有5条记录。
这样说可能还是比较绕,现在从简单的例子看起,我们最先开始学习WHERE语句的时候是这样的:
我们假设现在有一张名为user的表,根据 user_id=111 这个条件去检索,相当于把表中user_id这一列中的每一行数据都与111进行比较,如果相等,那就是要检索出的行。
回到问题,根据子查询语句 SELECT COUNT() FROM orders WHERE orderscust_id = customerscust_id 。我们可以拆解的来分析, 相当于customers表中的每个 cust_id 都是上述简单例子中的111,然后用orders表中的 cust_id 这一列去匹配,一共匹配5次,每一次过滤的结果再通过聚合函数 COUNT() 记录行数, 就得到一列别名为 orders 的数据为 2,0,1,1,1 ,最后在最外部的查询中,通过 ORDER BY 排序得到结果 2,1,0,1,1 。
其实书中已经为这个问题给出了解释,就在这个例子后的分析里面。
第一种select count() from tablename
第二种select id ,count() from table group by id;按id分组求
出现在select中的字段要出现在group by中
Count
返回集合中项目的数量(具体数目取决于集合)。
语法
维度
DimensionsCount
返回多维数据集中的维度数,其中包括 [Measures] 维度。
级别
«Dimension»|«Hierarchy»LevelsCount
返回维度或层次结构中的级别数,包括 [All] 级别(如果适用)。
集合 - 语法 1
Count(«Set»[, ExcludeEmpty | IncludeEmpty])
返回集合中的单元数。该语法允许分别使用 ExcludeEmpty 或 IncludeEmpty 标志来排除或包含空单元。
集合 - 语法 2
«Set»Count
返回集合中的单元数,其中包括空单元。
元组
«Tuple»Count
返回元组中的维度数。
说明 默认状态下计算空的单元数。默认情况下,OLE DB 中可比较的 Count 函数不包含空单元。
注释
若要从集合计数中排除空单元,请使用可选的 ExcludeEmpty 关键字。
如果 Time 包含级别 Year 和 Month,Year 的成员是 1994 和 1995,那么下面的示例返回 24:
集合 - 示例 1
Count({TimeMonthMembers})
集合 - 示例 2
TimeMonthMembersCount
返回组中的项数。COUNT与COUNT_BIG函数类似。两个函数唯一的差别是它们的返回值。COUNT始终返回int数据类型值。COUNT_BIG始终返回bigint数据类型值。
Transact-SQL语法约定
语法
COUNT({[[ALL|DISTINCT]expression]|})
备注
COUNT()返回组中的项数。包括NULL值和重复项。
COUNT(ALLexpression)对组中的每一行都计算expression并返回非空值的数量。
COUNT(DISTINCTexpression)对组中的每一行都计算expression并返回唯一非空值的数量。
对于大于2^31-1的返回值,COUNT生成一个错误。这时应使用COUNT_BIG。
参数
ALL
对所有的值进行聚合函数运算。ALL是默认值。
DISTINCT
指定COUNT返回唯一非空值的数量。
expression
除text、image或ntext以外任何类型的表达式。不允许使用聚合函数和子查询。
指定应该计算所有行以返回表中行的总数。COUNT()不需要任何参数,而且不能与DISTINCT一起使用。COUNT()不需要expression参数,因为根据定义,该函数不使用有关任何特定列的信息。COUNT()返回指定表中行数而不删除副本。它对各行分别计数。包括包含空值的行。
重要事项:
使用CUBE或ROLLUP时,不支持区分聚合,如AVG(DISTINCTcolumn_name)、COUNT(DISTINCTcolumn_name)、MAX(DISTINCTcolumn_name)、MIN(DISTINCTcolumn_name)和SUM(DISTINCTcolumn_name)。如果使用这些聚合,MicrosoftSQLServer2005DatabaseEngine将返回一条错误消息并取消查询。
返回类型
int
示例
A使用COUNT和DISTINCT
以下示例列出了在AdventureWorksCycles工作的雇员可以拥有的不同标题的数量。
复制代码
USE;
GO
SELECTCOUNT(DISTINCTTitle)
FROMEmployee;
GO
下面是结果集:
复制代码
-----------
67
(1row(s)affected)
B使用COUNT()
以下示例计算AdventureWorksCycles的雇员总数。
复制代码
USE;
GO
SELECTCOUNT()
FROMEmployee;
GO
下面是结果集:
复制代码
-----------
290
(1row(s)affected)
C组合使用COUNT()和其他聚合函数
以下示例显示可以组合使用COUNT()和选择列表中的其他聚合函数。
复制代码
USE;
GO
SELECTCOUNT(),AVG(Bonus)
FROMSalesSalesPerson
WHERESalesQuota
GO
下面是结果集:
复制代码
--------------------------------
1434721428
(1row(s)affected)
返回组中的项数。COUNT 与 COUNT_BIG 函数类似。两个函数唯一的差别是它们的返回值。COUNT 始终返回 int 数据类型值。COUNT_BIG 始终返回 bigint 数据类型值。
Transact-SQL 语法约定
语法
COUNT ( { [ [ ALL | DISTINCT ] expression ] | } )
备注
COUNT() 返回组中的项数。包括 NULL 值和重复项。
COUNT(ALL expression) 对组中的每一行都计算 expression 并返回非空值的数量。
COUNT(DISTINCT expression) 对组中的每一行都计算 expression 并返回唯一非空值的数量。
对于大于 2^31-1 的返回值,COUNT 生成一个错误。这时应使用 COUNT_BIG。
参数
ALL
对所有的值进行聚合函数运算。ALL 是默认值。
DISTINCT
指定 COUNT 返回唯一非空值的数量。
expression
除 text、image 或 ntext 以外任何类型的表达式。不允许使用聚合函数和子查询。
指定应该计算所有行以返回表中行的总数。COUNT() 不需要任何参数,而且不能与 DISTINCT 一起使用。COUNT() 不需要 expression 参数,因为根据定义,该函数不使用有关任何特定列的信息。COUNT() 返回指定表中行数而不删除副本。它对各行分别计数。包括包含空值的行。
重要事项:
使用 CUBE 或 ROLLUP 时,不支持区分聚合,如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、MAX(DISTINCT column_name)、MIN(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用这些聚合,Microsoft SQL Server 2005 Database Engine 将返回一条错误消息并取消查询。
返回类型
int
示例
A 使用 COUNT 和 DISTINCT
以下示例列出了在 Adventure Works Cycles 工作的雇员可以拥有的不同标题的数量。
复制代码
USE AdventureWorks;
GO
SELECT COUNT(DISTINCT Title)
FROM HumanResourcesEmployee;
GO
下面是结果集:
复制代码
-----------
67
(1 row(s) affected)
B 使用 COUNT()
以下示例计算 Adventure Works Cycles 的雇员总数。
复制代码
USE AdventureWorks;
GO
SELECT COUNT()
FROM HumanResourcesEmployee;
GO
下面是结果集:
复制代码
-----------
290
(1 row(s) affected)
C 组合使用 COUNT() 和其他聚合函数
以下示例显示可以组合使用 COUNT() 和选择列表中的其他聚合函数。
复制代码
USE AdventureWorks;
GO
SELECT COUNT(), AVG(Bonus)
FROM SalesSalesPerson
WHERE SalesQuota > 25000;
GO
下面是结果集:
复制代码
----------- ---------------------
14 34721428
(1 row(s) affected)
sql语句中count,就是DELPHI中ADOrecordcount。
通过ADO实现步骤如下:
1、创建ADOQuery控件,并将sql写入ADOquery;
2、初使化ado,即close>>open,如有条件参数还需传入条件参数;
3、调用ADOrecordcount。
附实例代码如下图:
过多繁琐的sql影响代码质量,及维护成本,以下为两种小技巧处理方式,仅供参考。
第一种,用case ---when---方法
select id
,sum(case when type in (1,2) then [count] else 0 end) as sum1
,sum(case when type in (3) then [count] else 0 end) as sum2
,sum(case when type in (4,5) then [count] else 0 end) as sum3
from 表名
group by id
第二种,if 判断
SELECT SUM( goods_amount ) AS money,
count( ) AS num,
count(if(pay_status=1,true,null)) AS success,
count(if(pay_status=2,true,null)) AS fall
FROM `tab_order_info`
WHERE user_id = 11
select count() from (SELECT COUNT() as cnt FROM table名 GROUP BY uid ) a where acnt > 3
以上就是关于MySQL数据库COUNT和WHERE联合使用全部的内容,包括:MySQL数据库COUNT和WHERE联合使用、数据库中count(all 表达式)函数怎麽用啊、sql中,count的用法.等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)