SQL Serverの接続

35019 ワード

転載先:http://www.cnblogs.com/jiajiayuan/archive/2012/01/16/2321385.html
sql serverでは、接続をよく使用します.接続の分類:
クロスコネクションCROSS JOIN内部接続INNER JOIN外部接続{左外部接続LEFT[OUTER]JOIN;右外部接続RIGHT[OUTER]JOIN;全外部接続full[outer]join}自己接続次に、各接続の異同点を例として説明します.
TeacherテーブルとCourseテーブルが2つあります.


相互接続:
1.WHERE条件句を持たない場合、それは接続された2つのテーブルのデカルト積を返し、結果の行数は2つのテーブルの行数の積に等しい.
select * from Course cross join Teacher

結果:
SQL Server之连接_第1张图片
その結果,SELECT*FROM Course,Teacherと同様の結果が得られた.
2.WHERE句があれば、2つのテーブル行数積のデータテーブルになってからWHERE条件に従って選択することが多い.
1. select * from Course,Teacher where Course.T#=Teacher.T#
2. select * from Course cross join Teacher where Course.T#=Teacher.T# ( :cross join where, on)
3. select * from Course inner join Teacher on Course.T#=Teacher.T#

結果:

一般に、効率的には、WhereはInner joinと同じ効率を有する可能性がありますが、マルチテーブル接続ではwhere文の使用は推奨されません.したがって、選択できる場合は、文3を使用したほうがいいです.Join文を使用すると、文の無効または誤記の関連条件を確認するのに役立つ場合があります.
ないぶせつぞく
内部接続は両表が同時に条件に合致する組合せを示し、通常のCROSS JOINに相当するが、形式が異なるだけで、INNER JOINは後ろにON句(WHEREに相当)の検索条件があり、戻ってきた行をフィルタリングする.内部接続はデカルト積ほど複雑ではなく、行数積のデータテーブルを先に生成するため、内部接続の効率はデカルト積の交差接続よりも高い.
がいぶせつぞく
条件の内部接続を指定し、接続条件に一致するエントリのみを返します.外部ジョインは異なり、返される結果にはジョイン条件を満たすローだけでなく、左テーブル(左外部ジョインの場合)、右テーブル(右ジョインの場合)、または両側ジョイン(全外部ジョインの場合)のすべてのデータ行が含まれます.1)左外部接続LEFT[OUTER]JOINは、条件に合致するデータ行を表示するとともに、左データテーブルが条件に合致しないデータ行を表示し、右側に対応するエントリがNULLを表示しない.
select * from Course left outer join Teacher on Course.T#=Teacher.T#

結果:

2)右外部接続RIGHT[OUTER]JOINは、条件を満たすデータ行を表示するとともに、右側のデータテーブルが条件を満たさないデータ行を表示し、左に対応するエントリがNULLを表示しない.
select * from Course right outer join Teacher on Course.T#=Teacher.T#

結果:

3)全外接続full[outer]join
条件に一致するデータ行を表示し、同時に左右の条件に合致しないデータ行を表示し、対応する左右の両側にNULLを表示し、すなわち左接続、右接続、内接続の並列セットを表示する.
select * from Course full outer join Teacher on Course.T#=Teacher.T#

結果:
SQL Server之连接_第2张图片
じこせつぞく
実は、Sql Serverでは、自己接続という接続もよく使われています.以下の例により、自己接続を理解する:テーブルツリー構造テーブルtb_TestTreeView
SQL Server之连接_第3张图片
解決策:ツリー階層表示/*これは地域名とその所属する上位地域が格納されている地域表です.各地域とその所属する上位地域を検索する必要があるとします.*/
セルフジョインの方法1:
select [Name] as '   ',
(select [Name] from tb_TestTreeView as a
where a.ID = b.Parent ) as ' '
from tb_TestTreeView as b

セルフジョインの方法2:
select a.[Name] as '   ',
b.[Name] as ' '
from tb_TestTreeView as a
left join tb_TestTreeView as b
on a.Parent = b.ID

結果:
SQL Server之连接_第4张图片
自己接続3段階(左結合):
select a.[Name] as '   ',
b.[Name] as ' ',
c.[Name] as ' '
from tb_TestTreeView as a
left join tb_TestTreeView as b
on a.Parent = b.ID
left join tb_TestTreeView as c
on b.parent=c.id


結果:
SQL Server之连接_第5张图片
セルフジョイン3レベル(内部ジョイン):
select a.[Name] as '   ',
b.[Name] as ' ',
c.[Name] as ' '
from tb_TestTreeView as a
inner join tb_TestTreeView as b
on a.Parent = b.ID
inner join tb_TestTreeView as c
on b.parent=c.id


結果:
SQL Server之连接_第6张图片
自己接続レベル4(左リンク):
select a.[Name] as '   ',
b.[Name] as ' ',
c.[Name] as ' ',
d.[Name] as ' '
from tb_TestTreeView as a
left join tb_TestTreeView as b
on a.Parent = b.ID
left join tb_TestTreeView as c
on b.parent=c.id
left join tb_TestTreeView as d
on c.parent=d.id


結果:
SQL Server之连接_第7张图片
自己接続レベル4(内部リンク):
select a.[Name] as '   ',
b.[Name] as ' ',
c.[Name] as ' ',
d.[Name] as ' '
from tb_TestTreeView as a
inner join tb_TestTreeView as b
on a.Parent = b.ID
inner join tb_TestTreeView as c
on b.Parent = c.ID
inner join tb_TestTreeView as d
on c.Parent = d.ID


結果:
SQL Server之连接_第8张图片
本文の著作権は著者とブログ園に共有され、転載を歓迎するが、著者の同意を得ずにこの声明を保留し、文章のページの明らかな位置にハイパーリンクの形式で出典を明記しなければならない.そうしないと、法律責任を追及する権利を保留する.