Posted on 2008-08-12 15:49
Prayer 阅读(852)
评论(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;