1.简述 

1) 两个表的连接,是通过将一个表中的一列或者多列同另一个表中的列链接而建立起来的。用来连接两张表的表达式组成了连接条件。当连接成功后,第二张表中的数据就同第一张表连接起来了,并形成了复合结果集
 
2) 有5种基本类型的的连接,inner,outer,natural,cross连接,自连接。
 

2.说明与例子

1)内连接 (inner join (可简写为join))

  内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。

  1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复属性。 (区别于自然连接)

  2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的 列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。

teacher 和 student 表
   
eg1:等值连接:
SELECT S.*, T.* FROM STUDENT S INNER JOIN TEACHER  T ON S.TEACHERID = T.ID; //注意oracle重命名table 不能加as只需加空格即可,as可用于重命名列

结果:(注意结果中包含重复属性,重复的属性结果中重命名了)

eg2:

SELECT * FROM STUDENT JOIN TEACHER ON STUDENT.DEPTNO= TEACHER.DEPTNO;

2)自然连接(natural join)

自然连接是在广义笛卡尔积R×S中选出同名属性上符合相等条件元组,再进行投影,去掉重复的同名属性,组成新的关系。即自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。

 eg1:
SELECT STUDNET.CLASSID,TEACHER.DEPTNO FROM STUDENT  NATURAL JOIN TEACHER;

报错:(不能加限定条件)

SQL 错误: ORA-25155: NATURAL 联接中使用的列不能有限定词
25155. 00000 - "column used in NATURAL join cannot have qualifier"
*Cause: Columns that are used for a named-join (either a NATURAL join
or a join with a USING clause) cannot have an explicit qualifier.
*Action: Remove the qualifier.

eg2:

SELECT * FROM STUDENT  NATURAL JOIN TEACHER;

分析:两个表中有两个相同属性,TEACHERID和DEPTNO,不用加限定条件即按照这两个字段连接

结果:(注意deptno属性只有一个)

下面对比使用inner join的结果:(包含重复属性,并且连接方式区别于自然连接)

SELECT * FROM STUDENT JOIN TEACHER ON STUDENT.DEPTNO= TEACHER.DEPTNO;

3) 外连接 (outer join)

 外连接,返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接或左连接))、右表(右外连接或右连接)或两个边接表(全外连接)中的所有数据行。

 1.left join(左联接)等价于(left outer join)  返回包括左表中的所有记录和右表中联结字段相等的记录;

 2.right join(右联接)等价于(right outer join)返回包括右表中的所有记录和左表中联结字段相等的记录;

 3. full join (全连接)等价于(full outer join)查询结果等于左外连接和右外连接的和

eg1:

SELECT  S.*, T.* FROM STUDENT S LEFT JOIN TEACHER  T ON S.CLASSNO = T.CLASS;

输出结果:(包含student中的所有记录和满足条件的记录)

eg2:

SELECT  S.*, T.* FROM STUDENT S RIGHT JOIN TEACHER  T ON S.CLASSNO = T.CLASS;

结果:

eg3:
SELECT  S.*, T.* FROM STUDENT S FULL JOIN TEACHER  T ON S.CLASSNO = T.CLASS;
输出:(因为teacher中有的对应student中都有,所以结果和left join相同)
 
 
4) 交叉连接(cross join)

  交叉连接不带ON子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到 结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查 询条件的数据行数。

eg1:
SELECT  S.*, T.* FROM STUDENT S CROSS JOIN TEACHER  T ;

等价于:

SELECT  S.*, T.* FROM STUDENT S , TEACHER  T ;

输出结果:

5)自连接

连接的表是同一张表,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。

用途举例:计算公交链路换乘问题(见eg2)

eg1:

SELECT  S1.*, S2.* FROM STUDENT S1 , STUDENT S2 WHERE S1.DEPTNO=S2.DEPTNO AND S1.CLASSNO=S2.CLASSNO;

结果:

eg2:

table route(num, company, pos, stop)
SELECT * FROM route R1, route R2 WHERE R1.stop=R2.stop;

可查询公用同一公交车站的所有路线

3.总结

1)即使是在连接条件不满足的情况下,外部连接也会在结果集内返回行,而内部连接不会在结果集类返回行 当外部连接不满足连接条件时,通常返回一个表中的列,但是第二个表中没有返回值--为null

2)自然连接不包含重复的属性

3)交叉连接是两个表数据笛卡尔积(相当于不加连接条件)

oracle连接总结(内连接、外连接、自然连接,交叉连接,自连接)的更多相关文章

  1. 知识点:Oracle+表连接方式(内连接-外连接-自连接)+详解 来自百度文库

    Oracle 表之间的连接分为三种: 1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制)        (2)右外连接(右边的表不加限制)        (3)全外连接(左右 ...

  2. Oracle内链接+外连接详解

    inner join(内连接) 内连接也称为等同连接,返回的结果集是两个表中所有相匹配的数据,而舍弃不匹配的数据.也就是说,在这种查询中,DBMS只返回来自源表中的相关的行,即查询的结果表包含的两源表 ...

  3. SQL的几种连接:内连接、外连接(左连接、右连接、全连接)

    表结构见前面博客 1.内连接 1.1.等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列. 三种写法: select * from t ...

  4. oracle 内连接、外连接、自然连接、交叉连接练习

    oracle 内连接.外连接.自然连接.交叉连接练习 --查询员工信息 select * from emp; --查询部门信息 select * from dept; --需求:查询员工姓名.薪资和所 ...

  5. sql ,内连接,外连接,自然连接等各种连接

    1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和c ...

  6. sql 内连接、外连接、自然连接等各种连接

    1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和c ...

  7. mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化

    先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...

  8. MySQL (五)--连接查询简介、 交叉连接、 内连接、外连接、自然连接、温馨小提示

    1 连接查询简介 将多张表(可以大于2)进行记录的连接(按照某个指定的条件进行数据拼接). 最终结果:记录数可能会有变化,字段书一定会增加(至少两张表的合并). 连接查询:join,使用方式:左表 j ...

  9. oracle 内连接(inner join)、外连接(outer join)、全连接(full join)

    转自:https://premier9527.iteye.com/blog/1659689 建表语句: create table EMPLOYEE(EID NUMBER,DEPTID NUMBER,E ...

随机推荐

  1. Android Rom修改

    最近项目里要实现修改开机动画 屏蔽系统桌面等一些涉及到修改底层的功能 一开始研究了一番 心想着看来这是要定制系统 做rom开发了 所以就牛逼哄哄的跑去下源码 研究rom开发 后来发现这将是一个庞大的工 ...

  2. discuz, 使用同一数据库, 只是换个环境, 数据就不一样了

    如题, 本以为是由于某些冲突导致, 细查之后, 发现是开了缓存了, 把缓存关掉或是在后台清理缓存就OK了 后台清理缓存, 全局--性能优化--内存优化  清理缓存 关闭缓存, 修改全局配置文件, co ...

  3. ACM vim配置

    ACM现场赛时用的,比较简短,但是主要的功能都有了. 直接打开终端输入gedit ~/.vimrc 把下面的东西复制到里面就行了. filetype plugin indent on colo eve ...

  4. POJ 1985 Cow Marathon && POJ 1849 Two(树的直径)

    树的直径:树上的最长简单路径. 求解的方法是bfs或者dfs.先找任意一点,bfs或者dfs找出离他最远的那个点,那么这个点一定是该树直径的一个端点,记录下该端点,继续bfs或者dfs出来离他最远的一 ...

  5. noi 7221 拯救公主 (状态压缩+bfs)

    /* 这题实在调糊了 借鉴的题解的一些判断方法 位运算大法好 - - 因为要集齐所有的宝石所以状态压缩一下 f[i][j][s]将s化为二进制 每一0表示该宝石没有 1表示该宝石有 有:到(i,j)这 ...

  6. Filter过滤器实现同一地址手机和电脑页面不同

    最近做一个网站,客户要求在访问主域名的时候实现电脑访问时展示电脑页面,手机访问时展示h5的手机页面,这种需求的使用还是比较多的:尤其网站需要百度推广的时候,百度推广就要求同一域名下,手机访问时展示手机 ...

  7. jquery获取元素到页面顶部距离

    jquery获取元素到页面顶部距离的语句为: $(selector).offset().top

  8. Angular JS API

    ng function angular.bind angular.bootstrap angular.copy angular.element angular.equals angular.exten ...

  9. VB php JAVA关于数据库连接数过多的解决方法

    这里讲解一个关于数据库连接多多的解决办法 一般都会在方法中进行数据库的开,利用和关 不过如果在一个循环里面使用的时候 这样数据库的连接数就会过多,如果是1万次的话,数据库服务器可能就会当机 PHP 中 ...

  10. Python报错:SyntaxError: Non-ASCII character '\xe5' in file

    运行Python脚本总是报一下的错误: SyntaxError: Non-ASCII character '\xe5' in file 原因:Python默认是以ASCII作为编码方式的,如果在自己的 ...