宏观分析法 —— 复杂sql巧妙剥离

        我不知道世上有多少人提出了宏观分析法的概念,而我今天所讲解的完全是出于自我思考总结的理论。

        什么是宏观分析法? 我是这么定义它的: 从事物的整体来看,先不必在意其中具体的细节,而是从大体方略层层往内渗透,先探究其整体结构,而后才去具体化,最后深入到具体细节的过程就是宏观分析。

下面我来举个列子:
        题1:请用一条sql语句,统计薪资大于薪资最高的员工所在部门的平均工资和薪资最低的员工所在部门的平均工资的平均工资的员工信息。

利用宏观分析法分解题意:
    1.首先我们得拆分,读懂文字含义:
        “统计薪资大于薪资最高的员工所在部门的平均工资和薪资最低的员工所在部门的平均工资的平均工资 [的员工信息]。”

        先通过对文字的拆分后我们发现了,这条表达式啰里啰嗦,但仔细看语句的开头和结尾,可以简化为:“统计 …………员工信息”。所以最终的所求就是要查员工的信息,所以我们可以先写出:“select * from emp”。但是查询是有条件的,那么是什么条件呢?-- 我们在一层一层的往里渗透分析:
“统计[薪资 大于] (薪资最高的员工所在部门的平均工资和薪资最低的员工所在部门的平均工资的平均工资 ) 的员工信息。”
由上的拆分可以发现,条件是员工的工资要大于一个数,所以sql语句可以变成:“select * from emp where sal> ? ”; 那么我们下一步就是继续往里面渗透的分析,这个“?”号是什么,该用怎样的表达式替代呢?我们再来分析:

“统计薪资 大于 ( [‘薪资最高的员工所在部门的平均工资‘ ] 和 [ ‘薪资最低的员工所在部门的平均工资’ ] 的 平均工资 ) 的员工信息。”

        通过对语句的进一步拆分,通过 “和” 这个关键字可以看出:所求的工资大于 某 两个数的和,所以表达式就可以理解成:
“统计薪资 大于 ( ‘x‘ 和 ‘y‘’ 的 平均工资 ) 的员工信息。”
再进一步简化,就成了:
“统计薪资 大于 ( (‘x‘ + ‘y‘)/2 ) 的员工信息。”
所以分析到这里,可以将sql写成:
“select * from emp where sal> ? ------> “select * from emp where sal>( (x+y)/2 )。

分析到此,便可以进一步往里渗透,思考这个x和y分别是什么?通过以上的分析,其实我们已经完成了大体的宏观分析。那么接下来我们就要转为内部的具体分析了,首先拿出代表x和y的文字:

‘薪资最高的员工所在部门的平均工资‘ 和 ‘薪资最低的员工所在部门的平均工资’ ;
通过上面文字可以看出,这其实也是两个查询的表达式。我们首先对X进行解析:

‘薪资最高的员工所在部门的平均工资‘ ---- 这不就是求 什么什么的平均工资吗?所以不管三七二十一,先写个select avg(sal) from emp再说;然后再分析条件:“部门的平均工资”,说明了条件是需要是哪一个部分的,所以把select avg(sal) from emp变成select avg(sal) from emp where 部门=?;这个“?”号又是什么呢?上面的x这句话已经被拆的最后只剩下“薪资最高的员工”了,所以?号所代表当然是全公司工资最高的那个人了所在的部门了。 最高薪资的语句是:select max(sal) from emp);所以“?”号所代表的语句是:select deptno from emp where sal=(select max(sal) from emp)。

所以x的sql语句可以进一步变成下面的:
select avg(sal) from emp where deptno=(select deptno from emp where sal=(select max(sal) from emp));

好了搞定x了,我们就来搞定y,细细一看,其实x和y是相反的意思,所以y可以写成:
select avg(sal) from emp where deptno=(select deptno from emp where sal=(select min(sal) from emp));

那么最终:select * from emp where sal>( (x+y)/2 )。就变成了:

select * from emp where sal>(
(
select avg(sal) from emp where deptno=(select deptno from emp where sal=(select max(sal) from emp))
+
select avg(sal) from emp where deptno=(select deptno from emp where sal=(select min(sal) from emp))
)/2 );

由此,最终题便解了。 本人认为这种宏观分析适合于掌握时局大势,而心细是维持这种大势稳定必不可少的因素。

-- 龚文学 2018.02.03.

猜你喜欢

转载自blog.csdn.net/qq_41899174/article/details/79691814
今日推荐