Oracle学习笔记(七)——Oracle表的复杂查询

一、数据分组
1、数据分组——max,min,avg,sum,count
  • 显示所有员工中的最高工资和最低工资
    • select max(sal),min(sal) from emp;
  • 显示所有员工的平均工资和工资总和
    • select avg(sal),sum(sal) from emp;
  • 计算员工数量
    • select count(sal) from emp;
  • 显示工资最高的员工的名字和工作岗位
    • select ename,job,sal from emp where sal=(select max(sal) from emp);
  • 显示工资高于平均工资的员工信息
    • select ename,sal from emp where sal>(select avg(sal) from emp);

2、group by和having子句
  • group by用于对查询的结果分组统计。
  • having子句用户限制分组显示结果。
  • 显示每个部门的平均工资和最高工资
    • select avg(sal),max(sal),deptno from emp group by deptno;
  • 显示每个部门的每种岗位的平均工资和最低工资
    • select avg(sal),min(sal),deptno,job from emp group by deptno,job;
  • 显示平均工资低于2000的部门号和它的平均工资
    • select deptno,avg(sal) from emp group by deptno having avg(sal)<2000;

3、对数据分组的总结
  • 分组函数只能出现在选择列表、having、order by子句中
  • 如果在select语句中同时包含group by、having、order by,那么他们的顺序是group by、having、order by。
  • 在选择列中,如果有列、表达式和分组函数,那么这些列和表达式必须有一个出现在group by子句中,否则就会出错。
    • select deptno,avg(sal) from emp group by deptno having avg(sal)<2000;这里deptno就一定要出现在group by中。


二、多表查询
1、多表查询:基于两个和两个以上的表或是视图的查询。
2、示例
  • 显示雇员名、雇员工资及所在部门的名字【笛卡尔集】
    • 注:多表查询的条件是,条件不能少于  (表的个数-1)
    • select ename,sal,dname from emp,dept where emp.deptno=dept.deptno; 
  • 显示部门号为10的部门名、员工名和工资
    • select  dname ,ename,sal from dept,emp where dept.deptno=emp.deptno and dept.deptno=10; 
  • 显示各个员工的姓名、工资、及其工资的级别
    • select  ename,sal,grade from emp,salgrade  where sal between losal and hisal ;
  • 显示雇员名、雇员工资及所在部门的名字,并按部门排序
    • select  ename,sal,dname from emp,dept where emp.deptno=dept.deptno order by emp.deptno ;

3、自连接:在同一张表的连接查询。
  • 显示某个员工的上级领导的姓名
    • select worker.ename,boss.ename from emp worker,emp boss where worker.mgr=boss.empno and worker.ename= 'FORD';


三、子查询
1、子查询:嵌入在其它sql语句中的select语句,也叫嵌套查询。
2、单行子查询:只返回一行数据的子查询语句。
  • 显示与SMITH同一部门的所有员工
    • select ename,deptno from emp wheredeptno=(select deptno from emp where ename='SMITH');

3、多行子查询:返回多行数据的子查询。
  • 查询和部门10的工作相同的雇员的名字、岗位、工资、部门号
    • select ename,job,sal,deptno from emp where job in (select distinct job from emp where deptno=10);

4、在多行子查询中使用all操作符
  • 显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
    • select ename,sal,deptno from emp where sal>all (select sal from emp where deptno=30);
    • select ename,sal,deptno from emp where sal>(select max(sal) from emp where deptno=30);

5、在多行子查询中使用any操作符
  • 显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
    • select ename,sal,deptno from emp where sal>any (select sal from emp where deptno=30);

6、多列子查询
  • 显示与SMITH的部门和岗位完全相同的所有员工
    • select * from emp where (deptno,job)=(select deptno,job from emp where ename='SMITH');
    • 注:字段顺序应该一样,否则无法匹配

7、在from子句中使用子查询
  • 显示高于自己部门平均工资的员工的信息
    • 查询各个部门的平均工资和部门号:select deptno,avg(sal) mysal from emp group by deptno;
    • 把以上的查询结果看作是一张子表:select * from emp a1,(select deptno,avg(sal) mysal from emp group by deptno) a2 where a1.deptno=a2.deptno and a1.sal>a2.avg(sal);
  • 说明:在from 子句中使用子查询时,该子查询会被作为一个视图来对待,因此叫做内嵌视图。当在from子句中使用子查询时,必须给子查询指定别名
  • 给表取别名,不能加as;给列取别名,可以加as。

8、用查询结果创建新表
  • create table mytable(id,name,sal job,deptno) as select empno,ename,sal job,deptno from emp;


四、分页查询
1、oracle分页一共有三种方式:
1)rownum分页,只能采用二分的方法,一次只能截取一次。
  • rownum表示oracle自动为表分配的行号,随着行数变化而变化。
  • 子查询:select * from emp
  • 显示rownum:select a1.*,rownum rn from (select * from emp) a1;
  • 选取特定行:select a1.*,rownum rn from (select * from emp) a1 where rownum<=10 ;
  • select a2.*,rownum rn from(select a1.*,rownum rn from (select * from emp) a1 where rownum<=10 ) a2 where rn>=6 ;
  • 注:如果查询指定咧,则只需要修改最内层的子查询的显示字段。
    • 改动如下:select ename,sal from emp
  • 注:排序如下:
    • select a2.*,rownum from(select a1.*,rownum rn from (select * from emp order by sal) a1 where rownum<=10 ) a2 where rn>=6 ;
  • select * from (select t.*,rownum rn from (select * from t_xiaoxi order by cid desc) t where rownum<10000) where rn>9980;
  • 执行时间为0.1秒。

2、根据rowid来分
  • select * from t_xiaoxi where rowid in (select rid from (select rownum rn,rid from (select rowid rid,cid from t_xiaoxi order by cid desc) where rownum<10000) where rn>9980) order by cid desc;
  • 执行时间为0.03秒

3、按分析函数来分
  • select * from (select t.*,row_number() over (order by cid desc) rk from t_xiaoxi t) where rk<10000 and rk>9980;
  • 执行时间1.01秒

4、按效率:ROWID>ROWNUMBER>分析函数


五、合并查询
1、使用集合操作符号union, union all, intersect, minus
2、union:用于取得两个结果集的并集。当使用该操作符时,自动去掉结果集中重复行。
  • select ename, sal, job from emp where sal>2500 union select ename, sal, job from emp where job='manager';

3、union all:与union相似,但不会取消重复航,而且不会排序。

4、intersect:用于取两个结果集的交集。

5、minus:用于取得两个结果级的差集,它只会显示存在第一个集合中,而不存在第二个集合中的数据。


六、创建新的数据库
1、创建数据库有两种方法:
1)通过oracle提供的向导工具
2)手工步骤直接创建

2、DBCA(数据库配置助手)

你可能感兴趣的:(oracle,数据库,查询,plsql,developer,韩顺平)