SQL中的Join操作

        在关系代数中,连接运算是由一个笛卡尔积运算和一个选取运算构成的。首先用笛卡尔积完成对两个数据集合的乘运算,然后对生成的结果集合进行选取运算,确保只把分别来自两个数据集合并且具有重叠部分的行合并在一起。连接的全部意义在于在水平方向上合并两个数据集合(通常是表),并产生一个新的结果集合,其方法是将一个数据源中的行于另一个数据源中和它匹配的行组合成一个新元组。SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。

Join操作定义

     不同的SQL JOIN操作如下表所示:

连接类型

定义

 

Inner Join

内连接是最常见的一种连接,它也被称为普通连接,只连接匹配的行(仅对满足连接条件的CROSS中的列)。它又分为等值连接(连接条件运算符为"=")和不等值连接(连接条件运算符不为"=",例如between...and)。

 

Outer Join

Full Outer Join

FULL JOIN 会从左表 和右表 那里返回所有的行。如果其中一个表的数据行在另一个表中没有匹配的行,那么对面的数据用NULL代替

Left Outer Join

LEFT JOIN返回左表的全部行和右表满足ON条件的行,如果左表的行在右表中没有匹配,那么这一行右表中对应数据用NULL代替。

Right Outer Join

RIGHT JOIN返回右表的全部行和左表满足ON条件的行,如果右表的行在左表中没有匹配,那么这一行左表中对应数据用NULL代替。

 Cross Join

CROSS对两个表执行笛卡尔乘积。它为左表行和右表行的每种可能的组合返回一行。返回(左表行数*右表行数)行的表。

 

 

Appendix      

Natural Join

自然连接是一种特殊的等值连接,在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。

自连接

某个表和其自身连接,常用在同一表内不同数据间对同一列的比较


Join操作实例

     自连接

      自连接常用在同一表内不同数据间对同一列的比较,例如下面的SQL语句:
select 
 a.emp_no,
 a.emp_name,
 a.date_hired,
 b.emp_no,
 b.emp_name,
 b.date_hired 
from
 employee a join employee b 
on a.emp_no!=b.emp_no 
and a.date_hired=b.date_hired    
order by a.date_hired 
      这样操作会产生重复的数据,只需要加上一句a.emp_name > b.emp_name 就可以达到去重的目的。   

       UNION操作

       UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型,同时,每条 SELECT 语句中的列的顺序必须相同。例如下面的SQL语句:
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
       注释:默认地,UNION 操作符选取不同的值,结果中不存在重复的数据列。如果允许重复的值,请使用 UNION ALL。UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值,包括重复的数据。
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
     另外,UNION和UNION ALL结果集的列名总是等于UNION中第一个SELECT语句中的列名。

     JOIN实践

      经常在面试中碰到一个问题是:在SELECT语句里面要把两张表连接起来,一张表数据量庞大,一张表数据量很小,那应该把哪张表放在前面。join操作第一步是执行连接操作,执行的是两个表的笛卡尔积,接着进行on操作筛选,最后是join类型进行外部添加的行为。前两步所有的join都是完全一样的,第三步有一些差异。所以如果是 inner join的话,顺序是无所谓的,left join的话需要把小表放在前面,right join把大表放在前面。

猜你喜欢

转载自blog.csdn.net/xzx4959/article/details/79175975