Oracle复杂查询

数据分组,

分组函数max, min, avg, sum, count

  1. 查询工资最高的人的姓名

select ename from emp where sal = (select max(sal) from emp);

  1. 给所有低于平均工资的员工薪水上涨10%

update emp set sal = (select avt(sal) from emp)*10% where sal<(select avt(sal) from emp);

grout by 和 having 字句

groupt by用于对查询结果分组统计

having子句用于限制分组结果显示

  1. 如何显示每个部门的平均工资和最高工资

select avg(sal),max(sal), deptno from emp group by deptno;

  1. 显示每个部门的每种岗位的平均工资和最低工资

select avg(sal),min(sal),deptno,job from emp group by deptno,job;

  1. 显示平均工资低于2000的部门和号和它的平均工资

select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;

总结:

  1. 分组函数(max,min,avg,count)只能出现在选择列表(select后),having和order by子句中
  2. 如果select语句中同时包含group by,having和order by,他们的顺序必须是group by,having和order by
    (先分组→再抑制结果显示→最后分组)
  3. 在选择列中如果有列,表达式和分组函数,那么这些列和表达式必须有一个出现在group by子句中,否则就会报错。如deptno

多表查询

  1. 显示雇员名,雇员工资和雇员所在部门的名称

select a1.ename,a1.sal,a2.dname from emp a1,dept a2 where a1.deptno=a2.deptno;

笛卡尔积,原则:多表查询的条件是至少不能少于表的个数-1

  1. 如何显示部门号为10的部门名、员工名和工资

select b.dname, a.ename,a.sal from emp a,dept b where b.deptno=a.deptno and a.deptno=10;

——先把2张表连上,再用用红色条件过滤掉

  1. 显示各个员工的姓名、工资及其工资的级别

select a1.ename,a1.sal,a2.grade from emp a1, salgrade a2 where a1.sal between a2.losal and a2.hisal;

  1. (扩展)显示雇员名、雇员工资以及所在部门的名字并按部门排序

select a1.ename,a1.sal,a2.dname from emp a1,dept a2 where a1.deptno = a2.deptno order by a1.deptno;

——多表排序

自连接

自连接是指在同一张的连接查询

  1. 显示某个员工上级领导的姓名。如Ford

select a.ename from emp a where a.mgr = a.empno and a.ename = ‘Ford‘;

select worker.ename, boss.ename from emp worker, emp boss where worker.mgr = boss.empno and worker.ename = ‘FORD‘;

——小窍门:把一张表想象成2张不同的表,起别名,然后就好做了。

子查询

子查询是指嵌入在其它sql语句中的select语句。也叫嵌套查询。

单行子查询

单行子查询是指只返回一行数据的查询语句;

例如:如何显示与SMITH同一部门的所有员工

select a.ename from emp a where a.deptno = (select deptno from emp b where b.ename=‘ SMITH‘);

多行字查询

多行子查询是指返回多行数据的查询语句

例如:如何查询和部门10的工作相同的雇员名字、岗位、工资和部门号

select * from emp a where a.job in (select distinct job from emp where emp.deptno = 10);

在多行子查询中使用all操作

例如:如何显示工资比部门30的所有员工的工资高的员工姓名、工资和部门号

方法1:

select ename,sal,deptno from emp where sal >all (select sal from emp where deptno=30);

方法2:

select ename,sal,deptno from emp where sal > (select max(sal) from emp where deptno=30);

比较:

方法2效率要远高于方法1,因为方法1会一条一条的比较;方法2直接比较结果。

在多行子查询中使用any操作符

例:显示工资比部门30的任意一个员工的工资高的员工的姓名、工资和部门号

方法1:

select a.ename,a.sal,a.deptno from emp a where a.sal > any(select sal from emp where deptno=30);

方法2:

select ename,sal,deptno from emp where sal > (select min(sal) from emp where deptno=30);

多列子查询

单行子查询是指子查询返回单行、单列数据;

多行子查询是指子查询返回多行、单列数据。都是针对单列而言的;

而多列子查询则是指子查询返回多个列的子查询语句。

例如:查询与Smith部门和岗位完全相同的所有雇员。

select * from emp where (deptno,job)=(select deptno,job from emp where ename=‘SMITH‘);

from子句中使用子查询

例子:显示高于自己部门平均工资的职员信息

1)查询各个部门的平均工资和部门号

select deptno, avg(sal) from emp group by deptno;

2)查询自己部门的

把上面的查询看做是一张子表, (select deptno, avg(sal) from emp group by deptno) a1

select a2.ename,a2.sal,a2.deptno,a1.avgSal from emp a2, (select deptno, avg(sal) avgSal from emp group by deptno) a1 where a2.deptno=a1.deptno and a2.sal > a1.avgSal;

总结:当在from子句中使用子查询时,该子查询会被作为一个视图对待,因此叫做内嵌视图,当在from子句中使用子查询时,必须给子查询指定别名。

——给列取别名可以使用as,但是给表、视图、子查询起别名不可以用as

分页

Oracle的分页是最复杂的,要使用2次子查询,但效率也是最高的,因为内部使用了2分查找的原理。MySql的分页是最简单的,直接一个limit就实现了;SqlServer次之。

Oracle的分页一共有3中方式

  1. rownum 先做一个子查询

select * from emp

  1. 显示rownum[rownum是Oracle分配的]

select a1.*,rownum rn from (select * from emp) a1;

查询结果就会多出一列,rn,表示rownum,行号数,是Oracle分配的。

  1. 显示想要选取的行数据

select a1.*,rownum rn from (select * from emp) a1 where rownum<=10;

and rownum>=6;(rownum不能使用2次,否则查不出数据)

到此,可以显示1-10行数据,已经砍掉一大半了,目标是显示6-10行数据。

  1. 再做一次子查询

select * form (select a1.*,rownum rn from (select * from emp) a1 where rownum<=10) a2 where rn>=6;

结果才是想要的6-10行数据。

注意,几个查询变化:

  1. 如果要指定查询列,而不是查询所有列,只需修改最里层的子查询即可;
  2. 排序也只需修改最里层的子查询就可。
  3. 同理,分组啊,再排序啊,统统的改动最里层的子查询即可。

用查询结果创建一张新表

这个命令是一种快捷的建表方式

create table myTable(id,name,sal,job,deptno) as select empno,ename,sal,job,deptno from emp;

命令执行后,myTable不仅表结构和emp一样,连数据都全部从emp表中倒入了。

合并查询

有时在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号union、union all、intersect和minus操作符

  1. Union 两个集合取或的操作,去掉重复行

该操作符用于取得2个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。

select ename,sal,job from emp where sal>2500 union

select ename,sal,job from emp where job=‘MANAGER‘;

  1. Union all 并的操作,不去掉重复行

该操作符与union类似,但是不会取消重复行,不会排序

  1. intersect 合并查询

该操作符取2个集合的交集

  1. minus 差集操作

该操作符取2个集合的差集

创建数据库的方法

  1. 通过Oracle提供的向导工具

Database Configration Assistant(DBCA)Oracle数据库配置助手

  1. 手工代码直接创建

Java操作Oralce,jsp与分页

.Net操作Oracle,分页

使用特定格式插入日期值

使用to_date()函数,按照年-月-日的格式插入日期

to_date(‘1989-05-11‘,‘yyyy-mm-dd‘)

可以格式化日期值

使用子查询插入数据

当使用values子句时,一次只能插入一行数据,当使用子查询插入数据时,一条insert语句可以插入大量的数据。当处理行迁移,数据迁移或者装载外部表的数据到数据库时,可以使用子查询来插入数据。

insert into myTable(id,name,deptno) select (myId,ename,eno) from emp where eno=10;

使用子句更新数据

使用update子句更新数据时,即可以使用表达式或者数值直接修改数据,也可以使用子查询修改数据

例如:希望更新员工scott的岗位、工资、补助与员工simth一样

update emp set (job,sal,comm) = (select job,sal,comm from emp where enma =‘smith‘) where ename=‘scott‘;

时间: 2025-01-07 05:53:37

Oracle复杂查询的相关文章

数据库编程3 Oracle 子查询 insert update delete 事务 回收站 字段操作 企业级项目案例

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> 数据库编程3 Oracle 子查询 insert update delete 事务 回收站 字段操作 企业级项目案例 实验所用数据表 子查询,解决一步不能求解 查询工资比scott高的员工信息: 子查询知识体系搭建: 解释3,查询部门是sales的员工信息: 方法1:子查询 [方法2]:多表: 优化考虑: 解释4[select],只能放单行子查询 解释4[from] 考题:显示员工姓名,薪水 解释

【Oracle 常用查询】oracle表空间使用率统计查询

参考1 --查询表空间使用情况 SELECT Upper(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)", To_char(Round(( D.TOT_GROOTTE_MB - F.TOTAL_BYTES ) / D.TOT_GROOTTE_MB * 100, 2), '990.99') || '

Oracle 模糊查询方法

在这个信息量剧增的时代,如何帮助用户从海量数据中检索到想要的数据,模糊查询是必不可少的.那么在Oracle中模糊查询是如何实现的呢? 一.我们可以在where子句中使用like关键字来达到Oracle模糊查询的效果:在Where子句中,可以对datetime.char.varchar字段类型的列用Like关键字配合通配符来实现模糊查询,以下是可使用的通配符: (1)% :零或者多个字符,使用%有三种情况 字段 like '%关键字%'字段包含"关键字"的记录 字段 like '关键字%

oracle 层次化查询(生成菜单树等)

1.简介:Oracle层次化查询是Oracle特有的功能实现,主要用于返回一个数据集,这个数据集存在树的关系(数据集中存在一个Pid记录着当前数据集某一条记录的Id). 2.层次化查询主要包含两个子句,一个start with另一个是connect by. start with:这个子句一般用于指定层次化查询的开始节点(也就是树的最顶级节点),找到最顶级节点,然后按照一定的规则开始查找其剩余的子节点 connect by:这个子句就是上面所说的规则,用于查找剩余子节点的规则 CREATE TAB

Oracle分页查询语句的写法(转)

分页查询是我们在使用数据库系统时经常要使用到的,下文对Oracle数据库系统中的分页查询语句作了详细的介绍,供您参考. Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用.Oracle分分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHER

ORACLE 分页查询

Oracle之分页查询 Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. 分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21 其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句.ROWNUM <= 40和RN >= 21控制分页查询的每页的范围.

Oracle生成查询包含指定字段名对应的所有数据表记录语句

应用场合:已知字段名字,查询数据库中所有数据表中包含该字段名的所有数据表 操作办法:指定字段名,数据库表用户,执行下面查询语句即可 --Oracle生成查询包含指定字段名对应的所有数据表记录语句 declare mycolumnname VARCHAR(255):='userid';--定义要查询的字段名变量,运行前修改成您要查询的字段名myownername VARCHAR(255):='system';--定义要查询的数据库用户名变量,运行前修改成您要查询的数据库用户名mystring NV

Oracle单行查询

单行查询也叫作单行函数,使用某个函数对数据进行操作 关于基本查询:oracle基本查询 1 SQL> select lower('Hello WOrld') 转小写, 2 upper('Hello WOrld') 转大写, 3 initcap('hello world') 首字母大写 4 2 from dual; 5 6 7 SQL> --substr(a,b)取子串, 从a中,第b位开始取 ,直到末尾 8 SQL> select substr('Hello World',3) 子串 f

oracle 分页查询数据重复问题

最近在做项目的时候发现一个问题,oracle 在查询分页数据的时候,有几条数据重复查询了,并且有几条数据在分页的时候消失了.百度了一下发现,ORACLE 在查询数据的时候返回的行不是固定的,他只是按照顺序从数据中读取符合条件的数据返回到客户端,给用户误解为默认排序. 然而,当我加上排序的时候,还是查询有重复的数据,(指第一页数据在第二页也查询出来了),这是我就疑问了,当我检查数据的时候,发现我排序的字段有空的情况,而且有很多条,导致排序返回的 伪列并不是唯一的. 总结: oracle 分页查询数

oracle分页查询结果集重复问题&解决方法

做项目时,无意间发现了分页上的一个bug,在此记录一下: 首先手动将后台输出的sql语句复制进oracle中查看,以便排查错误,对比以下视图前10条的结果集与10到20条的结果集,发现大部分记录出现重复现象,SQL语句如下: --前10条记录 select *   from (select row_.*, rownum rownum_           from (select t.idcard, count(1)                   from sampling.v_unvou