`
deepfuture
  • 浏览: 4340869 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:79516
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:68575
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:101715
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:281660
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:14651
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:65835
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:31404
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45311
社区版块
存档分类
最新评论

解析数据库查询中的外连接

阅读更多

解析数据库查询中的外连接

在信息管理系统的开发中,外连接通常用来完成一些复杂特殊的多表查询,虽不常用,但其作用举足轻重。

什么是外连接呢?简而言之,外连接是指它返回查询结果集合中,不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行,共分为左外连接、右外连接、全外连接三种方式,实际开发中使用较多的是左外连接和右外连接,笔者以一实例来解析这两种外连接。

假设某数据库中有两个数据表,表一是客户表costomer,表二是订单表order,表结构及记录如下:

customer表结构:

cno:客户编号

name:客户名称

address:客户地址

age:客户年龄

 

customer表内容:

cnonameaddressage

1张三长沙25

2李四北京21

3王五上海36

 

order表结构:

cno:客户编号

ono:订单号

goods:所订货物

 

order表内容:

cnoonogoods

1101牙刷

3301电风扇

我们现在需要查询输出一个客户列表,如果该客户有订单表中,要求包含订单资料。这个查询能使用内连接吗?我们试试:

select customer.*,order.one,order.goods fromcustomer,order where customer.cno=order.cno

输出结果为:

cnonameaddressage onogoods

1张三长沙25101牙刷

3王五上海36301电风扇

很显然,这不是我们所要的结果,由于内连接返回查询结果集合中的仅是符合查询条件和连接条件的行,在order表中找不到对应李四这个客户编号的任何订单记录,不满足连接条件,因此李四没有出现在查询结果中。必须使用左外连接才能得到预期结果。

custmoer为左表,以order表为右表,左外连接的特点是保证左表的满足查询条件的所有记录无论是否符合连接条件,都会出现在查询结果中,那些不满足条件的左表记录的右表相应字段将输出为空值。

下面是完成这个查询功能的左连接SQL语句。实际开发中,OracleSqlServer主流数据库管理系统使用较多,因此对本文所有的外连接操作,笔者分别列出了这两种数据库的SQL语句。

Oracle(Oracle的风格与众不同,可理解为左连接中符号+所在边的表就是右表)

select customer.*,order.one,order.goods fromcustomer,order where customer.cno=order.cno(+)

Sql Server(accessSqlServer相同)

select customer.*,order.one,order.goods from customer leftjoin order on customer.cno=order.cno

运行一下,查询结果如下:

cnonameaddressage onogoods

1张三长沙25101牙刷

2李四北京21

3王五上海36301电风扇

完全符合要求,上述例子,如果以custmoer为左表,以order表为右表,进行右外连接查询,完成的功能是查询所有订了货的客户名单。

Oracle(Oracle的风格与众不同,可理解为右连接中符号+所在边的表就是左表)

select customer.*,order.one,order.goods fromcustomer,order where customer.cno(+)=order.cno

Sql Server(accessSqlServer相同)

select customer.*,order.one,order.goods from customerright join order on customer.cno=order.cno

运行后查询结果与使用内连接结果居然一致辞,细想一下,对于右连接而言,右表order中的所有满足查询条件的记录都会在输出结果中,order表中没有不符合连接条件的记录,因此与内连接一样。

外连接虽方便实用,但消耗的资源非常之多,因为它们包含与 NULL(不存在)数据匹配的数据,只能在不可避免的情况下使用它,被过度使用,代价可能非常高。避免使用外连接最简单方法是尽可能多地围绕它们设计数据库,避免数据库的人为设计造成外连接语句的过多使用。

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics