对Oracle中分组查询和关联查询的通俗理解

对Oracle中分组查询和关联查询的通俗理解

一、分组查询
1、实例:查询各个管理者属下员工的最低工资,其中最低工资不能低于800,且没有管理者的员工不计算在内。
select mgr,min(sal) from emp where mgr is not null group by mgr having min(sal) >= 800;
查询结果:
这里写图片描述
2、通俗理解
关于分组查询基础实例,注意抓题目需求的字眼。
(1)各个:group by ,如果是“所有”,就不用分组
(2)其中:having 而且,having 往往跟在group by后面,而group by又必须在where后面
(3)大于,小于,等于,是,不是,为: where
(4)只要分组了,有group by XXX,那么XXX一定出现在select中,如select XXX
(5)之间、范围:between and
(6)未,没有:null
(7)where :大过滤条件 ,往往跟在表后面,如emp后面
(8)having :小过滤条件,往往跟在grou by后面

二、关联查询
1、实例:查询所有部门的名称、所在地、员工数量以及平均工资。
select d.dname,d.loc,e.emp_count,e.avg_sal from dept d join (select deptno,count(*) as emp_count,avg(sal) as avg_sal from emp group by deptno) e on d.deptno = e.deptno;
查询结果:
这里写图片描述
2、思路分析:
(1)既然发现“以及”左边只是涉及到dept表,而右边涉及到emp表,最后才会关联,这时可以运用数据库里的一个有用的知识”临时表”。
先左边的查询一个临时表:
select dname,loc from dept;

(2)“以及”右边的平均工资查询一个临时表:
select deptno,count(*) as emp_count,avg(sal) as avg_sal from emp group by deptno;

(3)将两张临时表关联起来,查询,2.中当作一个临时表 t
1. select d.dname,d.loc,e.emp_count,e.avg_sal from dept d join t e on d.deptno = e.deptno;
2. 现在把t还原,因为t就是2.中的表嘛。
select d.dname,d.loc,e.emp_count,e.avg_sal from dept d join (select deptno,count(*) as emp_count,avg(sal) as avg_sal from emp group by deptno) e on d.deptno = e.deptno;

3、通俗理解
关于关联查询基础实例,注意抓题目需求的字眼。拿上面实例来辅助说明。
(1)所有部门的 :group by,注意往往是非关键字分组,在表dept中,deptno是关键字,显然已经是按deptno
进行过的分组,你如果再from dept group by deptno,那就重复了。很明显,非关键字分组,在emp中进行
分组。
(2)名称、所在地:dept
员工数量:count(*)
平均工资: avg(sal) ,emp
(3)由前面的所有部门、所在地和平均工资,发现是两个表的东西:join on,e.emp,d.dept
两个表放在一起查:关联,外关键字起作用,e.deptno = d.deptno
(4)关联查询字眼:和,以及,查询需求中有涉及到两个表的东西(那肯定要关联查询),
(5)关联查询:找外关键字,两个表肯定存在联系,不然怎么关联查询。join on
(6)临时表:作用不言而喻
(7)在关联查询时,select 后面跟着的东西就是题目需求按顺序要求查询的东西,并且select后面的东西
肯定是分别来自两个表的东西。
(8)注意一点,select d.dname,d.loc,e.emp_count,e.avg_sal,e.emp_count和e.avg_sal来自临时表t中,所以临时表t中必须有e.avg_sal,e.emp_count这样的描述。不然,在select中突然这样写,很突兀,容易出错。
(9)总之,select后面跟着的东西是要上台面的东西,是来自一张表或多张表的东西,一定要在后面from的表中可追溯到。所以,这时的临时表的重要作用就展现出来了。

三、关联查询补充
1、外关联
实例:查询所有部门的名称,员工姓名以及从事的工作。
1.两个表的关联查询,join on ,外关键字,表与表之间存在关联
如:dept表的deptno和emp表的deptno都是彼此的外关键字,存在关联
2. SQL查询语句
select d.dname,e.ename,e.job from dept d join emp e on d.deptno = e.deptno;
这里写图片描述
2、内关联
1.一个表的关联查询,where,select的东西都来自一张表,表内肯定有字段之间存在关联
如:上下级的关联,都是在同一个表里,只是二者之间还有个上下级的关系
2.1 实例:查询每名员工的姓名极其管理者的姓名
select e1.ename,e2.ename from emp e1,emp e2 where e1.mgr = e2.empno;
这里写图片描述
2.2 实例:查询每个管理者的姓名及其下属员工的姓名
select e1.ename,e2.ename from emp e1,emp e2 where e1.empno = e2.mgr;
这里写图片描述

猜你喜欢

转载自blog.csdn.net/zz13995900221/article/details/80174997