本节剖析Oracle多表查询中的相关内容。

本文所用到的表为oracle中scott用户下的emp表,dept表,数据如下:

一、笛卡尔集:

概念:假设A,B是2个集合,A X B所形成的集合叫笛卡尔集。

实例1:A={a,b} B={c,d,e},那么A X B={(a,c),(a,d),(a,e),(b,c),(b,d),(b,e)}

图形实例如下:

A:

  B:

那么A X B:

由此可看出笛卡尔集的结果为列数相加行数相乘,其中有很多重复项。

那么在多表查询中如果查询出来的结果有重复项,通常会对我们需要的结果造成干扰,为了避免这种笛卡尔集的出现,可以添加有效的连接条件,如果有n张表,那么连接条件最少为n-1个。

二、交叉连接:

在oracle中笛卡尔集也有对应的求解,称为交叉连接cross join,示例如下:

Example:

select d.dname,e.ename,d.deptno,e.deptno from dept d cross join emp e;

emp表14条数据,dept表4条数据,14x4=56刚好等于笛卡尔集的结果。

三、自然连接:

概念:natural join是一种特殊的等值连接,将表中具有相同名称的列进行自动匹配,不需要再加等值条件。

Example:

select ename,deptno,dname from emp natural join dept;

可以看到dname是dept表中的列,条件中并没有加入emp.deptno=dept.deptno,但是结果仍然正确,这就是自然连接的作用,特别注意的是需要列名相同才可以。

四、内连接:

概念:inner join只返回满足条件的相匹配的查询结果,inner可省略。

(1)第一种用using子句建立连接

Example:

select ename,deptno,dname from emp join dept using(deptno);

(2)第二种:用on子句建立连接:

Example:

select ename,e.deptno,dname from emp e join dept d on e.deptno=d.deptno;

这2种都可以查询到我们想要的结果,那么这2种语句的意义在哪里呢,刚才有讲过自然连接会将列名相同作为条件,

如果此时2张表中有多个列值对应相等,那么oracle会自动将这些列都作为条件,而我们有可能只需要其中的一部分

作为条件,那么此时就用到了这2种语句,也是它们存在的价值。

五、外连接

概念:分为左外连接,右外连接,完全(外)连接,它们都返回满足结果的连接,不同的是左外连接还返回不满足左表的部分数据,

同样的右外连接还返回不满足右表的部分数据,完全连接则还返回不满足条件的部分数据,也就是说,左外连接返回左表的全部数据

右表的满足条件数据,右外连接返回右表的全部数据左表满足条件的数据,完全连接返回左右表的全部数据。

Example:

select ename,d.deptno,dname from dept d left join emp e on d.deptno=e.deptno;

select ename,d.deptno,dname from emp e right join dept d on e.deptno=d.deptno;

右外连接可以看做是将左外连接的表换了个位置,查询结果相同,所以此处只讲左外连接,dept表中有deptno=40的部门,但是

在emp表中并没有deptno=40的员工,如果此处没有用左外连接,那么就不会显示最后一行,如下图:

select ename,d.deptno,dname from dept d join emp e on d.deptno=e.deptno;

可以看到并没有deptno=40的那一行。

Example2:

select e.ename,d.dname from emp e full join dept d on e.deptno=d.deptno;

完全外连接可以看做是将左外连接和右外连接进行了一个“合体”,不满足的结果也会显示出来,可以看出来左外连接用到的情况最多。

另外,左外连接和右外连接还有另一种表达的方式,使用(+)操作符,

Expression:左外连接:select table1.column,table2.column from table t1,table2 t2 where t1.column = t2.column(+)

右外连接:select table1.column,table2.column from table1 t1,table2 t2 where t1.column(+) = t2.column

Example:

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

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

所查结果一样,这里我故意将条件的位置写反,说明并不是(+)的位置固定,而是要根据条件中的表的名字的位置判断,这也是外连接查询的一种写法,注意此处是where子句不再是on子句。

六、自连接:

概念:自连接很容易理解,就是同一张表,将它看做是2张一模一样的表,其中一张表的列可以作为另一个表的查询条件。

Example:在emp表中查询员工自己的上司。

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

分析:emp e表中的mgr是他的上司的empno,而他的上司的empno也在emp这张表中,这就将同一张表看成了2张表。

七、set运算符:

概念:专门用来合并多条select语句的结果,分为四种。

左图表示2个查询select1和select2,其中B是2个查询的重复数据。

1、union操作符:用于取得2个查询的并集,并且会将其中的重复数据去掉,最后按第一列的结果进行升序排序。

用图来表示就是     select1 union select2 = A+B+C

2、union all操作符:同样用于取得2个查询的并集,但不会将重复的数据去掉,也不会进行排序。

用图来表示就是   select1 union all select2 = A+B+B+C

3、intersect操作符:同于取得2个查询的交集 ,并且会以第一列的结果升序排序

用图表示就是:select1 intersect select2 =B

4、minus操作符:用于取得在第一个中的结果,但不在第二个中的结果,并且会以第一列的结果升序排序

用图表示就是    select1 minus select2 = A

Example:

先根据emp表和dept表做2张新表,emp01取部门号为10和20的,emp02取部门号为20和30的:

create tableemp01as

select * from emp where deptno in(10,20);

create tableemp02as

select * from emp where deptno in(20,30);

数据如下:

union操作符的运用:

select deptno,empno,ename fromemp01union

select deptno,empno,ename from emp02;

emp表中只有10,20,30部门的数据,所以union以后应该刚好是emp表的数据。

union all操作符的运用:

select deptno,empno,ename fromemp01union all

select deptno,empno,ename from emp02;

union all以后会将重复的也显示出来,所以部门号为20的员工会显示2次

intersect操作符的运用:

select deptno,empno,ename fromemp01intersect

select deptno,empno,ename from emp02;

intersect以后会将重复数据显示,所以只显示部门号为20 的数据。

minus操作符的运用:

select deptno,empno,ename fromemp01

minusselect deptno,empno,ename from emp02;

minus只显示第一个查询的结果,把其中和第二部分查询重复的删除,所以只显示10号部门不会显示20号部门的信息。

到此为止,多表查询全部总结完毕,有任何建议可以在下方评论。

2018-08-10    16:57:07

oracle查询第二个字为a,Oracle多表查询 - osc_yqnlq679的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. oracle M4,oracle高级部分 - osc_9gm4ypss的个人空间 - OSCHINA - 中文开源技术交流社区...

    回顾 多表关联查询的方式 内连接 根据AB表关联的条件进行过滤查询,只保留满足条件数据 Select * from a,b where a.xxx=b.xxx;Select * from a inne ...

  2. oracle的一ww,oracle积累 - 米图ww的个人空间 - OSCHINA - 中文开源技术交流社区

    计算本星期的起始结束日期 --得到星期一的日期 select trunc(sysdate,''DD'')-to_char(sysdate,''D'')+2 from dual; --得到星期天的日期 ...

  3. mysql查询未讲课教师_MySQL基础(查) - osc_hghvwmhn的个人空间 - OSCHINA - 中文开源技术交流社区...

    #新建一个表 create database exercise; #查询表的信息 SELECT * FROM student; SELECT * FROM score; #查询student表的第二条 ...

  4. mysql查询去重第一条_Mysql用法记录 - Ashley-OSCHINA的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.查询某个字段,在数据库不重复的条数(去重查询) select count(distinct item_uid) from supply_order; 查询 表 supply_order 中 ite ...

  5. mysql 命令记录_mysql命令记录 - 我要五个字的个人空间 - OSCHINA - 中文开源技术交流社区...

    慢查询日志记录状态 show variables like 'slow%'; 查询慢查询日记记录超时时间 show variables like 'long_query_time'; 设置慢查询超时时 ...

  6. mysql查询95031班人数_MySQL的查询练习 - osc_1ngzqx2h的个人空间 - OSCHINA - 中文开源技术交流社区...

    student表 teacher表 course表 score表 对这四个表进行一些练习. 1:查询student表中所有记录. select *from student; 2:查询student表中 ...

  7. 查询同学选修mysql课程的成绩_mysql-练习题 - osc_wy5qpqnh的个人空间 - OSCHINA - 中文开源技术交流社区...

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/mrbcy/article/detail ...

  8. android 基站定位 api,基站定位查询接口 - whoisliang的个人空间 - OSCHINA - 中文开源技术交流社区...

    本站查询接口免费开放 所有免费接口禁止从移动设备端直接访问,请使用固定IP的服务器转发请求. 每5分钟限制查询300次,基站/WIFI/经纬度查询接口每日限制查询1000次,反向基站查询接口每日限制查 ...

  9. 视图单行子查询返回mysql,Oracle命令整理 - osc_sj1kgo4z的个人空间 - OSCHINA - 中文开源技术交流社区...

    常用命令 1 sqlplus  scott/tiger@192.168.47.10:1521/orcl后面不要加: sqlplus  sys/oracle  as sysdba             ...

最新文章

  1. 轻松构建复杂数据集,永洪自服务数据查询功能详解
  2. android摄像头预览功能,android通过camera和surfaceview选择摄像头并即时预览
  3. 继续Bargaining
  4. 用了vscode和clion我都裂开了
  5. Gentoo Linux: /var/db/pkg 这个文件夹很重要![转]推荐阅读
  6. vue http get html模板,怎么用vue.js做异步请求?
  7. 15. PHP 全局变量 - 超全局变量
  8. Python Jupyter QtConsole
  9. ubuntu 安装qq
  10. python实现K均值聚类算法
  11. 龙格-库塔(Runge-Kutta)
  12. scrapy 中 COOKIES_ENABLED 设置
  13. 网易互联网(网易严选)测试开发工程师
  14. Centos配置iptables开放ftp服务
  15. [别被脱裤系列]2 还没深入数据库就浅出了
  16. 按音量键和按Fn+音量键,笔记本电脑均没反应的解决办法
  17. 群晖导入SSL证书HTTPS访问
  18. 全志v3s学习笔记(1)——基础简介及资料
  19. 关于旅行商,哈密顿回路和NP问题的科普
  20. AI神经网络-CNN基本结构分析( Conv层、Pooling层、FCN层/softmax层)

热门文章

  1. 简单约瑟夫环问题解法汇总(模拟/数论)
  2. P1115 最大子段和
  3. 云开发太简单了吧!「72变的云开发」有奖征文领三重好礼!
  4. 【活动回顾】Edge X Kubernetes,探索云原生新边界
  5. DTCC 2020 | 阿里云程实:云原生时代的数据库管理
  6. 孤尽独家解读《Java开发手册》,速来预约!
  7. MySQL数据库优化技巧大全
  8. react.JS并非完全开源,百度、Wordpress等带头弃之
  9. 使命召唤 战区:战术竞技新思路,卷入RPG元素的激烈战斗
  10. 数据库面试题【一、事务四大特性】