COUNT有这种用法吗?having count 用法(...

while和do-while的使用方法_百度知道博客访问: 108059
博文数量: 32
博客积分: 2090
博客等级: 大尉
技术积分: 400
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Mysql/postgreSQL
SQL 语句的COUNT有两种用途1. 用来计算行数——Count(*)2. 用来计算某个值的数量——COUNT(col1)Count(*) 永远返回的都是结果集中的行数,而COUNT(col1)只返回col1值非空的记录数,如果col1值全部非空,Count(*)和COUNT(col1)的结果是相同的。Count的用法很简单,可在实际开发过程中还是能找到使用不那么精确的地方很多时候我们会利用Count(*)来检查是否存在满足条件的数据,例如删除一个用户角色的时候,会通过/****************************************************************************************************/select count(*) from tbl_user_role user_role where user_role.role_id=#roldId#/****************************************************************************************************/来判断是否用户角色是否因被某个用户引用而不能删除。其实,我们的业务只要求确认是否有满足的条件的记录存在,而根本不关心满足记录的数量。select count(*)在这个例子中的用法会导致不必要的磁盘扫描和记录检索。正确的写法应该是/*************************************Mysql***************************************************************************/select exists (select * from tbl_user_role user_role where user_role.role_id=10 limit 1)&/*************************************Mysql***************************************************************************//*************************************Oracle***************************************************************************/select count(*) from dual where exists (select * from tbl_user_role user_role where user_role.role_id=10 and rownum=1)&/*************************************Oracle***************************************************************************/写法可能有多种,原理很简单,就是只找到符合记录的第一条就终止查询。
阅读(639) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。1126人阅读
&&&&在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数, 例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。
SELECT SUM(population) FROM bbc
这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即国家的总人口数。
GROUP BY用法
&&&&Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。
注意:group by 是先排序后分组;
&&&&举例子说明:如果要用到group by 一般用到的就是“每这个字段” 例如说明现在有一个这样的表:每个部门有多少人 就要用到分组的技术
select DepartmentID as '部门名称',
COUNT(*) as '个数' from BasicDepartment group by DepartmentID
&&&&这个就是使用了group by +字段进行了分组,其中我们就可以理解为我们按照了部门的名称ID,DepartmentID将数据集进行了分组;然后再进行各个组的统计数据分别有多少;
&&&&通俗一点说:group by 字段1,字段2。。。(整个表中不止这两个字段)表示数据集中字段1相等,字段2也相等的数据归为一组,只显示一条数据。那么你可以对字段3进行统计(求和,求平均值等)
select DepartmentID,DepartmentName from BasicDepartment group by DepartmentID
–将会出现错误
&&&&选择列表中的列 ‘DepartmentName’ 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。这就是我们需要注意的一点,如果在返回集字段中,这些字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。为什么呢,根据前面的说明:DepartmentID相等的数据归为一组,只显示一条记录,那如果数据集中有这样三条数据。
&&&&&&DepartmentID
&&&& &&&&&&&&&&&&&&&&&&&& && DepartmentName
&&&&&&&&&&&&dept001&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&技术部
&&&&&&&&&&&&dept001&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&综合部
&&&&&&&&&&&&dept001&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&人力部
那我只能显示一条记录,我显示哪个?没法判断了。到这里有三种选择:
把DepartmentName也加入到分组的条件里去(GROUP BY DepartmentID,DepartmentName),那这三条记录就是三个分组。
不显示DepartmentName字段。
用聚合函数把这三条记录整合成一条记录count(DepartmentName)
WHERE和 HAVING
&&&&HAVING子句可以让我们筛选成组后的各组数据。HAVING子句可以使用聚合函数
&&&&WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前. WHERE字句中不能使用聚合函数
&&&&举例说明:
&&&&一、显示每个地区的总人口数和总面积.
SELECT region, SUM(population), SUM(area)
GROUP BY region
&&&&先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。
&&&&二、 显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。
SELECT region, SUM(population), SUM(area)
FROM bbc8 F4 w2 v( P- f
GROUP BY region
HAVING SUM(area)&1000000
&&&&在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。相反,HAVING子句可以让我们筛选成组后的各组数据
&&&&需要注意说明:当同时含有where子句、group by 子句 、having子句及聚集函数时,执行顺序如下:
&&&&执行where子句查找符合条件的数据;
&&&&使用group by 子句对数据进行分组;对group by 子句形成的组运行聚集函数计算每一组的值;最后用having 子句去掉不符合条件的组。
&&&&having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。
&&&&having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。
GROUP BY 与COUNT的一些复杂用法
直接用例子来说明吧
现有表:居民区表:DW_DM_RE_RC,部分字段如下
select AREA_ID,AREA_NAME,CITY_ID,CITY_NAME,RC_ID,RC_NAME,RC_TYPE_ID,RC_TYPE_NAME,RC_ADDRESS,FLOOR_CNT,BUILDING_CNT from DW_DM_RE_RC
数据主要集中在宿迁和无锡两个地市。
现需要根据AREA_ID和CITY_NAME进行分组,且显示同一个AREA_ID的数据数量。(AREA_ID和AREA_NAME相关联,CITY_ID,CITY_NAME相关联)
select COUNT(*) as COUNT,AREA_ID,AREA_NAME,CITY_ID,CITY_NAME from DW_DM_RE_RC
group by AREA_ID,AREA_NAME,CITY_ID,CITY_NAME
这里COUNT显示的是以AREA_ID和CITY_NAME为条件进行分组的,
表示AREA_ID=510,CITY_NAME=’滨湖区’(无锡市滨湖区)的数据有131条,表示AREA_ID=510,CITY_NAME=’宜兴’(无锡市宜兴区)的数据有131条,表示AREA_ID=527,CITY_NAME=’泗洪’(宿迁市泗洪区)的数据有101条,但我需要的是属于AREA_ID=510(无锡市,不管哪个区)的总数据量有多少,并且需要显示CITY_NAME。也就是需要改变显示的COUNT值。由此得到启发
SELECT T1.AREA_ID,T1.AREA_NAME,T1.CITY_ID,T1.CITY_NAME,T2.COUNT FROM
(SELECT COUNT(*) AS COUNT,AREA_ID,AREA_NAME,CITY_ID,CITY_NAME FROM DW_DM_RE_RC
GROUP BY AREA_ID,AREA_NAME,CITY_ID,CITY_NAME) T1
LEFT JOIN (
SELECT COUNT(*) AS COUNT,AREA_ID,AREA_NAME FROM DW_DM_RE_RC
GROUP BY AREA_ID,AREA_NAME
T1.AREA_ID = T2.AREA_ID AND T1.AREA_NAME = T2.AREA_NAME
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8012次
排名:千里之外
原创:24篇
(4)(2)(1)(2)(1)(1)(1)(1)(11)(2)(3)(4)

我要回帖

更多关于 having count 用法 的文章

 

随机推荐