请求大家个问题,内联接和外联接有什么区别?

youcailing 2003-09-19 03:45:40
create table a(xh char(1),xm varchar(8))
create table b(xh char(1),nl int)
insert into a(xh,xm) values('1','王刚')
insert into a(xh,xm) values('2','刘老根')
insert into a(xh,xm) values('3','老王')
insert into a(xh,xm) values('7','小刘')

insert into b(xh,nl)values('1',26)
insert into b(xh,nl)values('2',25)
insert into b(xh,nl)values('3',26)
insert into b(xh,nl)values('4',26)
insert into b(xh,nl)values('5',26)
表示这样子的,想试验一下,大家说完了,能写个例子吗?
...全文
113 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
redcola 2003-10-15
  • 打赏
  • 举报
回复
学习
programeyonger 2003-10-15
  • 打赏
  • 举报
回复
学习!
lufree 2003-10-15
  • 打赏
  • 举报
回复
gz
junsisi 2003-09-19
  • 打赏
  • 举报
回复
假如a表有数据如下:
title,value
a1 1
a2 2

b表数据如下:
title,value
a2 4
a3 5

求结果表如下:
title,value
a1 1
a2 6
a3 5

使用内连接得结果如下:
select isnull(a.title,b.title),(isnull(a.value,0)+isnull(b.value,0)) from a join b on a.title=b.title

title,value
a2 6

使用外连接得结果如下:
select isnull(a.title,b.title),(isnull(a.value,0)+isnull(b.value,0)) from a full join b on a.title=b.title

title,value
a1 1
a2 6
a3 5

youcailing 2003-09-19
  • 打赏
  • 举报
回复
没有人能自己表达一下吗?
aierong 2003-09-19
  • 打赏
  • 举报
回复



联接类型
当联接表时,创建的联接类型影响出现在结果集内的行。可以创建下列联接类型:

内联接 仅显示两个联接表中的匹配行的联接。(这是查询设计器中的默认联接类型。)例如,可以联接 titles 表和 publishers 表以创建显示每个书名的出版商名称的结果集。在内联接中,结果集内不包含没有出版商信息的书名,也不包含没有书名的出版商。这类联接所得到的 SQL 可能象下面这样:
SELECT title, pub_name
FROM titles INNER JOIN
publishers ON titles.pub_id = publishers.pub_id
注意 当创建内联接时,包含 NULL 的列不与任何值匹配,因此不包括在结果集内。空值不与其它的空值匹配。

有关创建内联接的更多信息,请参见自动联接表。

外联接 甚至包括在联接表中没有相关行的行的联接。可以创建外联接的三个变化形式来指定所包括的不匹配行:
左向外联接 包括第一个命名表("左"表,出现在 JOIN 子句的最左边)中的所有行。不包括右表中的不匹配行。例如,下面的 SQL 语句说明 titles 表和 publishers 表之间的左向外联接包括所有的书名,甚至包括那些没有出版商信息的书名:
SELECT titles.title_id,
titles.title,
publishers.pub_name
FROM titles LEFT OUTER JOIN publishers
ON titles.pub_id
= publishers.pub_id
右向外联接 包括第二个命名表("右"表,出现在 JOIN 子句的最右边)中的所有行。不包括左表中的不匹配行。例如,在 titles 和 publishers 表之间的右向外联接将包括所有的出版商,甚至包括那些在 titles 表中没有书名的出版商。所得到的 SQL 可能象下面这样:
SELECT titles.title_id,
titles.title,
publishers.pub_name
FROM titles RIGHT OUTER JOIN publishers
ON titles.pub_id
= publishers.pub_id
完整外部联接 包括所有联接表中的所有行,不论它们是否匹配。例如,titles 表和 publishers 表之间的完整外部联接显示所有书名和所有出版商,甚至包括那些在另一个表中没有匹配值的书名和出版商。
SELECT titles.title_id,
titles.title,
publishers.pub_name
FROM titles FULL OUTER JOIN publishers
ON titles.pub_id
= publishers.pub_id
有关创建外联接的更多信息,请参见创建外联接。

交叉联接 在这类联接的结果集内,两个表中每两个可能成对的行占一行。例如,在通过作者 CROSS JOIN 出版商输出的结果集内,每个可能的作者/出版商组合占一行。所得到的 SQL 可能象下面这样:
SELECT *
FROM authors CROSS JOIN publishers
youcailing 2003-09-19
  • 打赏
  • 举报
回复
能不能用语言概括一下,内联接和外联接,我看帮助,没怎么看明白
happydreamer 2003-09-19
  • 打赏
  • 举报
回复

declare @a table(a int,b int)
declare @b table(a int,b int)
insert @a values(1,1)
insert @a values(2,2)
insert @b values(1,1)
insert @b values(3,3)

--左:
select * from @a Aa left join @b Bb on Aa.a=Bb.a
--右:
select * from @a Aa right join @b Bb on Aa.a=Bb.a
--内
select * from @a Aa join @b Bb on Aa.a=Bb.a
--外:
select * from @a Aa full join @b Bb on Aa.a=Bb.a
--完全
select * from @a,@b


cross join 是笛卡儿乘积 就是一张表的行数乘以另一张表的行数
left join 第一张表的连接列在第二张表中没有匹配是,第二张表中的值返回null
right join 第二张表的连接列在第一张表中没有匹配是,第一张表中的值返回null
full join 返回两张表中的行 left join+right join
inner join 只返回两张表连接列的匹配项
happydreamer 2003-09-19
  • 打赏
  • 举报
回复

declare @a table(a int,b int)
declare @b table(a int,b int)
insert @a values(1,1)
insert @a values(2,2)
insert @b values(1,1)
insert @b values(3,3)

--左:
select * from @a Aa left join @b Bb on Aa.a=Bb.a
--右:
select * from @a Aa right join @b Bb on Aa.a=Bb.a
--内
select * from @a Aa join @b Bb on Aa.a=Bb.a
--外:
select * from @a Aa full join @b Bb on Aa.a=Bb.a
--完全
select * from @a,@b


cross join 是笛卡儿乘积 就是一张表的行数乘以另一张表的行数
left join 第一张表的连接列在第二张表中没有匹配是,第二张表中的值返回null
right join 第二张表的连接列在第一张表中没有匹配是,第一张表中的值返回null
full join 返回两张表中的行 left join+right join
inner join 只返回两张表连接列的匹配项

34,874

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧