等值连接,自然连接,自连接分别是什么意思啊?

fjlyhj001 2008-05-30 01:27:08
等值连接示范:
select * from sales s join titles t on s.title_id=t.title_id join publishers p on t.pub_id=p.pub_id
在结果集中显示冗余列数据
自然连接示范:
select t.title,p.pub_name from titles t join publishers p on t.pub_id=p.pub_id
自连接示范:
select t1.title,t2.title,t1.price from titles t1 join titles t2
on t1.price=t2.price where t1.price=2.99
...全文
3194 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
youyoudelaile 2012-08-27
  • 打赏
  • 举报
回复
自然连接怎么用,求解释
youyoudelaile 2012-08-27
  • 打赏
  • 举报
回复
自然连接怎么用,求解释
Wei_Yuan_2012 2012-06-21
  • 打赏
  • 举报
回复
内部链接 AxB 即做笛卡尔乘积(没有去除冗余项)
自然连接 A |X| B 做笛卡尔乘积(有去除冗余项)
外部连接 目前SQL没有实现自然连接。
ojuju10 2008-05-30
  • 打赏
  • 举报
回复
去掉重复的列的等值连接叫做自然连接
iamme81 2008-05-30
  • 打赏
  • 举报
回复
再帖一边吧!

现有两张表如下,请说出如下语句的执行结果
create table T1(id int,age int)
create table T2(age int,name int)

insert into T1 select Null,Null union all
select 1,Null union all
select 1,1 union all
select 1,2 union all
select 2,1

insert into T2 select Null,Null union all
select Null,1 union all
select 1,1 union all
select 2,1 union all
select 1,2

--不使用JOIN直接双表关联,join和inner join一样只会取表中有交集的部分,注意有多条匹配的将会全列出,此外NULL在SQL Server中不被认

为有交集,
select T1.*,T2.* from T1,T2 where T1.age=T2.age
1 1 1 1
1 1 1 2
1 2 2 1
2 1 1 1
2 1 1 2
select T1.*,T2.* from T1 join T2 on T1.age=T2.age
1 1 1 1
1 1 1 2
1 2 2 1
2 1 1 1
2 1 1 2
select T1.*,T2.* from T1 inner join T2 on T1.age=T2.age
1 1 1 1
1 1 1 2
1 2 2 1
2 1 1 1
2 1 1 2
--left join是左表(T1表中)有的数据都会显示,注意对于NULL右表有多条相匹配的数据只取出第一条
select T1.*,T2.* from T1 left join T2 on T1.age=T2.age
NULL NULL NULL NULL
1 NULL NULL NULL
1 1 1 1
1 1 1 2
1 2 2 1
2 1 1 1
2 1 1 2
--right join是右表(T2表中)有的数据都会显示,注意对于NULL左表有多条相匹配的数据只取出第一条
select T1.*,T2.* from T1 right join T2 on T1.age=T2.age
NULL NULL NULL NULL
NULL NULL NULL 1
1 1 1 1
2 1 1 1
1 2 2 1
1 1 1 2
2 1 1 2
--FULL JOIN是将两表中存在的数据都取出来,不过有多条相匹配的还是只取第一条
select T1.*,T2.* from T1 FULL JOIN T2 on T1.age=T2.age
NULL NULL NULL NULL
1 NULL NULL NULL
1 1 1 1
1 1 1 2
1 2 2 1
2 1 1 1
2 1 1 2
NULL NULL NULL NULL
NULL NULL NULL 1
--CROSS JOIN脱离任何匹配,只要是表中有的数据都会被关联起来(包括NULL值),所以不能指定on关键字
select T1.*,T2.* from T1 ,T2 或select T1.*,T2.* from T1 ,T2 CROSS JOIN
NULL NULL NULL NULL
1 NULL NULL NULL
1 1 NULL NULL
1 2 NULL NULL
2 1 NULL NULL
NULL NULL NULL 1
1 NULL NULL 1
1 1 NULL 1
1 2 NULL 1
2 1 NULL 1
NULL NULL 1 1
1 NULL 1 1
1 1 1 1
1 2 1 1
2 1 1 1
NULL NULL 2 1
1 NULL 2 1
1 1 2 1
1 2 2 1
2 1 2 1
NULL NULL 1 2
1 NULL 1 2
1 1 1 2
1 2 1 2
2 1 1 2
Herb2 2008-05-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 roy_88 的回复:]
1\2屬於同一類型
[/Quote]
中国风 2008-05-30
  • 打赏
  • 举报
回复
INNER

指定必須傳回所有相符的資料列配對。捨棄兩份資料表中不相符的資料列。如果未指定聯點類型,這就是預設值。

FULL [ OUTER ]

指定左資料表或右資料表中不符合聯結條件的資料列必須併入結果集中,且對應於其他資料表的輸出資料行必須設為 NULL。這是通常由 INNER JOIN 傳回之所有資料列以外的項目。

LEFT [ OUTER ]

指定左資料表中不符合聯結條件的所有資料列必須併入結果集中,而且,除了內部聯結所傳回的所有資料列以外,還必須將其他資料表中的輸出資料行設為 NULL。

RIGHT [OUTER]

指定右資料表中不符合聯結條件的所有資料列必須併入結果集中,而且,除了內部聯結所傳回的所有資料列以外,還必須將對應於其他資料表的輸出資料行設為 NULL


使用 PIVOT 和 UNPIVOT
pivot_column 和 value_column 是 PIVOT 運算子所使用的群組作業資料行。PIVOT 會遵照下列處理序來取得輸出結果集:

在它的 input_table 上針對群組作業資料行執行 GROUP BY,然後為每個群組分別產生一個輸出。

輸出資料列中的群組作業資料行會為 input_table 中之該群組取得相對應的資料行值。


執行下列作業,在每個輸出資料列的資料行清單中產生資料行的值:


另外,再對前一個步驟中針對 pivot_column 而在 GROUP BY 中所產生的資料列進行群組作業。

針對 column_list 中的每個輸出資料行,選取滿足下列條件的子群組:

pivot_column = CONVERT(<data type of pivot_column>, 'output_column')


針對這個子群組上的 value_column 來評估 aggregate_function,且 aggregate_function 的結果傳回作為相對應的 output_column 之值。如果子群組是空的,SQL Server 會為該 output_column 產生 Null 值。如果彙總函數是 COUNT,且子群組是空的,就會傳回零 (0)。
Limpire 2008-05-30
  • 打赏
  • 举报
回复
自然连接SQL没有实现
中国风 2008-05-30
  • 打赏
  • 举报
回复
1\2屬於同一類型
Limpire 2008-05-30
  • 打赏
  • 举报
回复
第二条是内联接,不是自然联接
中国风 2008-05-30
  • 打赏
  • 举报
回复
在聯機幫助上查看

34,587

社区成员

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

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