多表查询
等值连接(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
左连接
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' );
- Oracle使用学习笔记(二)_Sql语句
一.Sql语句的分类 数据操作语言,简称DML(data manipulation language),如增加,删除,修改,查询数据等 数据定义语言,简称DDL(data defination lan ...
- oracle从零开始学习笔记 三
高级查询 随机返回5条记录 select * from (select ename,job from emp order by dbms_random.value())where rownum< ...
- oracle从零开始学习笔记
查询现有数据库:select name from V$database; 解锁用户scott:alter user scott account unlock; 普通用户连接:conn scott 默认 ...
- Oracle基础学习笔记
Oracle基础学习笔记 最近找到一份实习工作,有点头疼的是,有阶段性考核,这...,实际想想看,大学期间只学过数据库原理,并没有针对某一数据库管理系统而系统的学习,这正好是一个机会,于是乎用了三天时 ...
- 从零开始学习jQuery (二) 万能的选择器
本系列文章导航 从零开始学习jQuery (二) 万能的选择器 一.摘要 本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
随机推荐
- [R]R的工作流
最近处理数据时,一直在纠结程序的结构该如何构建,以减少很多简单又很耗时的工作. 刚好把Rob J Hyndman的blog给浏览了一遍,发现一篇2009年的文章,很有启发. 原文: Workflow ...
- 修改文档框架:word-多级列表与标题样式相结合
转自:http://blog.sina.com.cn/s/blog_6721f25c0100nuf0.html 设置标题的时候希望出现多标题并且自动编号的标题,如下1. XXXXXXXXXXX ...
- 拓展企业VR培训业务,这家VR训练公司StriVR完成500万美元融资!
虚拟现实初创公司StriVR最近发布了新的企业VR训练产品项目,并宣布在刚刚结束的首轮融资中获得500万美元投资.由Signia Venture Partners领投,宝马i Venturesi.Ad ...
- 《隆重介绍 思源黑体:一款Pan-CJK 开源字体》
关于思源黑体 思源黑体是谷歌与 Adobe 联合开发,支持简体中文.繁体中文.日文.韩文以及英文:支持 ExtraLight.Light.Normal.Regular.Medium.Bold 和 He ...
- topcoder SRM 623 DIV2 CatAndRat
解决本题的一个关键点就是当Cat进入时,此时Rat在哪个位置? 注意移动方向可以随时改变,由于是圆环,故离入口最远点的距离是pi*R,即圆的一半, 当cat进入时(cat的速度大于rat的速度,否则不 ...
- ACM: FZU 2148 Moon Game - 海伦公式
FZU 2148 Moon Game Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 ...
- 洛谷 P1967 货车运输 Label: 倍增LCA && 最小瓶颈路
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- 【BZOJ】2675: Bomb
题意: 给n个点,任选其中3个点(一个点只能取一次),求选出三个点的最大曼哈顿距离之和与最小曼哈顿距离之和(n<=10^5). 题解: 最大曼哈顿距离之和很好求,就是能包围所有点的经过三个点的矩 ...
- 【wikioi】1025 选菜
题目链接 算法:01背包DP 此题主要是预处理恶心.我提交了2次...第一次数组开小了...(体积要=V*10) 注意: 钱做为体积,美味价值作为价值 注意,因为体积(钱)是小数点后1位,故数组下标无 ...
- SRM 594 DIV1 250
可能开始宿舍比较乱,思绪静不下来...想了大半个小时,终于确定了应该暴力+DP,然后写了枚举除数,和被除的版本..这样,还敲错了个字母,第一次提交还100多,修改提交还有75.多,最后想到,貌似不打对 ...