在项目中,数据库联结用的最多的是内联结,除了内联结外,联结还分为外联结、交叉联结。下面的讲解以如下两个表为例
a表记录如下:
编号 姓名
---- ----------
1000 张三
2000 李四
3000 王五
b表记录如下:
编号 商品
---- ----------
1000 电视机
2000 录像机
4000 自行车
1. 内联结(inner join):根据所使用的比较方式不同,内连接又分为等值联结、自然联结和不等联结
1)等值联结:在联结条件中使用等号运算符比较被联结的列值,其查询结果中列出被联结表中的所有列,包括其中的重复列
select a.*,b.* from a inner join b on a.编号=b.编号
编号 姓名 编号 商品
---- ---------- ---- ----------
1000 张三 1000 电视机
2000 李四 2000 录像机
2)不等联结:在联结条件使用除等于运算符以外的其他比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<>
3)自然联结:在联结条件中使用等于运算符比较被联结的列值,但它使用选择列表指出查询结果集中所包含的列,并删除联结表的重复列
2. 外联结:分为左外联结(left Join)、右外联结(right join)和全外联结(full join)
1)左联结:包含所有的左表中的记录甚至是右表中没有和它匹配的记录
select a.*,b.* from a left join b on a.编号=b.编号
编号 姓名 编号 商品
---- ---------- ---- ----------
1000 张三 1000 电视机
2000 李四 2000 录像机
3000 王五 null null
2)右联结:包含所有的右表中的记录甚至是左表中没有和他匹配的记录
select a.*,b.* from a right join b on a.编号=b.编号
编号 姓名 编号 商品
---- ---------- ---- ----------
1000 张三 1000 电视机
2000 李四 2000 录像机
null null 4000 自行车
3)全联结:左表和右表中的所有记录都会选出来
select a.*,b.* from a full join b on a.编号=b.编号
编号 姓名 编号 商品
---- ---------- ---- ----------
1000 张三 1000 电视机
2000 李四 2000 录像机
3000 王五 null null
null null 4000 自行车
3. 交叉联结(cross join):没有where子句,它返回联结表中所有数据行的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(a表和b表交叉连接产生3*3=9条记录)
select * from a cross join b
编号 姓名 编号 商品
---- ---------- ---- ----------
1000 张三 1000 电视机
1000 张三 2000 录像机
1000 张三 4000 自行车
2000 李四 1000 电视机
2000 李四 2000 录像机
2000 李四 4000 自行车
3000 王五 1000 电视机
3000 王五 2000 录像机
3000 王五 4000 自行车
http://www.beidaqingniao.com/%E5%8C%97%E5%A4%A7%E9%9D%92%E9%B8%9F-%E5%8C%97%E5%A4%A7%E9%9D%92%E9%B8%9F%E6%80%BB%E6%A0%A1%E3%80%81%E5%B0%B1%E4%B8%9A%E5%9F%BA%E5%9C%B0%E3%80%81%E5%B8%88%E8%B5%84%E5%9F%B9%E8%AE%AD%E5%9F%BA%E5%9C%B0%EF%BC%81.files/toppic.gif
5 个解决方案