数据库——SQL中的join连接

来源:互联网 发布:爱迪生电弧打火机 淘宝 编辑:程序博客网 时间:2024/06/06 07:05

SQL中join的不同类型:

  • INNER JOIN:仅返回匹配的行
  • LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
  • FULL JOIN:左右外连接结果的并集

分类:
内连接:包括等值连接和自然连接,使用=,<>之类的比较运算符

等值连接:必须要有等值的条件,列的属性可以不同,条件不同时连接结果也不同;自然连接:必须要有相同的列属性。例如:  M:A   B                     N:B  C     1   2                       2  1     3   3                       7  2     5   9                       3  5等值连接(M.A=N.C)          A   M.B  N.B   C          1    2    2    1          5    9    3    5等值连接(M.B=N.B)         A   M.B   N.B    C         1    2     2     1         3    3     3     5自然连接         A   B   C         1   2   1         3   3   5

外连接:包括左外连接,右外连接和完整外连接
交叉连接(cross join):又称笛卡尔积,返回左表中的所有行,左表中每行与右表中的所有行组合,即缺少连接谓词或连接谓词总为真的内连接。

--交叉连接用于对两个源表进行纯关系代数的乘运算。它不使用连接条件来限制结果集合,而是将分别来自两个数据源中的行以所有可能的方式进行组合。数据集合中一的每个行都要与数据集合二中的每一个行分别组成一个新的行。   大多数交叉连接都是由于错误操作而造成的;但是它们却非常适合向数据库中填充例子数据,或者预先创建一些空行以便为程序执行期间所要填充的数据保留空间。--若表A3条记录,表B6条记录,则笛卡尔连接后会得到3*6=18条结果  注:在交叉连接中没有on条件子句

INNER JOIN

仅取出匹配的数据

select * from a inner join b on a.aid = b.bid注:innerinner join等价,则inner可省略,a.aid和b.bid字段无需名称相同,但必须数据类型相同

LEFT JOIN

首先取出a表中所有数据,然后再加上与a,b匹配的的数据,b没有的为null

select * from a left join b on a.aid = b.bid 注:left outer joinleft join等价,左连接属于外连接默认是outer属性,outer是相对于inner而言的,所以可以省略

RIGHT JOIN

首先取出b表中所有数据,然后再加上与a,b匹配的的数据 ,a没有的为null

select * from a right join b on a.aid = b.bid 

FULL JOIN

首先取出a表和b表中所有数据,然后再加上a与b中没有匹配上的数据,空缺的值为null


其他相关:
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用left jion时,on和where条件的区别如下:
1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

————————待求证
外关联是Oracle数据库的专有语句
一般说来,外关联的等值条件等效于Left Outer Join中的on语句;两个where中其他语句是一样的。
但是Left Outer Join中的其他条件(非表连接)出现在On关键词后面还是出现在Where关键词后面是不一样的,这样的语句很难用外关联进行同义转义。

阅读全文
0 0
原创粉丝点击