1、概述
连接是(JOIN) 是根据两个或者多个表之间的列建立关系, 获取所需要的数据,在Oracle数据库中,提供了自连接也称内连接(inner join或者join),自然连接(natural join),左连接(left join或者left outer join ),右连接(right join或者 right outer join),全连接(full join或者 full outer join)以及笛卡尔积(cross join)
基本语法:select table1.column,table2.column from table1 [inner | left | right | full ] join table2 on table1.column1 = table2.column2;
为了更好的再后面阐述:我们首先建立了stu以及class两张表如下:
STU表如下:
create table stu( stu_id varchar2( 10), name varchar2(10 ), class_id varchar( 10) );
STU表中数据为:
CLASS创建如下:
create table class( class_id varchar2( 10), class_name varchar2( 10) );
数据有:
2、Oracle连接
2.1、内连接(inner jion)
Oracle 的join连接默认就是inner join,所以在写内连接时可以把inner省略, 这种连接返回的是两表交集的部分,即如果表中至少有一行匹配则但会行。可以用下面蓝色部分表示:
我们用实例来说明什么是内连接,我们可以在表stu和表class 通过class_id建立连接如下,下面三种方式是等价的:
select s.stu_id,s.name,s.class_id,c.class_name from stu s, class c where s.class_id =c.class_id order by stu_id ; select s.stu_id,s.name,s.class_id,c.class_name from stu s join class c on s.class_id =c.class_id order by stu_id ; select s.stu_id,s.name,s.class_id,c.class_name from stu s inner join class c on s.class_id =c.class_id order by stu_id ;
我们可以看到结果返回的是两表中class_id相同的那些记录:
用inner jion中我们是根据两表中的class_id字段来匹配,还有一种连接可以根据量表自动去匹配相同的字段,并返回数据行,这种连接称作 自然连接(natural join),我们可以把它看成是内连接的一种,用法如下:
select stu_id,name ,class_id,c.class_name from stu s natural join class c
自然连接需要注意一下亮点:
1、如果自然连接的多个字段的名称和类型都匹配,那么他们都会作为自然连接的连接条件;
2、若自然连接的连个表仅字段相同,但是类型不同将会返回一个错误。
2.2、外连接
在Oracle中外连接主要有 左外连接、右外连接以及全连接三种
2.2.1、左外连接(left join或者left outer join)
左外连接:返回的记录行数与左表相同,即使右表中没有匹配行,也从左表中返回所有行;如下图所示:
在oracle中,我们可以建立左连接如下,以下这三种方式建立的左连接时等价的:
select s.stu_id,s.name,s.class_id,c.class_name from stu s left join class c on s.class_id =c.class_id order by stu_id ; select s.stu_id,s.name,s.class_id,c.class_name from stu s left outer join class c on s.class_id =c.class_id order by stu_id ; select s.stu_id,s.name,s.class_id,c.class_name from stu s ,class c where s.class_id =c.class_id(+) order by stu_id;
返回记录行如下,从返回结果中可以看出左连接返回了stu的所有行,如class表中无数据的字段则为null
说明:
1、使用(+)建立左连接时,只能在where 条件中使用,且(+)要放在右表后
2、当使用(+)建立左连接时,如果where 有多个条件那么所有的条件都要加上(+)
3、(+)只使用列,不适合用在表达式上
4、(+)不能和in、not in 以及 or 操作符一起使用
5、(+)只适用左连接和右连接,不能实现全连接, 但是可以通过 左连接 UNION 右连接实现。
2.2.2、右连接(right join或者right outer join)
右连接会返回右表中的所有行,即使左表中没有匹配行,也返回右表的所有行,如下图所示:
类似左连接,在oracle中实现右连接有一下几种方式,它们亦是等价的:
select s.stu_id,s.name,s.class_id,c.class_name from stu s right join class c on s.class_id =c.class_id order by stu_id ; select s.stu_id,s.name,s.class_id,c.class_name from stu s right outer join class c on s.class_id =c.class_id order by stu_id ; select s.stu_id,s.name,s.class_id,c.class_name from stu s , class c where s.class_id(+) =c.class_id order by stu_id ;
返回的记录行是如下,返回结果中可以看出左连接返回了class的所有行,如stu表中无数据的字段则为null
说明:当用(+)表示右连接时,说明基本和左连接一样,只是(+)需要用在左表的字段上。
2.2.3、全连接(full join 或者full outer join)
全连接:返回的是两表的全集,无论匹配不匹配都返回行,如下图所示:
在oracle实现全连接的方式如下,下面这两种方式是等价的:
select s.stu_id,s.name,s.class_id,c.class_name from stu s full join class c on s.class_id =c.class_id order by stu_id ; select s.stu_id,s.name,s.class_id,c.class_name from stu s full outer join class c on s.class_id =c.class_id order by stu_id ;
返回的记录行如下,两表中没匹配且在其中一张表无数据,返回null
说明:全连接不能用(+)表示,但是可以用左连接 UNION 右连接表示,注意:使用的不是UNION ALL(请参考UNION 与UNION的区别)
select s.stu_id,s.name,s.class_id,c.class_name from stu s , class c where s.class_id =c.class_id(+) union select s.stu_id,s.name,s.class_id,c.class_name from stu s , class c where s.class_id(+) =c.class_id order by stu_id ;
2.3、笛卡尔积(cross join)
笛卡尔积 :返回的是两表的乘积,返回的行数为两表各自行数的乘积,使用方法如下:
select s.stu_id,s.name,s.class_id,c.class_name from stu s cross join class c
可以得到返回的记录为:
补充:
还有一种oracle并没有关键字的连接,用使用等值以外的条件作为连接条件,可以表示如下:
select stu_id,name ,c.class_name from stu s , class c where s.class_id !=c.class_id
3、总结
可以把以上各个连接用一张图表示(这张图是引用别人的博客,具体博客地址没找到,对原作者十分抱歉)
把之前的sql也整理如下:
--jion inner join select s.stu_id,s.name,s.class_id,c.class_name from stu s,class c where s.class_id =c.class_id order by stu_id ; select s.stu_id,s.name,s.class_id,c.class_name from stu s join class c on s.class_id =c.class_id order by stu_id ; select s.stu_id,s.name,s.class_id,c.class_name from stu s inner join class c on s.class_id =c.class_id order by stu_id ; -- left jion select s.stu_id,s.name,s.class_id,c.class_name from stu s left join class c on s.class_id =c.class_id order by stu_id ; select s.stu_id,s.name,s.class_id,c.class_name from stu s left outer join class c on s.class_id =c.class_id order by stu_id ; select s.stu_id,s.name,s.class_id,c.class_name from stu s ,class c where s.class_id =c.class_id(+) order by stu_id ; --right jion select s.stu_id,s.name,s.class_id,c.class_name from stu s right join class c on s.class_id =c.class_id order by stu_id ; select s.stu_id,s.name,s.class_id,c.class_name from stu s right outer join class c on s.class_id =c.class_id order by stu_id ; select s.stu_id,s.name,s.class_id,c.class_name from stu s , class c where s.class_id(+) =c.class_id order by stu_id ; --full jion select s.stu_id,s.name,s.class_id,c.class_name from stu s full join class c on s.class_id =c.class_id order by stu_id ; select s.stu_id,s.name,s.class_id,c.class_name from stu s full outer join class c on s.class_id =c.class_id order by stu_id ; select s.stu_id,s.name,s.class_id,c.class_name from stu s , class c where s.class_id =c.class_id(+) union select s.stu_id,s.name,s.class_id,c.class_name from stu s , class c where s.class_id(+) =c.class_id order by stu_id ; --cross jion select s.stu_id,s.name,s.class_id,c.class_name from stu s cross join class c --natural join select stu_id,name ,class_id,c.class_name from stu s natural join class c --补 select stu_id,name ,c.class_name from stu s , class c where s.class_id !=c.class_id
相关推荐
在Oracle SQL中,Join主要分为几个类型,包括INNER JOIN、LEFT JOIN (LEFT OUTER JOIN)、RIGHT JOIN (RIGHT OUTER JOIN)以及FULL JOIN (FULL OUTER JOIN)。这些类型在Java编程中同样可以使用,通过SQL查询语句来实现...
3. **右连接(RIGHT JOIN)**:与左连接相反,返回右表的所有记录,即使左表中没有匹配的记录。 4. **全外连接(FULL OUTER JOIN)**:返回所有左表和右表的记录,如果任何一方没有匹配,则另一方的值为NULL。 5. ...
外连接分为三种类型:左外连接(Left Outer Join)、右外连接(Right Outer Join)和全外连接(Full Outer Join)。本篇文章将深入探讨这三种外连接的概念、语法以及它们在实际应用中的作用。 1. 左外连接(Left ...
Oracle SQL是数据库管理中不可或缺的一部分...在后续的篇章中,预计会涵盖更复杂的查询技巧,如子查询、连接类型(INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN)以及窗口函数等,这些都是提升数据库操作效率的关键。
### left join 过滤条件写在on后面和写在where 后面的区别 在SQL查询语句中,连接(JOIN)是一种非常重要的操作,用于从两个或多个表中获取数据。其中,`LEFT JOIN`是一种常用的连接类型,它返回左表的所有记录以及...
右连接(Right Outer Join) 右连接与左连接类似,但它返回右表中的所有记录,并将左表中的记录匹配到右表中。如果左表中没有匹配的记录,将以 null 值代替。 内连接(Inner Join) 内连接返回两个表中公共的记录...
- INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN:不同类型的连接操作,用于合并两个或更多表的数据。 9. 视图: - 创建视图:用SELECT语句定义一个虚拟表,方便数据的查询和访问。 - 更新视图:在某些情况下,...
连接可以分为三类:对等连接(EQUIJOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)和全连接(FULL JOIN)。 * 对等连接:只显示连接的表中存在而且相等的记录。传统的写法也是一种对等连接。 * 左连接:将进行...
本文将详细介绍Oracle中常见的几种表连接方式及其应用场景,包括内连接(Inner Join)、外连接(Outer Join)、左连接(Left Join)、右连接(Right Join)等,并通过具体的例子来帮助理解每种连接的特点与区别。...
接下来,我们讨论OUTER JOIN,它分为LEFT JOIN、RIGHT JOIN和FULL JOIN。OUTER JOIN的目的是返回所有匹配的行以及至少一方表中的非匹配行。 - LEFT JOIN(或LEFT OUTER JOIN)返回左表中的所有行,即使右表中没有...
3. **连接类型**:不同的连接类型(如INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN)对性能有显著影响。理解每个连接类型的工作原理并根据需求选择合适的连接方式是关键。 4. **子查询与连接的比较**:在某些情况...
7. 条件与连接:WHERE子句用于筛选数据,JOIN操作用于合并多个表的数据,如INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN。 8. 分组与聚合函数:GROUP BY和HAVING子句用于数据分组,COUNT、SUM、AVG、MAX和...
外连接分为左外连接(Left Outer Join)、右外连接(Right Outer Join)和全外连接(Full Outer Join)。与内连接不同,外连接会包括不满足连接条件的一侧或两侧表中的所有行。 #### 示例代码解析: ```sql SELECT...
- `(+)` 符号在Oracle的旧版本中被用来表示外连接,但在9i及以后的版本中,更推荐使用标准的 `LEFT JOIN`、`RIGHT JOIN` 或 `FULL JOIN` 语法,因为它们更清晰且易于理解。 理解并熟练运用这些连接类型对于处理复杂...
根据连接的方式不同,可以分为内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)以及全连接(FULL JOIN)等几种类型。 #### 二、连接查询类型详解 ##### 1. INNER JOIN (内连接) 内连接是最常用...
外连接包括左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN),它们不仅包含相等连接的结果,还会包含那些在连接列上不匹配的记录。 - 左外连接:显示所有左表(`EMP`)的...
例如,通过左连接和右连接的组合,可以实现全连接(Full Join),获取两个表的所有记录。同时,还可以结合使用WHERE子句和聚合函数(如COUNT, SUM, AVG等)来过滤和统计数据。 了解并熟练掌握这些连接方式,对于...