聚合函数总结
在实际SQL应用中,经常需要进行分组聚合,即将查询对象按一定条件分组,然后对每一 个组进行聚合分析。比如我们常见的一些分组计算需求:求某个部门的薪资总和,薪资平均 值,薪资最大值等等。
分组聚合函数也可称之为多行函数,它的输入是多个行构成得一个行集(这个行集可以 是一张表的所有行,也可以是按照某个维度进行分组后的某一组行),而输出都是一个值。
1.分组聚合函数语法以及 SQL 语句执行过程
SQL中使用分组聚合函数的语法
SELECT [column,] group_function(column), ... FROM table
[WHERE condition]
[GROUP BY column][having] [ORDER BY column];
在 select 语句中使用 group by 子句将行划分成较小的组,然后,使用聚组函数返回每 一个组的汇总信息,另外,可以使用 having 子句限制返回的结果集。
查询语句的 select 和 group by,having,Order by 子句是分组聚合函数唯一出现的地方, 在 where 子句中不能使用分组聚合函数。
select department_id, sum(salary) from employees where salary>10000 group by department_id
having sum(salary) > 11000 order by sum(salary)
sql语句执行过程
(1) 按select找到where满足条件的元组形成结果表。 相当于:
select department_id, salary from employees
where salary>10000
(2) 将结果表按group中指定的列进行分组,该属性列值相等的元组为一组,通常会 在每组中作用集函数。(如果group指定多个列,先按第一列分组,然后在每个组中再按第二 列分组)
相当于:
select department_id, sum(salary) from employees where salary>10000 group by department_id
(3) 如果group子句带having短语,则分组聚合后只有满足having指定条件的组才输 出。
相当于:
select department_id, sum(salary)
from employees where
salary>10000 group by department_id
having sum(salary) > 11000
(4) 如果有order子句,则将结果表按order子句指定的列升序或降序排序。 相当于:
select department_id, sum(salary) from employees where salary>10000 group by department_id
having sum(salary) > 11000 order by sum(salary)
2.group by 可选项
什么时候可以无:非分组查询中 非分组查询中,聚合函数实际上等于将表中所有记录作
为一个组来运算。此时在 select 列表中指定的列只能是包含聚组函数,不能包含数据表本身的列。比如求所有员工的总工资。
select sum(salary) from employees
什么时候必须有:在分组查询中 分组查询中,聚合函数是将数据按分组关键字分组,然后对每一组的函数自变量中的内 容进行聚合运算。Select 子句字段可以是分组关键字(group by 后面字段)和聚合函数。 比 如求各个部门员工总工资。
注意:
a.如果没有group by 子句,select 列表中不允许出现字段与分组函数混用的情况。 b.在带有group by子句的查询语句中,在select列表中指定的列要么是group by 子 句
中指定的列,要么包含聚组函数。出现在select列表中的字段,如果不是包含在分组函数
中,那么该字段必须同时出在Group by子句中。
c.group by后面字段的顺序不同分组结果不同。
3. 条件查询(where 和 having)
在一个 sql 语句中可以有 where 子句和 having 子句。having 与 where 子句类似,均 用于设置限定条件。
where 子句的作用是在对查询结果进行分组前,将不符合 where 条件的行去掉,即在分 组之前过滤数据,条件中不能包含聚组函数,使用 where 条件显示特定的行。
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组 函数,使用 having 条件显示特定的组,也可以使用多个分组标准进行分组。
group by 可以与 where 来搭配使用,where 只能在 group by 的前面,group by 后面 不能使用 where;where 只针对单记录,不针对记录组的搜索条件,子句能包括分组函数,当 用户要指定一个记录组的搜索条件只能使用 having 表示。
4.常用的聚合函数
4.1 计数(COUNT) COUNT()函数用来计算表中记录的个数(count(*))或者列中值的个数
(count(column)),
计算内容由SELECT语句指定。使用COUNT函数时,必须指定一个列的名称或者使用星号,星号 表示计算一个表中的所有记录。两种使用形式如下。
*COUNT(*),计算表中行的总数,即使表中行的数据为NULL,也被计入在内。
*COUNT(column),计算column列包含的行的数目,如果该列中某行数据为NULL,则该行 不计入统计总数。
注意: COUNT()函数只对那些传递到函数(括号)中的参数不是NULL的行计数。 Select count(1) 和Select count(*) 返回的结果一样。
(1)使用COUNT(*)函数对表中的行数计数。 COUNT(*)函数将返回满足SELECT语句的WHERE子句中的搜索条件的函数。 示例 查询employees表中的所有记录的行数。实例代码: select count(*) from employees
在该例中,SELECT语句中没有WHERE子句,那么认为表中的所有行都满足SELECT语句,所 以SELECT语句将返回表中所有行的计数。
如果DBMS在其系统表中存储了表的行数,COUNT(*)将很快地返回表的行数,因为这时, DBMS不必从头到尾读取表,并对物理表中的行计数,而直接从系统表 …… 此处隐藏:12083字,全部文档内容请下载后查看。喜欢就下载吧 ……