oracle从零开始学习笔记 二

多表查询

等值连接(Equijoin)

select ename,empno,sal,emp.deptno from emp,dept where dept.deptno=emp.deptno;

非等值连接(Non-Equijoin)

select ename ,empno,grade from emp,salgrade where sal>losal and sal<hisal;//between and 是包含俩边界值的,not between and 是不包含边界的 (between 1 and 100)

自连接(Self join)

select e.empno,e.ename,m.empno,ename from emp e,emp m where e.mgr=m.empno;

select e.empno,e.ename,m.empno,ename from emp e,emp m where m.mgr=e.empno;

左外连接(Left Out Join)

select empno,ename,dname from emp,dept where emp.deptno=dept.deptno(+);

select empno,ename,dname from emp left outer join on emp.deptno=dept.deptno;

右外连接(Right Outer join)

select empno,ename,dname from emp,dept where emp.deptno(+)=dept.deptno;

select empno,ename,dname from emp right outer join on emp.deptno=dept.deptno;

满外连接(Full Outer join)

selece empno,ename,dname from emp full outer join dept on emp.deptno=dept.deptno;

PS:左连接为左表为主,右表的空值不考虑,右连接同理

内连接

2 2

4 4

满连接

1

2 2

3

4 4

5

6

左连接

1

2 2

3

4 4

5

右连接

2 2

4 4

6

集合操作(最好表结构相同,起码要求union两边的字段数相同)

unino:并集,所有的内容都查询,重复的显示一次

unino all:并集,所有的内容都显示,包括重复的

intersect:交集:只显示重复的

minus:差集,只显示对方没有的(跟顺序是有关系的)

创建一张只包含20部门员工信息表:create teble emp20 as select * from emp where deptno=20;

select * from emp union select * from emp20;

select * from emp union all select * from emp20;

select * from emp intersect select * from emp20;
select * from emp minus select * from emp20;

子查询

单行子查询

select * from emp where sal >(select sal from emp where empno=7566);(子查询为空值则主查询也不会返回任何结果)

多行子查询

select ename, sal from emp where sal>any(select avg(sal) from emp gorup by deptno);比三个部门任一平均水平高即可

select ename, sal from emp where sal>all(select avg(sal) from emp gorup by deptno);比三个部门所有平均水平高即可

select ename,job from emp where job in(select job from emp where ename=‘MARTIN‘ or ename=‘SMITH‘);

TopN查询

select * from emp order by sal desc where rownum<=5;(rownum的值为2即为第2行,这里是返回前五行)

分页查询

select * from(select rownum no,e.* from (select * from emp order by sal desc) e where rownum<5) where no>=3;

select * from(select rownum no,e.* from (select * from emp order by sal desc) e) where no>=3 and no<=5;

exists        (类似于in)

select * from t1 where exists(select null from t2 where y=x);

对于in 和exists的性能区别:

如果子查询得出的结果集记录比较少,主查询中的表较大且又有索引时应该用in,反之如果外层的朱查询记录比较少,子查询的表达,又有索引时用exists.

其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是in,那么会先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了

另外in是不对null进行处理,如:

select 1 from dual where null in (0,1,2,null)为空

练习:

1.列出员工表中每个部门的员工数,和部门no

select deptno,count(*) from emp group by deptno

2.列出员工表中每个部门的员工数(员工数必须大于3)和部门名称

select d.*,ed.cou from dept d,(select deptno,count(*)cou from emp group by deptno having count(*)>3) ed where ed.deptno=d.deptno;

3.找出工资比Jones多的员工

select * from emp where sal>(select sal from emp where ename=‘JONES‘);

4,列出所有员工的姓名及其上级的姓名

select e1.ename lower,e2.ename upper from emp e1,emp e2 where e1.mgr=e2.empno(+);

5.以职位分组,找出平均工资最高的两种职位

select * from (select job,avg(sal) from emp group by job order by avg(sal) desc)where rownum<3;

6.查找出不在部门20,且比部门20中任何一个人工资都高的员工姓名,部门名称

select ename,dname from emp e,dept d where e.deptno !=20 and e.deptno=d.deptno and sal >all(select sal from emp where deptno=20);

select ename,dname from emp e,dept d where e.deptno !=20 and e.deptno=d.deptno and sal >(select max(sal) from emp where deptno=20);

7.得到平均工资大于2000的工作职种

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

8.得到每个月工资总数最少的那个部门的部门编号,部门名称,部门位置

select * from dept where deptno=(select e.deptno from (select deptno,sum(sal) from emp group by deptno order by sum(sal))e where rownum=1)

9.得到平均工资等级为4级(工资等级表salgrade)的部门编号

select e.deptno from salgrade g,(select deptno,avg(sal)avgsal from emp group by deptno)e where g.grade=4 and e.avgsal between g.losal and g.hisal;

10.找出收入(工资加奖金),下级比上级还高的员工编号,员工姓名,员工收入

select e.ename,e.ename,e.sal+nvl(e.comm,0)from emp e,emp m where e.mgr=m.empno and (e.sal+nvl(e.comm,0))>(m.sal+nvl(m.comm,0));

11.找出工资等级不为4级的员工的员工姓名,部门名称,部门位置

select e.ename,d.dname,d.loc from emp e,dept d,salgrade g where e.deptno=d.deptno and g.grade=4 and e.sal not between g.losal and g.hisal;

12.找出职位和‘Martin’或者‘smith’一样的员工的平均工资

select avg(sal) from emp where job in (select job from emp where ename=‘MARTIN‘ or ename=‘SMITH‘ );

时间: 2024-10-26 14:18:15

oracle从零开始学习笔记 二的相关文章

oracle从零开始学习笔记 三

笔试题 设有关系EMP(ENO,ENAME,SALARY,DNO)其中各属性的含义依次为职工号.姓名.工资.所在部门号, 以及关系DEPT(DNO,DNAME,MANAGER)其中各含义依次为部门号.部门名称.部门经理的职工号 1.请通过SQL语句创建表EMP.DEPT. create table emp(eno number(5) primary key ,ename varchar2(5),salary number(8),dno number(3)); create table dept(

oracle从零开始学习笔记

查询现有数据库:select name from V$database; 解锁用户scott:alter user scott account unlock; 普通用户连接:conn scott 默认密码:tiger 普通管理员:system/system 超级管理员:Sys/sys 断开连接:disconnect 当前用户:show user 查看该用户下的所有对象:select * from tab; dual表是oracle内虚拟的一个表,妙用很多 单行函数 模糊查询 %表示零个或多个字符

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚

Oracle Rac11g 学习笔记

查看集群节点状态 命令是olsnodes -i 显示每个节点的VIP, -n 显示每个节点在RAC集群中的编号 -p 显示每个节点所使用的私有IP地址 -s 显示每个节点的状态(activive或者inactive) 列车集群中所有资源 crs_stat -t 查看crs资源状态 crsctl check crs 查看ctss服务的状态 crsctl check ctss 查看集群中所有节点状态 crsctl check cluster -all 查看ASM实例进程 ps -ef | grep

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

马哥学习笔记二十四——分布式复制快设备drbd

DRBD: 主从 primary: 可执行读.写操作 secondary: 文件系统不能挂载 DRBD: dual primay, 双主(基于集群文件系统的高可用集群) 磁盘调度器:合并读请求,合并写请求: Procotol:drbd数据同步协议 A: Async, 异步  数据发送到本机tcp/ip协议栈 B:semi sync, 半同步  数据发送到对方tcp/ip协议 C:sync, 同步  数据到达对方存储设备 DRBD Source: DRBD资源 资源名称:可以是除了空白字符外的任意

【Unity 3D】学习笔记二十八:unity工具类

unity为开发者提供了很多方便开发的工具,他们都是由系统封装的一些功能和方法.比如说:实现时间的time类,获取随机数的Random.Range( )方法等等. 时间类 time类,主要用来获取当前的系统时间. using UnityEngine; using System.Collections; public class Script_04_13 : MonoBehaviour { void OnGUI() { GUILayout.Label("当前游戏时间:" + Time.t