新浪博客

SQL联合查询

2013-10-04 23:25阅读:

联合查询是根据每个表之间的逻辑关系从两个或多个表中检索数据,而这逻辑关系则是每个表之间共同的列的关联性,这也是关系数据库查询的最主要的特征.

联合查询分为内连接,外连接和自连接查询. 外连接又可分为左外连接left outer join 、右外连接right outer join 、全外连接full outer join 查询.
联合查询效率较高,以下例子来说明内联、左联、右联、全联的区别:

内连接(inner join):仅显示两个表中匹配行,即两表中都有才显示

SQL语句:select * from T1 inner join T2 on T1.UserId=T2.UserId
运行结果
T1.UserId
Name
Password
T2.UserId
SID

Grade

1
dong
pdong
1
001
2


左外连接(left outer join)左表有就显示,不论右表。

SQL语句:select * from T1 left outer join T2 on T1.UserId=T2.UserId
运行结果
T1.UserId
Name
Password
T2.UserId
SID
Grade

1
dong
pdong
1
001
2

2
hai
phai
NULL
NULL
NULL


右外连接(right outer join)右表有就显示,不论左表。

SQL语句:select * from T1 right outer join T2 on T1.UserId=T2.UserId
运行结果
T1.UserId
Name
Password
T2.UserId
SID
Grade

1
dong
pdong
1
001
2

NULL
NULL
NULL
3
002
3


全外连接(full outer join)左表/右表,有一个有就显示。

SQL语句:select * from T1 full outer join T2 on T1.UserId=T2.UserId
运行结果
T1.UserId
username
password
T2.UserId
SID
Grade

1
dong
pdong
1
001
2

2
hai
phai
NULL
NULL
NULL

NULL
NULL
NULL
3
002
3


总结,关于联合查询,效率的确比较高.但是这也是有前提条件的,效率比较高也是相对的,适用于两个表联合查询,或者多表小数据量的查询.看下边的例子.


假设我们有三个表,A表,B表,C表.其数据量分别都为200条记录.并且假设每次都是遍历一半也就是100条的记录找到结果(一半情况下有较大的浮动,只是举例说明),并且假设每次查询都查出10个结果.

一般我们的查询语句是这样的:
select * from A,B,C where A.id=B.id and B.id=C.id
查询量为100*100*100=100万.也就是从100万条数据中检索10条数据.
优化,使用联合查询的前提条件,两个表的联合就没这问题,将三个表的联合查询拆分成两个两个的表的联合查询,能大量减少了遍历的次数.
方式1: 将三表联合分成两个2表联合查询,如:先进行AB联合查询,再将结果与C联合. 这样查询遍历次数为:100*100+10*100 =1.1万.(只是检索10条数据)
SQL为:select * from (select * from A , B where A.id = B.id) as ab, C where ab.id=C.id
方式2:先对各表进行过滤,再进行三表联合,或者2表联合: 这样查询的遍历次数为:100+100+100+10*10*10=1300.,或者:100+100+100+10*10+10*10=500.
SQL为:
select * from (select * from a where ...)as a,(select * from b where ....) as b, (select * from c where ....) as c where a.id=b.aid and b.id=c.bid
或者:
select * from (select * from (select * from a where ...)as a ,(select * from b where ....) as b where a.id = b.aid) as ab, (select * from c where ....) as c where ab.id=c.bid

我的更多文章

下载客户端阅读体验更佳

APP专享