Oracle 多表查询、查询运算符和集合运算
一、多表查询
1、内连接
一般使用INNER JOIN关键字指定内连接,INNER可以省略,默认表示内连接。查询结果中只包含两表的公共字段值相等的行,列可以是两表中的任意列
2、外连接
包括左外连接、右外连接、全外连接
(1)左外连接 LEFT JOIN
结果集中包括两表连接后满足ON后面指定的连接条件的行,还显示JOIN关键字左侧表中所有满足检索条件的行,如何左表的某行在右表中没有匹配行,则在结果中,右表的所有选择列均为NULL。
(2)右外连接 RIGHT JOIN
是左外连接的反向连接。
(3)完全外连接 FULL JOIN
完全外连接查询的结果集包括两表内连接的结果集和左表与右表中不满足条件的行。
3、交叉连接

下面使用emp和dept表进行多表查询:
select ename,dname
from emp
where ename='SMITH'
执行结果:

改成:
select ename,(select dname from dept where deptno=20) as 部门
from emp
where ename='SMITH'
若不知道SMITH在20号部门,则要改成:
select ename,(select dname from dept where deptno=(select deptno from emp where ename='SMITH')) as 部门
执行结果:

1、内连接
一般使用INNER JOIN关键字指定内连接,INNER可以省略,默认表示内连接。查询结果中只包含两表的公共字段值相等的行,列可以是两表中的任意列
select ename,dname
from emp,dept
where emp.deptno=dept.deptno and emp.ename='SMITH'
等同于:
select ename,dname
from emp a inner join dept b --a,b分别是emp,dept的别名
on a.deptno=b.deptno and a.ename="SMITH'
2、外连接
左外连接
select ename,dname
from emp a left join dept b --a,b分别是emp,dept的别名 --或者 from emp,dept
on a.deptno=b.deptno where a.ename="SMITH" -- a.deptno=b.deptno(+) 也表示左外连接
执行结果都是:

内连接和外连接的区别,可以从以下看出:
A表: B表: C表:
| Aid | Aname |
| A1 | A |
| A2 | AA |
| A3 | AAA |
| A4 | AAAA |
| A5 | AAAAA |
| Bid | Bname |
| B1 | B |
| B2 | BB |
| B3 | BBB |
| B4 | BBBB |
| B5 | BBBBB |
| Cid | Aid | Bid | Cname |
| C1 | A1 | B1 | C |
| C2 | A2 | B2 | CC |
| C3 | A3 | B3 | CCC |
| C4 | null | B4 | CCCC |
| C5 | null | null | CCCC |
------------内连接------------
select c.cid,b.bid,a,aid
from c,b
where c.bid=b.bid and c.aid=a.aid
执行结果:(必须都有,并且全都不为空)
| Cid | Bid | Aid |
| C1 | B1 | A1 |
| C2 | B2 | A2 |
| C3 | B3 | A3 |
------------左外连接 LEFT JOIN ------------
select c.cid,b.bid
from c,b
where c.bid=b.bid(+)
执行结果:(以C表为中心,允许输出NULL)
| Cid | Bid |
| C1 | B1 |
| C2 | B2 |
| C3 | B3 |
| C4 | B4 |
| C5 | null |
------------右外连接 RIGHT JOIN ------------
select c.cid,b.bid
from c right join b
on c.bid=b.bid
执行结果:(以B表为中心,允许输出NULL)
| Cid | Bid |
| C1 | B1 |
| C2 | B2 |
| C3 | B3 |
| C4 | B4 |
| null | B5 |
------------全外连接 FULL JOIN ------------
select c.cid,b.bid
from c full join b
on c.bid=b.bid
执行结果:
| Cid | Bid |
| C1 | B1 |
| C2 | B2 |
| C3 | B3 |
| C4 | B4 |
| null | B5 |
| C5 | null |
3、交叉连接
交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合,交叉连接也称为笛卡尔积。
select c.cid,b.bid
from c cross join b
on c.bid=b.bid
二、查询预算符
Exists:子查询至少返回一行时条件为true。当括号内的查询语句为true,才能继续查询。
select * from emp where exists(select * from emp where deptno!=50)
Not Exists:子查询不返回任何一行时条件为true。
In:与子查询返回结果集中某个值相等。
Not In:与子查询返回结果集中任何一个值不相等。
>ANY:比子查询返回结果中的某个值大。
查询任意一个比20号部门工资高的员工(大于20号部门最少的工资):
select ename, sla
from emp
where deptno!=10
and sal>any(select sal from emp where deptno=20)
=ANY:与子查询返回结果中的某个值相等。
<ANY:比子查询返回结果中的某个值小。
>ALL:比子查询返回结果中的所有值都大。
查询比20号部门高于所有员工的工资(大于20号部门最多的工资):
select ename, sla
from emp
where deptno!=10
and sal>all(select sal from emp where deptno=20)
三、集合运算
集合运算就是将两个或者多个结果集组合成为一个结果集。
种类:
并集 union all 返回各个查询的所有记录,包括重复记录。
并集 union 返回各个查询的所有记录,不包括重复记录。
交集 intersect 返回两个查询共有的记录。
补集 minus 返回第一个查询的记录减去第二个查询记录之后剩余的记录。
查询不隶属于30号部门的CLERK:
select * from emp where job="CLERK"
minus --补集 排除下面的条件
select * from emp where deptno=30
操作自增序列:
nextval 每次默认使用 自动加1 不管成功与否
select emp_dept.nextval from dual
insert into emp(ename) values(null)
currval 自带序列维护 不成功+1
select emp_dept.currval from dual
排名: 112 113 123
select ename,sal
rank() over(order by sal desc) as 排名113,
dense_rank() over(order by sal desc) as 排名112,
row_number() over(order by sal desc) as 排名123
from emp
Oracle 多表查询、查询运算符和集合运算的更多相关文章
- oracle多表关联查询和子查询
oracle多表关联查询和子查询 一.多表关联查询 例子: SQL> create table student1 ( sid ), sname ), sage )); Table created ...
- Mybatis oracle多表联合查询分页数据重复的问题
Mybatis oracle多表联合查询分页数据重复的问题 多表联合查询分页获取数据时出现一个诡异的现象:数据总条数正确,但有些记录多了,有些记录却又少了甚至没了.针对这个问题找了好久,最后发现是由于 ...
- oracle 树形表结构查询 排序
oracle 树形表结构排序 select * from Table start with parentid is null connect by prior id=parentid order SI ...
- oracle 两表关联查询
oracle 两表关联查询 CreationTime--2018年7月4日17点27分 Author:Marydon 情景描述 查询学生表student,sname,sex,age信息及所在班级c ...
- oracle系统表的查询
oracle查询用户下的所有表 select * from all_tab_comments -- 查询所有用户的表,视图等select * from user_tab_comments -- 查 ...
- oracle 多表连接查询 join(一)
一.简介: 多表连接查询通过表之间的关联字段,一次查询多表数据. 下面将依次介绍 多表连接中的如下方法: 1.from a,b 2.inner join 3.left outer join 4.rig ...
- oracle 多表连接查询 join
转 简介: 多表连接查询通过表之间的关联字段,一次查询多表数据. 下面将依次介绍 多表连接中的如下方法: 1.from a,b 2.inner join 3.left outer join 4.rig ...
- Oracle入门基础(七)一一集合运算
SQL> /* SQL> 查询10和20号部门的员工 SQL> 1. select * from emp where deptno=10 or deptno=20; SQL> ...
- oracle 多表连接查询
一.内连接(inner join (可简写为join)) 内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值. 1.等值连接:在连接条件中使用等于号(=)运算符比较被连接列的 ...
随机推荐
- 20165306学习基础和C语言基础调查
20165306学习基础和C语言基础调查 技能学习心得 我认为兴趣.责任感.毅力对技能的获得非常重要. 因为我从小五音不全.肢体不协调,所以看春晚等节目的时候会把更多的关注点放在主持人身上.小时候觉得 ...
- python学习打卡 day12 生成器
本节主要内容 : 生成器 生成器函数 各种推导式 生成器表达式 一.生成器 什么是生成器.生成器的本质就是迭代器. 在python中有三种方式来获取生成器: 1.通过生成器函数 2.通过各种推导式来实 ...
- Scala语言学习
Scala的程序被编译成Java字节码(生成class文件),所以可以运行在JVM上,并且可以调用Java的类库,兼容Java程序. Scala 是一门多范式(multi-paradigm)的编程语言 ...
- 转 class和struct最本质的区别
class和struct最本质的区别是class是引用类型,而struct是值类型,它们在内存中的分配情况有所区别. 什么是class? class(类)是面向对象编程的基本概念,是一种自定义数据结构 ...
- Codeforces 769D k-Интересные пары чисел
题目链接:http://codeforces.com/contest/769/problem/D 搜索题 考虑这些数的值域较小,直接${O(2^{k})}$次方枚举每个数字二进制位上是否改变,剪枝一下 ...
- 实现一个键对应多个值的字典(multidict)
一个字典就是一个键对应一个单值的映射.如果你想要一个键映射多个值,那么你就需要将这多个值放到另外的容器中, 比如列表或者集合里面.比如,你可以像下面这样构造这样的字典: d = { , , ], , ...
- restFul接口设计规范
1.域名 1 应该尽量将API部署在专用域名之下. https://api.example.com 2 如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下. https://example. ...
- MySql登陆密码忘记了怎么办?MySQL重置root密码方法
本文主要介绍Windows和Linux系统下忘记密码重置root密码的方法,需要的朋友可以参考下. MySQL有时候忘记了root密码是一件伤感的事.这里提供Windows 和 Linux 下的密码重 ...
- Oracle(转换函数)
在数据库中主要使用数据类型:字符,数字,日期(时间戳),所以这三种数据类型之间需要实现转换操作. 常用转换函数: 3.1.TO_CHAR()函数 将数据类型变为字符串. 日期格式化标记: 在TO_CH ...
- [原][数学][C++][osg]空间向量OA到转到空间向量OB、以及四元素Q1转到Q2的函数
注意:Oa其实在OK的延长线上,上图只是为了好看才把Oa和OK分开了 算法需求如图所示: 已知空间向量OA和空间向量OB 我想算出OA向OB按某角度或者某时间移动 变成空间向量Oa的算法 先说废话:我 ...