Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

分组查询

Posted on 2008-08-12 15:49 Prayer 阅读(850) 评论(0)  编辑 收藏 引用 所属分类: 数据库,SQL
*************************************************************************************
分组查询
*************************************************************************************

在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息SQLServer 按照group by 子句中指定的表达式的值分组查询结果。

-------------------------------------------------------------------------------------
分组查询一般是用来进行统计需求的,要进行分组查询必须使用group by子句或having子句,在分组统计时要用到SQL的多行存储函数。在where条件中不能使用多行存储函数.

查询语句的select 和group by ,having 子句是聚组函数唯一出现的地方,在where 子句中不能使用聚组函数。

在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数.
------------------------------------------------------------------------------------


部门表department:

department_id department_name
10 开发部
20 测试部
30 用服部
40 财务部
50 培训部

雇员表employees:(department_id为外键)

id employees_name department_id
1 cheng 10
2 zhou 50
3 liguo 10
4 wang 20
5 feng 30
6 ling 30
7 wu 20
8 tang 20
9 yang 40
10 tan 50
------------------------------------------------------------------------------------

按部门编号统计出表employees中的每个部门的人数(group by分组查询)
select department_id, count(*) from employees
group by department_id;

显示出部门人数少于5人的部门编号以及人数( 按照department_id来分组,having count(*)<5做为限制条件 )
select department_id 部门号, count(*) 部门人数 from employees
group by department_id
having count(*)<5;
--------------------------------------
(注意:having必须在group by子句的后面)
--------------------------------------
图:
部门号 部门人数
------------------------------
10 2
20 3
30 2
40 1
50 2
-------------------------------------------------------------------------------------
where子句和having子句可以同时使用,where子句是对要分组的行进行过滤,即选择要分组的行;
而having子句是对分组后的数据进行过滤。此时where子句必须在group by...having子句之前
-------------------------------------------------------------------------------------
显示出所有工资大于5000,且部门人数大于5个的部门号,部门最低工资和部门人数

select department_id 部门号(记住department_id 和部门号之间要空格), min(salary) 最低工资,count(*) 部门人数 from employees
where salary >5000
group by department_id
having count(*)>5;

图:
--------------------------------------
部门号 最低工资 部门人数
80 6100 34
100 6800 6

group by 按照哪个字段来排序查询,一般的group by和having一起使用,注意在查询中只能查询与group by和having有关的字段。
--------------------------------------

where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。


having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。



查询每个部门的每种职位的雇员数(待测试...)
select deptno,job,count(*) from emp group by deptno,job;

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理