技术开发 频道

Transact--SQL高级查询

  Transact--SQL高级查询(三)

  使用having关键字来筛选结果

  当完成对数据结果的查询和统计后,可以使用having关键字来对查询和计算的结果进行一步的筛选

  例:检索出work表中学历是大专或者是中专的人数

select 学历,count(学历) from work group by 学历 having 学历 in(\'大专\',\'中专\')

  说明:

  1:having关键字都与group by用在一起.

  2:having不支持对列分配的别名

  例如:

select 学历,\'大于5的人数\'=count(学历) from work group by 学历 having 大于5的人数>5 [错错]

  改为:

select 学历,\'大于5的人数\'=count(学历) from work group by 学历 having count(学历)>5

  使用compute和compute by

  使用compute子句允许同时观察查询所得到各列的数据的细节以及统计各列数据所产生的汇总列

select * from work [查询所得到的各列的数据的细节] compute max(基本工资),min(基本工资) [统计之后的结果]

  这个例子中没有使用by关键字,返回的结果是最后添加了一行基本工资的最大值和最小值,也可增加by关键字.

  例:

select * from work order by 学历
compute max(基本工资),min(基本工资) by 学历

  比较:

select 学历,max(基本工资),min(基本工资) from work group by 学历

  说明:

  1:compute子句必须与order by子句用在一起

  2:compute子句可以返回多种结果集.一种是体现数据细节的数据集,可以按分类要求进行正确的分类;另一种在分类的基 础上进行汇总产生结果.

  3:而group by子句对每一类数据分类之后只能产生一个结果,不能知道细节

  使用嵌套查询

  查询中再查询,通常是以一个查询作为条件来供另一个查询使用

  例:有work表和部门表

   A:检索出在部门表中登记的所有部门的职工基本资料

select * from work where 部门编号 in [not in](select 部门编号 from dbo.部门)

  B:检索出在work表中每一个部门的最高基本工资的职工资料

select * from work a where 基本工资=(select max(基本工资) from work b where a.部门名称=b.部门名称)

  说明:由外查询提供一个部门名称给内查询,内查询利用这个部门名称找到该部门的最高基本工资,然后外查询根据基本工资判断是否等于最高工资,如果是的,则显示出来.

  相当于:

select * from work, (select 部门名称,max(基本工资) as 基本工资 from work group by 部门名称 as t) where work.基本工资=t.基本工资 and work.部门名称=t.部门名称

  C:用嵌套work表和嵌套部门表,在嵌套work表中检索出姓名和职工号都在嵌套部门存在的职工资料 

select * from 嵌套work where 职工号 in (select 职工号 from 嵌套部门) and 姓名 in (select 姓名 from 嵌套部门) ;[察看结果,分析原因]

  改:

select * from 嵌套 work a,嵌套部门 b where a.职工号=b.职工号 and a.姓名=b.姓名
0
相关文章