四、Oracle的复杂查询
Oracle复杂查询
数据分组,
分组函数max, min, avg, sum, count
- 查询工资最高的人的姓名
select ename from emp where sal = (select max(sal) from emp);
- 给所有低于平均工资的员工薪水上涨10%
update emp set sal = (select avt(sal) from emp)*10% where sal<(select avt(sal) from emp);
grout by 和 having 字句
groupt 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;
总结:
- 分组函数(max,min,avg,count)只能出现在选择列表(select后),having和order by子句中
- 如果select语句中同时包含group by,having和order by,他们的顺序必须是group by,having和order by
(先分组→再抑制结果显示→最后分组) - 在选择列中如果有列,表达式和分组函数,那么这些列和表达式必须有一个出现在group by子句中,否则就会报错。如deptno
多表查询
- 显示雇员名,雇员工资和雇员所在部门的名称
select a1.ename,a1.sal,a2.dname from emp a1,dept a2 where a1.deptno=a2.deptno;
笛卡尔积,原则:多表查询的条件是至少不能少于表的个数-1
- 如何显示部门号为10的部门名、员工名和工资
select b.dname, a.ename,a.sal from emp a,dept b where b.deptno=a.deptno and a.deptno=10;
——先把2张表连上,再用用红色条件过滤掉
- 显示各个员工的姓名、工资及其工资的级别
select a1.ename,a1.sal,a2.grade from emp a1, salgrade a2 where a1.sal between a2.losal and a2.hisal;
- (扩展)显示雇员名、雇员工资以及所在部门的名字并按部门排序
select a1.ename,a1.sal,a2.dname from emp a1,dept a2 where a1.deptno = a2.deptno order by a1.deptno;
——多表排序
自连接
自连接是指在同一张的连接查询
- 显示某个员工上级领导的姓名。如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中方式
- rownum 先做一个子查询
select * from emp
- 显示rownum[rownum是Oracle分配的]
select a1.*,rownum rn from (select * from emp) a1;
查询结果就会多出一列,rn,表示rownum,行号数,是Oracle分配的。
- 显示想要选取的行数据
select a1.*,rownum rn from (select * from emp) a1 where rownum<=10;
and rownum>=6;(rownum不能使用2次,否则查不出数据)
到此,可以显示1-10行数据,已经砍掉一大半了,目标是显示6-10行数据。
- 再做一次子查询
select * form (select a1.*,rownum rn from (select * from emp) a1 where rownum<=10) a2 where rn>=6;
结果才是想要的6-10行数据。
注意,几个查询变化:
- 如果要指定查询列,而不是查询所有列,只需修改最里层的子查询即可;
- 排序也只需修改最里层的子查询就可。
- 同理,分组啊,再排序啊,统统的改动最里层的子查询即可。
用查询结果创建一张新表
这个命令是一种快捷的建表方式
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操作符
- Union 两个集合取或的操作,去掉重复行
该操作符用于取得2个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。
select ename,sal,job from emp where sal>2500 union
select ename,sal,job from emp where job='MANAGER';
- Union all 并的操作,不去掉重复行
该操作符与union类似,但是不会取消重复行,不会排序
- intersect 合并查询
该操作符取2个集合的交集
- minus 差集操作
该操作符取2个集合的差集
创建数据库的方法
- 通过Oracle提供的向导工具
Database Configration Assistant(DBCA)Oracle数据库配置助手
- 手工代码直接创建
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';
转载于:https://www.cnblogs.com/fanyong/archive/2013/01/31/2888228.html
四、Oracle的复杂查询相关推荐
- 实验五 oracle高级数据查询技术
实验五 oracle高级数据查询技术 实验目的: 一.掌握日期型数据的操作技术 二.掌握层次查询技术 三.理解情景查询与翻译查询技术 四.了解统计查询技术 实验内容: 一.日期型数据的操作 ...
- oracle查询第二个字为a,Oracle多表查询 - osc_yqnlq679的个人空间 - OSCHINA - 中文开源技术交流社区...
本节剖析Oracle多表查询中的相关内容. 本文所用到的表为oracle中scott用户下的emp表,dept表,数据如下: 一.笛卡尔集: 概念:假设A,B是2个集合,A X B所形成的集合叫笛卡尔 ...
- oracle实验四运动会,实验四oracle的安全性和完整性控制
实验四 oracle的安全性和完整性控制 实验目的: 1.通过本实验能够熟练应用sql语言进行用户权限的授予和回收. 2.熟练掌握实体完整性,参照完整性及用户定义的完整性的定义. 3.并体会oracl ...
- Oracle(二):查询、函数、集合运算
一.单表查询 (一)简单条件查询 1.精确查询 需求:查询水表编号为 30408 的业主记录,查询语句: select * from T_OWNERS where watermeter='30408' ...
- oracle 三表关联查询
oracle 三表关联查询 CreationTime--2018年7月4日17点52分 Author:Marydon 左连接实现三表关联 表A----------------------------- ...
- 视频教程-Oracle从入门到精通全套视频教程之SQL与PLSQL(四)-Oracle
Oracle从入门到精通全套视频教程之SQL与PLSQL(四) Oracle DBA,熟悉Unix操作系统,精通Oracle数据库. 曾任职某大型金融IT公司,负责银行领域数据库构建与运维,维护大量银 ...
- oracle学生选课查询(学生表student、成绩表sc、课程表c)
oracle学生选课查询--学生表student.成绩表sc.课程表c 一.创建学生表,表结构(学号,姓名,年龄,性别,系别,出生地),插入几条记录 二.创建成绩表,表结构(学号,课程号,成绩),插入 ...
- 达梦、Oracle、PostgreSQL查询全部表备注,表字段,全部字段备注,全部索引,全部字段类型
文章目录 一 概述 二 PostgreSQL PS:最佳版本查询表英文名.表中文名.字段英文名.字段中文名.字段类型.schemaname.tableowner(此为最好版本NO1) 1 查询所有表名 ...
- 如何查看oracle 字符集,oracle字符集如何查询
oracle字符集如何查询这个问题困扰这大家吧,究竟应该怎么解决呢?接下来就跟着小编来看看查看oracle字符集方法,有需要的千万不要错过呦. 方法/步骤分享: 一.在安装有PLSQL的电脑上点击桌面 ...
- 2021年大数据Hive(四):Hive查询语法
全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 hive查询语法 一.SELECT语句 1.语句结构 2.全表查 ...
最新文章
- boxFilter 滤波器实现
- python的翻译-python写的翻译代码
- Delphi编程之系统OEM DIY
- Xor Transformation
- java 排序方法详解_java中关于排序方式的实例讲解
- MAC下Android的Eclipse开发环境的搭建 转自MacroCheng
- 使用telnet登录varnish3.x管理缓存时认证问题
- 【路径规划】基于matlab遗传算法求解多物流中心开放式车辆路径规划【含Matlab源码 017期】
- mac 下载appium
- 二分算法——二分法求方程的根
- 【OpenGL】高级片段着色器——高斯模糊和索贝尔边缘检测
- C++异常处理throw
- QT下获取汉字拼音首字母
- 如何制作一封高打开率的邮件?
- 你还在用canvas画爱心吗?看我让你的名字在星空绽放
- HTTP请求携带用户密码验证
- pg数据库和mysql8_MySQL8与PG10:新版本下的较量谁更胜一筹?
- MIT制作迷你猎豹机器人 将机器人丢出去可以自动著陆
- PyQt5使用笔记(一) 处理excel文件获取页眉页脚信息 2020.03.14
- 使用describe()查看catering_sale.xls数据的基本情况,通过箱式图检测出catering_sale.xls中的异常值
热门文章
- u8显示云服务器已离线_u8登录不知道这样的主机
- 十大排序算法——堆排序(C语言)
- 香农编码实验报告matlab,实验三 香农编码
- DRL实战 : 强化学习在广告点击业务中的应用
- linux 安装socket扩展,51CTO博客-专业IT技术博客创作平台-技术成就梦想
- 智力问答选择题_智力问答题
- 常见排序算法整理2(C++实现)
- 小程序mysql+php测试,莲米粒是一个基于PHP+MySQL+微信小程序技术栈
- 【数字图像处理系列二】基本概念:亮度、对比度、饱和度、锐化、分辨率
- 【Gym - 100837 F】Controlled Tournament【竞赛树 状态压缩】