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做了内联查询吗?然后再求平均数,再找大于这个数的?那结果不应该是这个啊。
求高手帮分析下,这个语句的执行过程到底是啥样的。 展开
`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做了内联查询吗?然后再求平均数,再找大于这个数的?那结果不应该是这个啊。
求高手帮分析下,这个语句的执行过程到底是啥样的。 展开
展开全部
group by 查询结果有可能是多个值 所以不能用> 比较
父查询 的where 条件是比较 每条数据的工资是否超过了 该部门的平均工资
子查询如果没有where 条件 查询出来的结果就是所有员工的的平均工资
加上where 条件以后 就保证了 父查询和子查询的 部门id 是一个值
父查询 的where 条件是比较 每条数据的工资是否超过了 该部门的平均工资
子查询如果没有where 条件 查询出来的结果就是所有员工的的平均工资
加上where 条件以后 就保证了 父查询和子查询的 部门id 是一个值
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这恐怕不能用一条 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 不能用么 ...?
只能用存储过程或者自定义函数 ...
=============================================================
函数写法 ...
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 不能用么 ...?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
对于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)看做一个数值,只不过这个数值在查询时根据查询的数据临时计算而已。
可以把(select avg(sal) from emp as b where c.deptno=b.deptno)看做一个数值,只不过这个数值在查询时根据查询的数据临时计算而已。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询