一、多表查询

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 多表查询、查询运算符和集合运算的更多相关文章

  1. oracle多表关联查询和子查询

    oracle多表关联查询和子查询 一.多表关联查询 例子: SQL> create table student1 ( sid ), sname ), sage )); Table created ...

  2. Mybatis oracle多表联合查询分页数据重复的问题

    Mybatis oracle多表联合查询分页数据重复的问题 多表联合查询分页获取数据时出现一个诡异的现象:数据总条数正确,但有些记录多了,有些记录却又少了甚至没了.针对这个问题找了好久,最后发现是由于 ...

  3. oracle 树形表结构查询 排序

    oracle 树形表结构排序 select * from Table start with parentid is null connect by prior id=parentid order SI ...

  4. oracle 两表关联查询

      oracle 两表关联查询 CreationTime--2018年7月4日17点27分 Author:Marydon 情景描述 查询学生表student,sname,sex,age信息及所在班级c ...

  5. oracle系统表的查询

    oracle查询用户下的所有表 select * from all_tab_comments -- 查询所有用户的表,视图等select * from user_tab_comments   -- 查 ...

  6. oracle 多表连接查询 join(一)

    一.简介: 多表连接查询通过表之间的关联字段,一次查询多表数据. 下面将依次介绍 多表连接中的如下方法: 1.from a,b 2.inner join 3.left outer join 4.rig ...

  7. oracle 多表连接查询 join

    转 简介: 多表连接查询通过表之间的关联字段,一次查询多表数据. 下面将依次介绍 多表连接中的如下方法: 1.from a,b 2.inner join 3.left outer join 4.rig ...

  8. Oracle入门基础(七)一一集合运算

    SQL> /* SQL> 查询10和20号部门的员工 SQL> 1. select * from emp where deptno=10 or deptno=20; SQL> ...

  9. oracle 多表连接查询

    一.内连接(inner join (可简写为join)) 内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值. 1.等值连接:在连接条件中使用等于号(=)运算符比较被连接列的 ...

随机推荐

  1. NLog——ElasticSearch——Kibana

    Nlog.elasticsearch.Kibana以及logstash在项目中的应用(一) Nlog.elasticsearch.Kibana以及logstash在项目中的应用(二) ASP.NET ...

  2. 51nod 1351 吃点心(贪心)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1351 题意: 思路: 要么先选low值大的,要么先选high值大的,分两 ...

  3. SqlParameter 多个参数动态拼接解决参数化问题

    多个参数化是固定比较easy,多个动态的就有点...工作中遇到的问题整理下来分享 ,上代码 SqlParameter[] param = new SqlParameter[] { }; List< ...

  4. gulp的使用介绍及技巧

    gulp的使用介绍及技巧 转载: https://www.cnblogs.com/2050/p/4198792.html 1.gulp的安装 首先确保你已经正确安装了nodejs环境.然后以全局方式安 ...

  5. 前端单页面富应用(SPA)的实现

    一. 什么是单页面富应用? 单页面应用:Single Page Application 概念:Web应用即使不刷新也在不同的页面间切换,解决浏览器前进.后退等机制被破坏等问题.并且页面访问会被浏览器保 ...

  6. 动态LINQ(Lambda表达式)

    1.准备数据实体 public class Data { public string AccountNO { get; set; } public int Count { get; set; } } ...

  7. Given d and e, factorize N to attack RSA

    题目如下: RSA算法的使用一般要求每个不同的用户有一个独立的模数N.有天,Bob脑洞大开,认为似乎没有必要这样做.只需要一个模数N,然后给不同的用户分发不同的e和d就好了.可惜这种做法有严重的安全漏 ...

  8. Codeforces 1016 E - Rest In The Shades

    E - Rest In The Shades 思路: 相似 红色的长度等于(y - s) /  y 倍的 A' 和 B' 之间的 fence的长度 A' 是 p 和 A 连线和 x 轴交点, B'同理 ...

  9. Codeforces 934C - A Twisty Movement

    934C - A Twisty Movement 思路:dp 很容易想到要预处理出1的前缀和pre[i]和2的后缀和suf[i] 然后枚举区间,对于每个区间如果能求出最长递减序列的长度,那么就能更新答 ...

  10. angular2 脏检查机制

    https://www.waitig.com/angular2-%E8%84%8F%E6%A3%80%E6%9F%A5%E8%BF%87%E7%A8%8B.html https://zhuanlan. ...