SQL各种连接

通过连接可以建立多表查询,多表查询的数据可以来自多个表,但是表之间必须有适当的连接条件。为了从多张表中查询,必须识别连接多张表的公共列。一般是在WHERE子句中用比较运算符指明连接的条件。
                
两个表连接有四种连接方式:

* 相等连接

* 不等连接(看作单表查询)

* 外连接

* 自连接(自关联)

1.相等连接
通过两个表具有相同意义的列,可以建立相等连接条件。使用相等连接进行两个表的查询时,只有连接列上在两个表中都出现且值相等的行才会出现在查询结果中     

显示雇员名称和所在部门的编号和名称。

执行以下查询:

SELECT a.ename, b.id, b.dname

FROM employee a,dept b  

WHERE a.id=b.id
说明:相等连接语句的格式要求是,在FROM从句中依次列出两个表的名称,在表的每个列前需要添加表名,用“.”分隔,表示列属于不同的表。在WHERE条件中要指明进行相等连接的列。
以上训练中,不在两个表中同时出现的列,前面的表名前缀可以省略。所以以上例子可以简化为如下的表示:
SELECT ename, b.id, dname
FROM employee a,dept b  
WHERE a.id=b.id
   
2
.外连接
在以上的例子中,相等连接有一个问题:如果某个雇员的部门还没有填写,即保留为空,那么该雇员在查询中就不会出现;或者某个部门还没有雇员,该部门在查询中也不会出现。
为了解决这个问题可以用外连,即除了显示满足相等连接条件的记录外,还显示那些不满足连接条件的行,不满足连接条件的行将显示在最后。外连操作符为(+),它可以出现在相等连接条件的左侧或右侧。出现在左侧或右侧的含义不同,这里用如下的例子予以说明。
     
使用外连显示不满足相等条件的记录。
显示雇员名称和所在部门的编号和名称。
执行以下查询:

左连接方法一(推荐使用,简洁)
SELECT ename, b.id, dname
FROM employee a,dept b  
WHERE a.id(+)=b.id

左连接方法二:
SELECT ename, b.id, dname
FROM dept b
LEFT JOIN employee a ON a.id=b.id
注意:不管dept是否存在,employee都会显示
   
3
、自连接(一般用在树形权限结构中)
自连接就是一个表,同本身进行连接。对于自连接可以想像存在两个相同的表(表和表的副本),可以通过不同的别名区别两个相同的表。
SELECT worker.ename||'
的经理是'||manager.ename AS 雇员经理  
FROM employee worker, employee manager 
WHERE worker.mgr = manager.empno;
       
------------
执行结果为:
1.SMITH
的经理是FORD 
2.ALLEN
的经理是BLAKE 
3.WARD
的经理是BLAKE 

  

注:在操作多表联合查询时,若出现以下情况,将形成笛卡尔积
联接条件被省略
联接条件无效
第一个表中的所有行被联接到第二个表中的所有行上
为了避免笛卡尔积,请始终包括有效的联接条件

    
何为笛卡尔积?
笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值