ORACLE 多表连接与子查询
Oracle表连接
SQL/Oracle使用表连接从多个表中查询数据
语法格式:
select 字段列表
from table1,table2
where table1.column1=table2.column2;
说明:
在where子句中指定连接条件
当被连接的多个表中存在同名字段时,必须在该字段前加上"表名"作为前缀.
连接的类型
Oracle8i之前的表连接:
等值连接(Equijoin)
非等值连接(Non-Equijoin)
外连接(Outer join):-->左外连接-->右外连接
自连接(Self join)
Oracle9之后新引入的连接形式(支持SQL99规范)
交叉连接(Cross join)
自然连接(Natural join)
使用Using子句建立连接
使用on子句建立连接
外连接(Outer join):-->左外连接-->右外连接-->全外连接
等值连接(Equijoin)
select empno,ename,sal,emp.deptno,dname from emp,dept
where emp.deptno = dept.deptno;
多表连接中:
- 可使用AND操作符增加查询条件
- 使用表别名可以简化查询
- 使用表名(表别名)前缀可提高查询效率
- 为了连接n个表,至少需要n-1个连接条件
非等值连接(Non-Equijoin)
外连接(Outer join)
使用外连接可以看到参与连接的某一方不满足连接条件的记录
外连接运算符为(+)
传统的外连接分为左外连接和右外连接两种
语法格式:
select 字段列表
from table1,table2
where table1.column1(+)=table2.column2;
select 字段列表
from table1,table2
where table1.column1=table2.column2(+);
自连接(Self join)
select a.enpno,a.ename,a.ngr,b.ename
from emp a,emp b
where a.ngr = b.enpno;
SQL99连接语法
SQL1999规范中规定的连接查询语法

select 字段列表
from table1
[cross join table2] |
[natural join table2] |
[join table2 using(字段名)] |
[join table2 on(table.column_name=table2.column_name)] |
[(left | right | full out ) join table2
on(table1.column_name=table2.column_name)];

交叉连接(Cross join)
Cross join 产生了一个笛卡尔集,其效果等同于再两个表进行连接时未使用where子句限定连接条件;
select empno,ename,sal,emp.deptno,dname
from emp cross join dept;
自然连接(Natural join)
Natural join基于两个表中的全部同名列建立连接
- 从两个表中选出同名列的值均对应相等的所有行
- 如果两个表中的同名列的所有数据类型不同,则出错
- 不允许在参照列上使用表名或者别名作为前缀
select empno,ename,sal,emp.deptno,dname
from emp natural join dept;
Using子句
如果不希望参照被连接表的所有同名列进行等值连接,自然连接将无法满足要求,可以在连接时使用USING子句来设置用于等值连接的列(参照列)名.
select empno,ename,sal,emp.deptno,dname
from emp join dept
using(deptno);
不允许在参照列上使用表名或者别名作为前缀
On子句
如果要参照非同名的列进行等值连接,或想设置任意的连接条件,可以使用On子句
select empno,ename,sal,emp.deptno,dname
from emp join dept
on(emp.deptno=dept.deptno);
多表连接
使用SQL99连接语法,两个以上的表进行连接时应依次/分别指定相临的两个表之间的连接条件.

select 字段列表
from table1
[cross join table2] |
[natural join table2] |
[join table2 using(字段名)] |
[join table2 on(table.column_name=table2.column_name)] |
[(left | right | full out ) join table2
on(table1.column_name=table2.column_name)]
[cross join table3] |
[natural join table3] |
[join table3 using(字段名)] |
[join table3 on(table.column_name=table3.column_name)] |
[(left | right | full out ) join table3
on(table2.column_name=table3.column_name)]...;

内连接和外连接
内连接(Inner join)
在SQL99规范中,内连接只返回满足连接条件的数据.
外连接(Outer join)
左外连接(Left Outer Join)
两个表在连接过程中除返回满足连接条件的行为外,还返回左表中不满足条件的行为,这种连接称为左外连接.
右外连接(Right Outer Join)
两个表在连接过程中除返回满足连接条件的行为外,还返回右表中不满足条件的行为,这种连接称为右外连接.
满外连接(Full Outer Join)
Oracle9开始新增功能,两个表在连接过程中除返回满足连接条件的行为外,还返回两个表中不满足条件的所有行为,这种连接称为满外连接.
子查询(Sub Query)
子查询子查询在主查询前执行一次
主查询使用子查询的结果
select 字段列表
from table
where 表达式 operator (select 字段列表 from table);
使用子查询注意事项
- 在查询时基于未知时应考虑使用子查询
- 子查询必须包含在括号内
- 将子查询放在比较运算符的右侧,以增强可读性.
- 除非进行Top-N分析,否则不要再子查询中使用Order by子句
- 对单行子查询使用单行运算符
- 对多行子查询使用多行运算符
单行子查询
单行子查询只返回一行记录
对单行子查询可使用单行记录比较运算符
=--------------等于
>--------------大于
>=------------大于等于
<--------------小于
<=--------------小于等于
<>--------------不等于
select * from emp
where sal>(select sal from emp where empno=7000);
子查询空值/多值问题
- 如果子查询未返回任何行,则主查询页不会返回任何结果
- 如果子查询返回单行结果,则为单行子查询,可以在主查询中对其使用相应的单行记录比较运算符
- 如果子查询返回多行结果,则为多行子查询,此时不允许对其使用单行记录比较运算符
多行子查询
多行子查询返回多行记录
对多行子查询只能使用多行记录比较运算符
in--------------等于列表中的任何一个
any--------------和子查询返回的任意一个值比较
all--------------和子查询返回的所有值比较
select * from emp
where sal>any(select avg(sal) from emp group by deptno);
select * from emp
where sal>all(select avg(sal) from emp group by deptno);
select * from emp
where job in(select job from emp where ename='martin' or ename='ssss');
TopN查询
在oracle中通常采用子查询的方式来实现Top n查询

select 字段列表
from(select 字段列表 from table order by 排序字段)
where rownum <=n;
------------------------------------------------------------
select *
from(select * from emp order by sal desc)
where rownum <=5;

摘自:http://www.cnblogs.com/ddatsh/archive/2010/12/09/1901423.html
ORACLE 多表连接与子查询的更多相关文章
- MySQL多表查询之外键、表连接、子查询、索引
MySQL多表查询之外键.表连接.子查询.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为 ...
- ylb:SQL 表的高级查询-多表连接和子查询
ylbtech-SQL Server: SQL Server-表的高级查询-多表连接和子查询 SQL Server 表的高级查询-多表连接和子查询. 1,ylb:表的高级查询-多表连接和子查询 返回顶 ...
- MySQL开发——【联合查询、多表连接、子查询】
联合查询 所谓的联合查询就是将满足条件的结果进行拼接在同一张表中. 基本语法: select */字段 from 数据表1 union [all | distinct] select */字段 fro ...
- MySQL学习笔记——多表连接和子查询
多表连接查询 # 返回的是两张表的乘积 SELECT * FROM tb_emp,tb_dept SELECT COUNT(*) FROM tb_emp,tb_dept # 标准写法,每个数据库都能这 ...
- 读《程序员的SQL金典》[3]--表连接、子查询
一.表连接-JOIN 1. 自连接实例 查询类型相同的订单信息. SELECT O1 .*,O2.* FROM T_Order O1 JOIN T_Order O2 ON O1 .FTypeId= O ...
- MS sql server 基础知识回顾(二)-表连接和子查询
五.表连接 当数据表中存在许多重复的冗余信息时,就要考虑将这些信息建在另一张新表中,在新表中为原表设置好外键,在进行数据查询的时候,就要使用到连接了,表连接就好像两根线,线的两端分别连接两张表的不同字 ...
- MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- MySQL数据库学习笔记----MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- mysql学习笔记-- 多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
随机推荐
- JMeter基础之-使用技巧
在这此对新版本jmeter的学习+温习的过程,发现了一些以前不知道的功能,所以,整理出来与大分享.本文内容如下. 如何使用英文界面的jmeter 如何使用镜像服务器 Jmeter分布式测试 启动Deb ...
- 长尾分布,重尾分布(Heavy-tailed Distribution)
Zipf分布: Zipf分布是一种符合长尾的分布: 就是指尾巴很长的分布.那么尾巴很长很厚的分布有什么特殊的呢?有两方面:一方面,这种分布会使得你的采样不准,估值不准,因为尾部占了很大部分.另一方面, ...
- CentOS7.1 安装Liberty之环境准备(1)
一.基础平台 1.一台装有VMware的windows系统(可联网) 2.CentOS 7.1 64bit镜像 二.最小化安装两台CentOS 7.1 的虚拟机controller.compute1, ...
- MAC Ruby版本需要升级至2.2.2以上
第一例: 默认情况下,Mac OS X 系统已经安装好 Ruby(最新的 Mavericks 随机的 Ruby 版本为 2.0.0p247),安装在 /System/Library/Framework ...
- 红黑树red-black tree
书籍:<算法导论>第13章 红黑树性质:1. 每个节点要么red要么black.2. 根节点是black节点.3. 叶子节点是black节点.4. red节点的左右儿子节点都是black节 ...
- mac 干掉Dashboard
打开终端,输入下面的命令: defaults write com.apple.dashboard mcx-disabled -boolean YES 然后再重启一下 Dock,在终端输入 kill ...
- 【洛谷】P1040 加分二叉树
[洛谷]P1040 加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数 ...
- 线段树lazy标记??Hdu4902
Nice boat Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) To ...
- 使用JMAP dump及分析dump文件
查看整个JVM内存状态 jmap -heap [pid]要注意的是在使用CMS GC 情况下,jmap -heap的执行有可能会导致JAVA 进程挂起 查看JVM堆中对象详细占用情况jmap -his ...
- LNMP+Zabbix搭建
LNMP+Zabbix搭建 cmake2.8.8,Nginx-1.6.3,Php-5.5.38,Mysql-5.5.32,Zabbix-3.2.6 修改 /etc/selinux/config 文件中 ...