SQL: Join-随笔

来源:互联网 发布:雪花秀淘宝官方旗舰店 编辑:程序博客网 时间:2024/05/22 10:36

实际应用中最常见join的类型大致有:
1. Inner Join(内联结)
2. Outer Join(外联结)
   2.1 Full (全外联结)
   2.2 Left (左外联结)
   2.3 Right (右外联结)
3. Cross Join (交叉联结)
4. Self Join(自联结)
其中4实际上是一种特殊的Inner Join.
理论上,把Join抽象成模型后可以归纳为Natural和Theta Join,
大体上就是等值联结和非等值联结,然后一些讲理论的书上有
详细论述,偶就不啰嗦了.想说也没办法,一直在理论上也有点迷糊

因为大多数数据库,默认的join操作是inner join,所以在书写
inner join的时候可以省略关键词 inner join.而在书写外联结的时候
关键词是绝对不可以省略的.
因此,下面两句是等效的
(1)select ...
from table_a
inner join table_b on ...
(2)select ...
from table_a, table_b where...
甚至有些数据库可以这样写
(3) select
from table_a join table_b on...

需要注意的是
(i)一旦使用了inner,就必须同时写 join
(ii)一旦使用了join, 就必须带有on子句,否则就成了cross join.
    很多时候因为遗漏所导致的后者可能造成效率及其低下.

btw: cross join在数据库里面通常都是和expensive的字眼一起
       用的,而且缺乏business value,所以除非特殊场合一般很少用

说到这里,就顺?
因为大多数数据库,默认的join操作是inner join,所以在书写
inner join的时候可以省略关键词 inner join.而在书写外联结的时候
关键词是绝对不可以省略的.
因此,下面两句是等效的
(1)select ...
from table_a
inner join table_b on ...
(2)select ...
from table_a, table_b where...
甚至有些数据库可以这样写
(3) select
from table_a join table_b on...

需要注意的是
(i)一旦使用了inner,就必须同时写 join
(ii)一旦使用了join, 就必须带有on子句,否则就成了cross join.
    很多时候因为遗漏所导致的后者可能造成效率及其低下.

btw: cross join在数据库里面通常都是和expensive的字眼一起
       用的,而且缺乏business value,所以除非特殊场合一般很少用

说到这里,就顺便交代一下cross语法吧,很简单,把inner关键词
换成cross即可.这时候on的关联条件就被无视(也不能出现). 下面两句等同
(4)select ...
from table_a cross join table_b ...
(5)select ...
from table_a, table_b ...

在inner join中的where条件等效于on子句,这主要是兼容历史标准所
导致的. ANSI-89也就是sql 89标准中,并没有强行要求数据库要实现join命令,
所以那时候实现的join就是通过A,B where A.a=B.b的方式实现的.
这一代标准的Join也被称为"Where version",也就是通用到现在的
简单书写方式. 到了ANSI-92标准的时候,则要求支持Join操作,并规范
了标准格式,这就是上面例子中的语法了. 基本上所有流行的数据库
都完全支持以上标准,所以哪种代码格式都没有问题的.


嗯....想到这么多,随便说说,有些乱.有什么不对成了cross join.
    很多时候因为遗漏所导致的后者可能造成效率及其低下.

btw: cross join在数据库里面通常都是和expensive的字眼一起
       用的,而且缺乏business value,所以除非特殊场合一般很少用

说到这里,就顺便交代一下cross语法吧,很简单,把inner关键词
换成cross即可.这时候on的关联条件就被无视(也不能出现). 下面两句等同
(4)select ...
from table_a cross join table_b ...
(5)select ...
from table_a, table_b ...

在inner join中的where条件等效于on子句,这主要是兼容历史标准所
导致的. ANSI-89也就是sql 89标准中,并没有强行要求数据库要实现join命令,
所以那时候实现的join就是通过A,B where A.a=B.b的方式实现的.
这一代标准的Join也被称为"Where version",也就是通用到现在的
简单书写方式. 到了ANSI-92标准的时候,则要求支持Join操作,并规范
了标准格式,这就是上面例子中的语法了. 基本上所有流行的数据库
都完全支持以上标准,所以哪种代码格式都没有问题的.