浅谈SQL中的几种连接

来源:互联网 发布:家里wifi网络拒绝接入 编辑:程序博客网 时间:2024/06/14 19:10

在网上找了些资料,结合本地测试,使用SQL Server 2005调试,整理一下SQL中的各种联接。

SQL 连接分为左连接右连接全连接内连接交叉连接

一、先用两张表来分析
person
id name dpid
1  xun   1
2  xun2  2
3  xun3  1

department
id  name
1   开发部

二、左连接(left join 表名 on 条件)
  select * from person as a left join department as b on a.dpid=b.id
结果是
id name dpid id name
1  xun  1    1  开发部
2  xun2 2    null null
3  xun3 1    1  测试部
        可见,左连接联合查询后的结果以左表为准扩展开来,左表中的记录不符合条件的,其连接后的字段均为空
三、右连接(right join 表名 on 条件)
         select * from person as a right join department as b on a.dpid=b.id
结果是
id  name dpdi id name
1   xun  1    1  开发部
3   xun3 1    1  开发部
       右连接联合查询的结果以右表为准扩展开来,右表中不符合条件的,其连接后的字段为空,这里的右表只有一条记录,因此扩展后左表中不符合条件的记录不用添加进来。
四、全连接(full join 表名 on 条件)
        select * from person as a full join department as b on a.dpid=b.id
结果是
id   name  dpid  id  name
1    xun   1     1   开发部
2    xun2  2     null null
3    xun3  1     1   开发部
         可以看到全连接将两张表中的所有数据显示出来,不符合条件的在相应的位置为null,上例中person表中id为2的记录的dpid为2,因为dpid为2在department中没有数据,所以连接后相应的属性为空
五、内连接(inner join 表名 on 条件)
         select * from person as a inner join department as b on a.dpid=b.id
结果是
id  name  dpid  id  name
1   xun   1     1   开发部
3   xun3  1     1   开发部
可以得出内连接返回的是同时存在左表和右表的数据
六、交叉连接(cross join 表名)
a、不带where条件语句
         select * from person as a cross join department as b
结果是
id  name   dpid    id   name
1   xun    1       1    开发部
2   xun2   2       1    开发部
3   xun3   1       1    开发部
        不带where条件的交叉连接产生所涉及的表的笛卡尔积,即第一张表的行数乘以第二张表的行数等于笛卡尔积结果集的大学(上例中person:3*department:1=3)
b、带where条件语句
         select * from person as a cross join department as b where a.dpid=b.id
结果是
id   name   dpid  id   name
1    xun    1     1    开发部
3    xun3   1     1    开发部
带上where条件,交叉连接后返回的结果集与内连接一样。

原创粉丝点击