SQL练习 demo8_子查询
2016-12-13 15:44
316 查看
[子查询(嵌套查询): 将某个查询作为再查询的数据来源。即:将某个查询作为一张表来看待。]
1、在emp表中,哪个员工的工资最高。
SQL>select ename, sal from emp
where sal = (select max(sal) from emp );
2、在emp表中,哪些员工的工资高于平均工资。
SQL>select ename, sal from emp
where sal > (select avg(sal) from emp );
3、在emp表中,各部门中哪个员工的工资最高。
[错了,原因: 子查询中有多个结果。]
SQL>select ename, sal, deptno from emp
where sal = (select max(sal) from emp group by deptno);
[因此,不能使用等号,而因使用包含运算符in,得到结果此题恰好正确;
但是,当10部门也有一个3000元工资的员式也会被找出。那,这就错了。]
SQL>select ename, sal, deptno from emp
where sal in (select max(sal) from emp group by deptno);
[说明: 以上语句在达到目的上是有漏洞的。]
先按部门分组找出各部门中最高的工资,并将该查询作为一张表看待。
SQL>select max(sal), deptno from emp group by deptno;
再将此表进行连接,即可查出无漏洞的结果
SQL>select ename, sal,dt.deptno from emp
join
(select deptno , max(sal) max_sal from emp
group by deptno) dt
on
(emp.deptno=dt.deptno and emp.sal = dt.max_sal );
[其中join表示连接某表,on是按指条件进行连接之意]
4、每个部门的平均工资所属的等级。
[答案]
SELECT deptno,round(avg_sal,2), grade FROM salgrade
join
(SELECT deptno,avg(sal) avg_sal FROM emp GROUP BY deptno) tmp
on
tmp.avg_sal BETWEEN losal AND hisal ;
[或]
SELECT deptno,round(avg_sal,2), grade FROM
(SELECT deptno,avg(sal) avg_sal FROM emp
GROUP BY deptno) tmp,salgrade
WHERE tmp.avg_sal BETWEEN losal AND hisal ORDER BY grade DESC;
[分解]
1、计算各部门的平均工资。
SELECT deptno,avg(sal) avg_sal FROM emp GROUP BY deptno
2、计算结果与工资等级表salgrade做连接,计算出等级grade,并由大到小排序。
SELECT deptno,grade,avg_sal
FROM (SELECT deptno,avg(sal) avg_sal
FROM emp GROUP BY deptno) tmp,salgrade
WHERE tmp.avg_sal BETWEEN losal AND hisal ORDER BY grade DESC;
1、在emp表中,哪个员工的工资最高。
SQL>select ename, sal from emp
where sal = (select max(sal) from emp );
2、在emp表中,哪些员工的工资高于平均工资。
SQL>select ename, sal from emp
where sal > (select avg(sal) from emp );
3、在emp表中,各部门中哪个员工的工资最高。
[错了,原因: 子查询中有多个结果。]
SQL>select ename, sal, deptno from emp
where sal = (select max(sal) from emp group by deptno);
[因此,不能使用等号,而因使用包含运算符in,得到结果此题恰好正确;
但是,当10部门也有一个3000元工资的员式也会被找出。那,这就错了。]
SQL>select ename, sal, deptno from emp
where sal in (select max(sal) from emp group by deptno);
[说明: 以上语句在达到目的上是有漏洞的。]
先按部门分组找出各部门中最高的工资,并将该查询作为一张表看待。
SQL>select max(sal), deptno from emp group by deptno;
再将此表进行连接,即可查出无漏洞的结果
SQL>select ename, sal,dt.deptno from emp
join
(select deptno , max(sal) max_sal from emp
group by deptno) dt
on
(emp.deptno=dt.deptno and emp.sal = dt.max_sal );
[其中join表示连接某表,on是按指条件进行连接之意]
4、每个部门的平均工资所属的等级。
[答案]
SELECT deptno,round(avg_sal,2), grade FROM salgrade
join
(SELECT deptno,avg(sal) avg_sal FROM emp GROUP BY deptno) tmp
on
tmp.avg_sal BETWEEN losal AND hisal ;
[或]
SELECT deptno,round(avg_sal,2), grade FROM
(SELECT deptno,avg(sal) avg_sal FROM emp
GROUP BY deptno) tmp,salgrade
WHERE tmp.avg_sal BETWEEN losal AND hisal ORDER BY grade DESC;
[分解]
1、计算各部门的平均工资。
SELECT deptno,avg(sal) avg_sal FROM emp GROUP BY deptno
2、计算结果与工资等级表salgrade做连接,计算出等级grade,并由大到小排序。
SELECT deptno,grade,avg_sal
FROM (SELECT deptno,avg(sal) avg_sal
FROM emp GROUP BY deptno) tmp,salgrade
WHERE tmp.avg_sal BETWEEN losal AND hisal ORDER BY grade DESC;
相关文章推荐
- SQL练习 demo2_select_distinct查询语句
- SQL练习 demo7_表自连接查询
- SQL练习 demo1_select_查询语句
- SQL查询语言练习
- 父表字表统计查询的sql练习
- 【SQL】练习并熟练掌握用T-SQL查询命令进行数据查询的技能【原创技术】
- 【SQL】练习并熟练掌握用T-SQL查询命令进行数据查询的技能【原创技术】
- sql查询练习
- SQL连接查询总结和练习
- sql的查询练习
- SQL查询基本练习1:(作业)
- 标准SQL查询 总结练习
- 接着学习SQL查询,练习《数据库系统概论--高等教育出版社》中的例子
- oracle SQL语句练习MERGE、模糊查询、排序、
- SQL查询语句练习
- sql基本查询语句练习
- 天天SQL(查询所有子节点及其函数的练习)
- SQL查询语句基本练习
- Oracle SQL:经典入门级查询练习(1)
- SQL简单查询练习汇总(单个表)