目录
内连接之自连接(把一张emp 看成一个员工表和一个领导表):
分组函数(多行处理函数):
特点:输入多行,最终输出一行
count | 计数 | select count(sal) from emp; |
sum | 求和 | select sum(sal) from emp; |
avg | 平均值 | select avg(sal) from emp; |
max | 最大值 | select max(sal) from emp; |
min | 最小值 | select min(sal) from emp; |
注意:
首先在使用之前必须要先分组,如果没有分组,那么就是默认一张表
分组函数自动忽略NULL,不需要提前对NULL进行处理
解释:分组函数(*):统计表当中的总行数
分组函数(具体字段):字段中不为NULL的元素
分组函数不能用在where后边
解释:执行顺序是from 、where、 group by、 select 、order by
分组函数的使用需要先分组,在使用where之后,没有进行分组。
然而在select之后就可以使用,因为在select之前被默认分一组
分组查询(非常重要):
例子: 计算每个部门的薪资和、计算每个工作岗位的平均薪资;
特点: 需要先分组,在对每一组的数据进行操作,这个时候需要我们用到分组查询
格式: select...from...group by...having...
案例实验:
案例①:找出每个工作岗位的工资和
select sal,ename,job,sum(sal) from emp group by job;
注意:写了ename,但是分组就没有意义了,每个人的名字都不一样在,Oracle中报错。、 只能跟着,参加分组的字段和分组函数,其他的一律不跟。
案例②:找出每个部门的最高薪资
select max(sal),deptno from emp group by deptno;
案例③:找出每个部门不同工作岗位的最高工资
技巧:把两个部门看成一个部门
select max(sal),deptno,job from emp group by deptno,job;
案例④:找出每个部门的最高薪资,要求最高薪大于3000的
技巧:使用having,并且不能单独使用,需要和group by联合使用
select deptno,max(sal) from emp group by deptno having max(sal)>3000; 效率低
select deptno,max(sal) from emp where sal>3000 group by deptno; 效率高
注意:在where和having中优先使用where,效率稍微高一点
案例⑤:找出每个部门的平均薪资高于2500,只能使用having.
select deptno,avg(sal) from emp group by deptno having avg(sal)>2500;
单标查询的关键字运行顺序:
先运行from,确定从某张表。在运行where条件筛选有价值的数据,再运行group by进行分 组,之后可以在使用having继续筛选,最后select进行查询,最后order by进行排序。
综合案例:
找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除了MANAGER岗位之外,要 求按照平均薪资进行降序排列
select job,avg(sal) as avgsal from emp where job<> ’MANAGER’ group by job having avg(sal) > 1500 order by avgsal desc;
distinct关键字:
特点:查询结果中取出重复的记录
select distinct job from emp;
select distinct job,deptno from emp;
select deptno,distinct job from emp;
注意:
- 可以去除多组记录的关键字
- distinct不能放在后边,只能放在开头
连接查询(多表查询):
定义:从多张表中查询数据,被称为连接查询
分类: ①年代:SQL92:简单演示一个例子
SQL99:重点学习
②连接的方式:内连接:等值连接、非等值连接、自连接
外连接:左外连接(左连接)、右外连接(右连接)
全连接(不讲);
实现:
不加限制条件会产生笛卡尔积现象,即显示匹配次数是两个记录的乘积的表
为了避免笛卡尔积现象,可以外加限制条件
select ename,dname from emp,dept where emp.deptno=dept.deptno;
可以限制查询的范围,从而提高效率,其次可以更改表的名字
SQL92语法:sleect e.ename,d,ename from emp e,dept d where e.deptno=d.deptno;
SQL99语法:select e.ename,d.dname from emp e inner join dept d on e.deptno=d.deptno;
注意:通过笛卡尔积现象得出,降低表的链接次数提升效率
内连接之等值连接:
案例:显示员工和员工的岗位
select e.ename,d.dname from emp e inner join dept d on e.deptno=d.deptno;(inner可省)
内连接之非等值连接:
案例:显示员工和员工的薪资等级
select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
内连接之自连接(把一张emp 看成一个员工表和一个领导表):
案例:显示员工和员工的领导名字
select a.ename 'am',b.ename 'bo' from emp a join emp b on a.mgr=b.empno;
内连接的特点:完全能够匹配上这个条件的数据查询出来
外连接:
右(外)连接:
select e.ename,d.dname from emp e right join dept d on e.deptno=d.deptno;
左(外)连接:
select e.ename,d.dname from emp e left join dept d on e.deptno=d.deptno;
特点:①将右边的表看做成主表,主显右表,捎带显示左表
②right和left右边有一个outer,outer可以省略
③外连接的查询结果条数一定是大于等于内连接的查询结果条数