Chinaunix首页 | 论坛 | 博客
  • 博客访问: 560134
  • 博文数量: 155
  • 博客积分: 4015
  • 博客等级: 上校
  • 技术积分: 1625
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-18 16:55
文章分类

全部博文(155)

文章存档

2009年(20)

2008年(39)

2007年(66)

2006年(29)

2005年(1)

我的朋友

分类: Oracle

2008-10-10 11:10:13

   表的连接查询在做报表分析的时候时常会用到,而且本身连接查询要实现的【现实抽象】也很明了,在两个(或多个)表中相互参考(Reference),找出对自己有用的信息。
 
   因为SQL语言是DSL(Domain-Specific Language)所以,要实现这个功能也很直观,本文试图用极其简单的方式向你描述表的连接查询,及其连接查询想要实现的【现实抽象】。
 
【可以将ID看作员工的工号,a表看作个人信息表,b表是工作分配表。】

select * from a;
ID         NAME     
---------- ----------
2006  Anco
2007  Jerry
2008  Zero

select * from b;
ID         DEPT     
---------- ----------
2006  MIS
2007  MES
2009  DEV
 

select * from a [inner Join] b    [(内)连接,笛卡尔积]
select * from a [inner join] b on a.name =‘Anco’ [等值连接,笛卡尔积后选取满足特定条件的列]
 
 
select * from a,b where a.id=b.id;            [自然连接,公共属性相等,公共属性只取一份(特殊等值连接)]
ID         NAME       ID_1       DEPT     
---------- ---------- ---------- ----------
2006  Anco   2006  MIS
2007  Jerry  2007  MES
 
 
select * from a left join b on a.id=b.id;     [左外连接,左表为基表]
ID     NAME     ID_1    DEPT     
----   -----    -----   ----------
2006   Anco     2006  MIS
2007   Jerry  2007  MES
2008   Zero   [NULL]  [NULL]    
 
 
select * from a right join b on a.id=b.id;    [右外连接,右表为基表]
ID         NAME       ID_1       DEPT     
---------- ---------- ---------- ----------
2006  Anco   2006  MIS
2007  Jerry  2007  MES
[NULL]  [NULL]  2009  DEV
 
 
select * from a full join b on a.id=b.id;     [保留左,右表的异同部分]
ID         NAME       ID_1       DEPT     
---------- ---------- ---------- ----------
2006  Anco   2006  MIS
2007  Jerry  2007  MES
2008  Zero   [NULL]  [NULL]          
[NULL]  [NULL]  2009  DEV
 

 
 

 
 
 
 
Jerry.Chou
   10/10'08
阅读(821) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~