sql 还能这样分组查询?高手进

CREATETABLE`emp`(`empno`varchar(10)NOTNULL,`ename`varchar(10)DEFAULTNULL,`job`varchar... CREATE TABLE `emp` (
`empno` varchar(10) NOT NULL,
`ename` varchar(10) DEFAULT NULL,
`job` varchar(10) DEFAULT NULL,
`mgr` varchar(10) DEFAULT NULL,
`sal` double DEFAULT NULL,
`deptno` varchar(10) DEFAULT NULL,
PRIMARY KEY (`empno`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

/*Data for the table `emp` */

insert into `emp` values
('01','jacky','clerk','tom',1000,'1'),
('02','tom','clerk','',2000,'1'),
('03','jenny','sales','pretty',600,'2'),
('04','pretty','sales','',800,'2'),
('05','buddy','jishu','canndy',1000,'3'),
('06','canndy','jishu','',1500,'3'),
('07','biddy','clerk','',2000,'1');

查询出各部门中高于平均工资的员工信息
解:
select * from emp as c where
c.sal>(select avg(sal) from emp as b where c.deptno=b.deptno)

让我百思不得其解的是子查询里加上了c.deptno=b.deptno为什么就有分组的效果了?
是先用b,c做了内联查询吗?然后再求平均数,再找大于这个数的?那结果不应该是这个啊。
求高手帮分析下,这个语句的执行过程到底是啥样的。
展开
 我来答
flyingFish211
2011-01-04 · TA获得超过2.1万个赞
知道大有可为答主
回答量:1.5万
采纳率:50%
帮助的人:1.1亿
展开全部
很简单阿,重点理解在这里select avg(sal) from emp as b where c.deptno=b.deptno

对于 emp as c,你可以理解成是一条一条记录执行的,然后对于每条记录都有特定的c.deptno
,既然你的c.deptno一定了,那么对于子查询来说由于where c.deptno = b.deptno,所以选出来的子集也就一定了(即就是deptno = xxx的特定组合体,所以就实现分组效果了)
846492130
2011-01-04 · TA获得超过287个赞
知道小有建树答主
回答量:500
采纳率:0%
帮助的人:337万
展开全部
group by 查询结果有可能是多个值 所以不能用> 比较
父查询 的where 条件是比较 每条数据的工资是否超过了 该部门的平均工资
子查询如果没有where 条件 查询出来的结果就是所有员工的的平均工资
加上where 条件以后 就保证了 父查询和子查询的 部门id 是一个值
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
axkajvq
2011-01-04 · TA获得超过644个赞
知道小有建树答主
回答量:606
采纳率:0%
帮助的人:145万
展开全部
这恐怕不能用一条 SQL 语句完成 ...

只能用存储过程或者自定义函数 ...

=============================================================

函数写法 ...

CREATE function Fun_SUM(
@chvName Varchar(200)
)returns varchar(8000)
as
begin
declare @r varchar(4000)
set @r=''
select @r=@r+','+SItem from svalue where STCD = @chvName
return(stuff(@r,1,1,''))
end

=============================================================

我修改了一下 ...

查询的时候用 SELECT *,Fun_SUM(STCD) FROM svalue GROUP BY STCD

=============================================================

我电脑上没有任何和 ASP 有关的软件 ... 包括 SQL Server ...

GROUP BY 不能用么 ...?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jyl_19
2011-01-04 · TA获得超过1002个赞
知道小有建树答主
回答量:708
采纳率:0%
帮助的人:1047万
展开全部
对于emp as c的一条数据,取其deptno,然后select avg(sal) from emp as b where c.deptno=b.deptno 得到这个部门的工资平均值,如果emp as c中的这条数据的工资大于这个平均值,则符合筛选条件。
可以把(select avg(sal) from emp as b where c.deptno=b.deptno)看做一个数值,只不过这个数值在查询时根据查询的数据临时计算而已。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式