演示使用的是oracle中scott用户提供的表,
–查询员工姓名,工作日期,并按月份数降序排序
select
ename,
months_between(sysdate,hiredate) workdate
from
emp
order by
hiredate;
–查询公司员工工资的最大值,最小值,平均值,总和
select
max(sal) maxSal,
min(sal) minSal,
avg(sal) avgSal,
sum(sal) sumSal
from
emp;
–查询各job的员工工资的最大值,最小值,平均值,总和
select
max(sal) jobMaxSal,
min(sal) jobMinSal,
avg(sal) jobAvgSal,
sum(sal) jobSumSal
from
emp
group by
job;
–选择具有各个job_id的员工人数
select
job,
count(*)
from
emp
group by
job;
补充:
count(*) count(列) count(1) 到底是哪个高效?
如果你的数据表没有主键,那么count(1)比count(*)快
如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快
如果你的表只有一个字段的话那count(*)就是最快的啦
count(星),自动会优化指定到那一个字段。所以没必要去count(1),用count( 星 ),sql会帮你完成优化的
以上是百度查询的答案 ,以下是我的个人分析
没有索引的时候,count(1) 跟 count(列)效率基本一致
如果创建了索引,并且允许为空,那么count(索引列)会高效一些,
如果创建了索引,不允许为空,count(索引列)的效率跟 count(*)基本一致
也就是说,count(1) 跟count (星)没区别, count(索引列)才会有高效的效果,前提是索引列不能为空,所以,通常写的话 count(*) 就行,因为一般表没有索引列,也就是说,它们效率基本一致
以上纯属个人观点,如果觉得有什么不对,帮忙指出一下,3q,下面是我的测试图片
回归正题,继续刷题
–查询员工最高工资和最低工资的差距
select max(sal) - min(sal) 工资差距 from emp;
–查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
普通写法
select
mgr,min(sal)
from
emp
where
mgr is not null
group by
mgr
having
min(sal) >= 6000;
子查询的写法
select
mgr,min(sal)
from
emp
where
mgr
in(select mgr from emp)
group by mgr
having
min(sal) >= 6000;
–查询所有部门的名字,location_id,员工数量和工资平均值
select
d.dname ,d.loc ,count(*) ,avg(e.sal)
from
dept d,emp e
where
d.deptno = e.deptno
group by
d.dname,d.loc;
这里使用俩个条件进行的分组原因是,如果没有分组的字段是不能显示在页面上的,因为我们需要loc 的数据,所以只能加一个分组条件了,
–查询和JONES相同部门的员工姓名和雇用日期
select
ename,hiredate
from
emp
where
deptno =
(select deptno from emp where ename = 'JONES');
–查询工资比公司平均工资高的员工的员工号,姓名和工资。
步骤1.查询出本公司的平均工资 2073.21
select
avg(sal)
from
emp;
步骤2.查询所有人,工资大于平均工资就输出
select
empno,ename,sal
from
emp
where
sal
>
(select avg(sal) from emp);
–查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资
步骤1.查询所有部门的平均工资
select
avg(sal) avgSal,
deptno
from
emp
group by
deptno;
步骤2. 查询所有员工,工资比本部门高就输出
select
empno,ename,sal
from emp e,
(select avg(sal) avgSal,deptno from emp group by deptno) d
where
e.deptno
=
d.deptno
and
e.sal
>
d.avgSal;
–查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名
步骤1. 查询包含I字母的员工所在部门,
select deptno from emp where ename like '%I%';
步骤2.查询所有员工,部门号相同就输出(结果可能有多个,所以我们使用in)
select empno,ename from emp where deptno in(select deptno from emp where ename like '%I%');
这里需要扯一嘴, 因为我的基础比较弱,所以我开始并分不清 in 和 any 的区别,查询资料后,我的理解是 in只能用作是否相等, any 是用作是否大于,小于的判断,
–查询在部门的loc为’NEW YORK’的部门工作的员工的员工号
步骤1.查询'NEW YORK'的部门
select
deptno
from
dept
where
loc = 'NEW YORK';
步骤2.查询所有员工,如果部门号等于'NEW YORK'的部门号,就输出
select
empno
from
emp
where
deptno
in
(select deptno from dept where loc = 'NEW YORK');
–查询管理者是King的员工姓名和工资
步骤1.查询KING的员工编号
select empno
from emp
where
ename
=
'KING';
步骤2. 查询所有员工信息,如果员工管理者编号等于 KING的编号,就打印
select ename,sal from emp where mgr = (select empno from emp where ename = 'KING');
如果查询语句,有结果,则返回true,否则返回false
– 查询有员工的部门信息
select * from dept d where exists(select * from emp e where d.deptno = e.deptno)
oracle查询的执行顺序
1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序。
代码解释, 假设我们有3个部门,分别是 10 , 20 , 30,
代码首先会执行 from 然后执行 where 然后执行子查询 ,子查询里面会先用 10的部门编号在emp表里找, 如果找到了 返回true; 就相当于
select * form dept where true;
然后在执行第二遍,再用20的部门编号去emp里找,如果没有找到,那么就会返回false,就相当于 select * from dept where false; 这条语句就不会输出,然后找下一条,
这一块有一点难,需要配合执行流程来理解,
本章就讲到这里,