Oracle表复杂查询
转自:https://www.cnblogs.com/w-gao/p/7288293.html
Oracle表复杂查询
聚合函数
max(字段值) -- 求最大值
min(字段值) -- 求最小值
sum(字段值) -- 求总和
avg(字段值) -- 求平均值
count(字段值) -- 求个数
group by 和 having 字句
group by : 用于对查询的结果分组统计
having 子句:用于过滤分组显示的结果
案例:
1.显示每个部门的平均工资和最高工资?
select avg(sal),max(sal) from emp group by deptno
2.显示每个部门的每种岗位的平均工资和最低工资?
select avg(sal),min(sal) from emp group by deptno,job
3.显示平均工资低于2000的部门号和它的平均工资?
select avg(sal) deptno from emp group by deptno having avg(sal) < 2000;
多表查询

原理:
笛卡儿积: 在多表查询的时候,如果不带任何条件,则会出现笛卡儿积现象。
规定: 多表查询的条件至少不能少于表的个数-1;
案例:
1.显示雇员名,雇员工资及所在部门的名字?
select e.ename,e.sal, d.deptno
from emp e,dept d
where e.deptno = d.deptno
order by d.deptno;
2.显示部门号为10的部门名、员工名和工资?
select d.dname, e.ename, e.sa
l from emp e, dept d
where e.deptno = d.deptno and d.deptno = 10;
3.显示各个员工的姓名,工资,及其工资的级别?
select emp.ename ,emp.sal , salgrade.grade
from emp,salgrade
where emp.sal between salgrade.losal and salgrade.hisal;
自连接
案例:
1.显示“FORD”的上级?
select * from emp where emp.empno =
(select mgr from emp where ename = 'FORD');
2.显示各员工的姓名和他上级领导的姓名?
select worker.ename, boss.ename
from emp worker ,emp boss
where worker.mgr = boss.empno;
子查询
定义
嵌入到其他sql语句的select语句,也叫嵌套查询。
单行子查询
定义: 返回一行数据的子查询
案例:
如何显示SMITH同一部门的所有员工?
select * from emp where emp.deptno =
(select deptno from emp where ename = ‘SMITH’) and ename != 'SMITH';
多行子查询
定义:返回多行数据的子查询
案例:
显示10号部门的工作相同的员工姓名,工作?
select ename,job from emp where job in (
select job from emp where deptno = 10);
all( 大于最大的):
如何显示工资比30号部门高的员工的姓名、工资、部门号
select ename,sal,deptno from emp where sal > all(select sal from emp where emp.deptno = 30);
等效于
select ename,sal,deptno from emp where sal > (
select max(sal) from emp where deptno =30);
any( 大于最小的):
如何显示工资比30号部门任意员工高的员工的姓名、工资、部门号
select ename,sal,deptno from emp where sal > anyl(select sal from emp where emp.deptno = 30);
等效于
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’);
----------------------------------------------------
注: “(deptno,job) =(select deptno,job ”是有顺序的
from中的子查询
定义: 将select查询结果当作一个虚表处理
案例:
显示高于自己部门的平均工资的员工信息?
select t1.ename, t1.sal,t2.myavg from
emp t1,( select avg(sal) myavg ,deptno from emp group by deptno) t2
where t1.deptno = t2.deptno and t1.sal > t2.myavg;
显示每个部门的信息(编号,名称) 和人数?
select t1.dname, t1.deptno,t2.num from dept t1 , (select count(*) num,deptno from emp group by deptno) t2
where t1.deptno = t2.deptno(+);
--------------------------------------------------------
(+) 在左表示右外连接,在右表示左外连接
分页查询
mysql:
select * from 表名 where 条件 limit 从第几条取,取几条
sql server:
select top 4 * from 表名 where id not in (select top 4 id from 表名 where 条件)
---------------------------
排除前4条,再取4条,实际上是5-8条
oracle:
格式:
select * from (select rownum rn,t1.* from (select * from 表名 [ where 条件]) where rownum <= 末尾) t2 where t2.rn >= 开始;
---------------------------
rownum:伪列,用于显示数据的行索引。
select * from emp where rownum > = 3
说明: 因为oracle的行索引(rownum)是从第1开始索引的,所以不能用>=(条件无法成立),可以用<=。
解决: 采取截取结果集的方式,将已经查询好的查询结果再进行过滤。
三层:
第一层: select * from 表名 [ where 条件] --放条件,比如排序等
第二层: select rownum rn,t1.* from (select * from 表名 [ where 条件]) where rownum <= 末尾 --决定末尾位置
第三层: select * from (select rownum rn,t1.* from (select * from 表名 [ where 条件]) where rownum <= 末尾) t2
where t2.rn >= 开始; --决定开始位置
拓展:
复制表: create table mytest as select empno,ename,sal,comm,deptno from emp;
插入表:insert into mytest(empno,ename,sal,comm,deptno) select empno,ename,sal,comm,deptno from mytest;
内连接与外连接
内连接: 笛卡儿积过滤后的连接
案例:
select * from emp inner join dept on emp.deptno = dept.deptno;
等效于
select * from emp,dept where emp.deptno = dept.deptno
外连接:
案例:
测试表
学生表:
create table stu (id number,name varchar2(32));
insert into stu values(1,’tom’);
insert into stu values(2,’jerry’);
insert into stu values(3,’jack’);
insert into stu values(4,’rose’);
成绩表
create table exam(id number,grade number(6,2));
insert into exam(1,56);
insert into exam(2,76);
insert into exam(11,86);
要求1:显示所有人的成绩,如果没有成绩,也要显示该人的姓名和id号,成绩为空
select stu.id,stu.name,exam.grade from stu inner join exam on stu.id = exam.id;
结果:

原因:在笛卡儿积连接之后,相同条件的才会匹配
左连接:select stu.id,stu.name,exam.grade from stu left join exam on stu.id = exam.id;
另一种写法: select stu.id,stu.name,exam.grade from stu , exam where stu.id = exam.id(+);
结果:

原因:连接后的数据以左边表为基准,即使对应的右边没有数据,也要显示为空。
要求2:显示所有成绩,如果没有名字匹配,显示空
右连接:select stu.id,stu.name,exam.grade from stu right join exam on stu.id = exam.id;
另一种写法: select stu.id,stu.name,exam.grade from stu , exam where stu.id(+) = exam.id;
结果:

原因:连接后的数据以右边表为基准,即使对应的左边没有数据,也要显示为空。
小结: 左右外连接可以互为转换
比如:显示所有成绩,如果没有名字匹配,显示空
可以写出:select stu.id,stu.name,exam.grade from exam left join stu on stu.id = exam.id;
案例3:显示所有的成绩和所有人的名字,如果没有匹配值,就显示空
完全外连接:两个表查询,不管有么有匹配,都显示。
select stu.id,stu.name,exam.grade from exam full outer join stu on stu.id = exam.id;
结果:

Oracle表复杂查询的更多相关文章
- 08 Oracle表碎片查询以及整理(高水位线)
Oracle表碎片查询以及整理(高水位线) 1.表碎片的来源 当针对一个表的删除操作很多时,表会产生大量碎片.删除操作释放的空间不会被插入操作立即重用,甚至永远也不会被重用. 2.怎样确定是否有表碎片 ...
- Oracle 表空间查询与操作方法
一.查询篇 1.查询oracle表空间的使用情况 select b.file_id 文件ID, b.tablespace_name 表空间, b.file_name 物理文件名, b.bytes ...
- ORACLE表空间查询和管理【转】
红色是自由指定的~~--查询表空间SELECT D.TABLESPACE_NAME, SPACE "SUM_SPACE(M)", SPACE - NVL(F ...
- oracle表空间表分区详解及oracle表分区查询使用方法(转+整理)
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- Oracle 表复杂查询之多表合并查询
转自:https://www.cnblogs.com/GreenLeaves/p/6635887.html 本文使用到的是oracle数据库scott方案所带的表,scott是oracle数据库自带的 ...
- oracle表空间查询维护命令大全之中的一个(数据表空间)史上最全
表空间是数据库的逻辑划分,一个表空间仅仅能属于一个数据库. 全部的数据库对象都存放在建立指定的表空间中.但主要存放的是表, 所以称作表空间.在oracle 数据库中至少存在一个表空间.即S ...
- 常用oracle表空间查询语句
--查询数据库表空间使用情况 select a.tablespace_name,a.bytes/1024/1024 "Sum MB",(a.bytes-b.bytes)/1024/ ...
- 转: Oracle表空间查询
1.查询数据库中的表空间名称 1)查询所有表空间 select tablespace_name from dba_tablespaces; select tablespace_name from us ...
- oracle表空间查询维护命令大全之二(undo表空间)
--undo表空间汇总 --查看全部的表空间名字 select name from v$tablespace; --创建新的UNDO表空间,并设置自己主动扩展參数; create undo table ...
随机推荐
- python3学习笔记一(标识符、关键字)
查看Python版本 可以命令窗口,windows使用win+R调出cmd运行框,输入以下命令: python -V 进入python的交互编辑模式,也可查看 D:\Python3.6\Scripts ...
- Apollo分布式配置中心部署以及使用
一.简介Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场 ...
- mysql查询优化之二:查询优化器的局限性
在<mysql查询优化之一:mysql查询优化常用方式>一文中列出了一些优化器常用的优化手段.查询优化器在提供这些特性的同时,也存在一定的局限性,这些局限性往往会随着MySQL版本的升级而 ...
- Java-Runoob-高级教程-实例-方法:06. Java 实例 – 方法覆盖
ylbtech-Java-Runoob-高级教程-实例-方法:06. Java 实例 – 方法覆盖 1.返回顶部 1. Java 实例 - 方法覆盖 Java 实例 前面章节中我们已经学习了 Jav ...
- PHP——抽象类与接口的区别
在学习PHP面向对象时,都会在抽象类与接口上迷惑,作用差不多为什么还那么容易混淆,何不留一去一?但是事实上两者的区别还是很大的,如果能够很好地运用PHP的两个方法,面向对象的程序设计将会更加合理.清晰 ...
- awk 改名
awk 改名 echo ""|awk 'END{for(i=2;i<=100;i++){system("mv securitycode\ \("i&quo ...
- HTTP RFC解析
HTTP协议(HyperText Transfer Protocol,超文本传输协议)HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出, ...
- NameNode配置HA后及其反过程Hive路径不正确的问题解决
在CDH5.7下,配置了NameNode的HA后,Hive无正常查询数据了,但是其他的组件HDFS , HBase ,Spark都正常的.Hive新建表出现如下异常: CREATE TABLE `x_ ...
- Spark2.X环境准备、编译部署及运行
下载地址 :https://www.apache.org/dyn/closer.lua/spark/spark-2.2.0/spark-2.2.0.tgz 我们把spark放在节点2上 解压 下面我们 ...
- 在javascript中toString 和valueOf的区别
1.toString()方法:主要用于Array.Boolean.Date.Error.Function.Number等对象转化为字符串形式.日期类的toString()方法返回一个可读的日期和字符串 ...