个人学习知识分享


各种JOIN的含义

一、各种JOIN的含义
cross join:交叉连接(笛卡尔乘积)
inner join:对等连接
left  join:左连接
right  join:右连接
full  join:全连接

语法:select .. from 表a [连接] join 表b on 表a=表b

说明:
首先都是基于cross join(笛卡尔乘积)。
然后是inner join,在笛卡尔乘积的结果集中去掉不符合连接条件的行。
left outer join 是在inner join的结果集上加上左表中没被选上的行,行的右表部分每个字段都用NUll填充。
right outer join 是在inner join的结果集上加上右表中没被选上的行,行的左表部分全用NULL填充。outer的意思就是"没有关联上的行"。

二、注意:连接有两种写法:
旧式写法:
Select * from A a, B b where a.categoryID = b.categoryID;
标准写法:
Select * from A a inner join B b on a.categoryID = b.categoryID;

----------------------------------实例-------------------------------------------
SQL> create table a(
  2  id char(3),
  3  name char(5)
  4  );
Table created
SQL> create table b(
  2  id char(3),
  3  grade char(5)
  4  );
Table created

SQL> insert into a(id,name) values(1,'a');
SQL> insert into a(id,name) values(2,'b');
SQL> insert into b(id,grade) values(1,'30');
SQL> insert into b(id,grade) values(3,'50');
SQL> commit;
SQL> select * from a;
ID  NAME
--- -----
1   a
2   b
SQL> select * from b;
ID  GRADE
--- -----
1   30
3   50
演示:对等连接(两种方法)
SQL> select a.*,b.* from a,b where a.id=b.id;
ID  NAME  ID  GRADE
--- ----- --- -----
1   a     1   30
SQL> select a.*,b.* from a inner join b on a.id=b.id;
ID  NAME  ID  GRADE
--- ----- --- -----
1   a     1   30

演示:要全部显示a表内容(2也要显示)
SQL> select a.*,b.* from a,b where a.id=b.id(+);
ID  NAME  ID  GRADE
--- ----- --- -----
1   a     1   30
2   b        
SQL> select a.*,b.* from a left join b on a.id=b.id(+);
ID  NAME  ID  GRADE
--- ----- --- -----
1   a     1   30
2   b        
演示:要全部显示b表内容(3也要显示)
SQL> select a.*,b.* from a,b where a.id(+)=b.id;
ID  NAME  ID  GRADE
--- ----- --- -----
1   a     1   30
          3   50
SQL> select a.*,b.* from a right join b on a.id=b.id;
ID  NAME  ID  GRADE
--- ----- --- -----
1   a     1   30
          3   50
演示:要同时显示a和b表
SQL> select a.*,b.* from a,b where a.id=b.id(+)
  2  union
  3  select a.*,b.* from a,b where a.id(+)=b.id
  4  ;
ID  NAME  ID  GRADE
--- ----- --- -----
1   a     1   30
2   b        
          3   50
演示:要同时显示a和b表的所有内容(能匹配的,以及两个表中不能匹配的
SQL> select a.*,b.* from a full join b on a.id=b.id;
ID  NAME  ID  GRADE
--- ----- --- -----
1   a     1   30
2   b        
          3   50
说明1:Oracle8i版本不支持left,right,full等命令
说明2:mysql5,只支持left join、right join不支持full join命令