SQL server Management Studio の使い方
以下の書籍を参照しました。
SQL Server 2008の教科書
松本美穂 松本崇博 ソシム株式会社 2009
【SQLステートメントの基本:複数テーブルの複合】
■内部結合(Inner Join)
リレーションシップをたどって、関連情報を取得する。
select *または列名
from テーブル1 inner join テーブル2
on テーブル1.結合キー列1 = テーブル2.結合キー2
※ 表示させたい列名を指定する際、結合キーと同じ名前だとエラーが出るので
select テーブル名1.列名1 として回避する。
というか、できるだけ、「テーブル名1.列名1」としたほうが良い。
※ テーブル名を何度も記述するのが面倒な場合、別名を付けることができる。
select a.列1, b.列1, b.列2
from テーブル1 as a inner join テーブル2 as b
on a.列2 = b.列1
※ クエリデザイナの上で右クリック→「エディタでクエリをデザイン」で
GUI操作することができる。
■GROUP BY句と結合演算
複数のテーブルにわたる内部結合されたデータを使って
カウントしたデータをグループ化する、
てことなんだけど、ここにきて、実例がないばかりに書ききれない。。。orz
ん~~じゃぁ、例えば、
テーブル1には、1ID、名前、2ID、
テーブル2には、2ID、部門
があるとして、
select テーブル2.2ID, 部門, count(*)
from テーブル1 inner join テーブル2
on テーブル1.2ID = テーブル2.2ID
group by 部門
だと、エラーになっちゃうの。
GROUP BY 句では、選択リストにあげたもの、
ここでは、テーブル2の2IDと部門になるんだけど
これらの列をすべて GROUP BY にも記述する必要があるのね。
なので、
select テーブル2.2ID, 部門, count(*)
from テーブル1 inner join テーブル2
on テーブル1.2ID = テーブル2.2ID
group by テーブル2.2ID,部門
が正解。
■外部結合(Outer Join)
「結合するテーブル同士で、対応するデータがない場合でも、データを取得できる。」
ってあるけど。。。
???なんですけどwwwってことでw
ここにたとえば、
++ テーブルA ++
AID 名前 BID
1 イチゴ 10
2 りんご 10
3 みかん 20
++ テーブルB ++
BID クラス
10 赤
20 黄
30 緑
てのがあったとしてー
select テーブルA.*, クラス
from テーブルA inner join テーブルB
on テーブルA.BID = テーブルB.BID
って記述すると、
AID 名前 BID クラス
1 イチゴ 10 赤
2 りんご 10 赤
3 みかん 20 黄
ってなるじゃない?
ここで、right outer join を使うとね、
select テーブルA.*, クラス
from テーブルA right outer join テーブルB
on テーブルA.BID = テーブルB.BID
で、結果は
AID 名前 BID クラス
1 イチゴ 10 赤
2 りんご 10 赤
3 みかん 20 黄
NULL NULL NULL 緑
ってなって、テーブルAには使われてないけど、テーブルBにある「γ」の行が表示されるの。
joinの右にあるテーブルのデータすべてを引っ張ってくるからね。
じゃ、この記述のうち、right を left に変えるとどうなるか?
結果は innner join の時と同じになっちゃうの。
左にあるテーブルAにあるデータしか取り込まないから。
なので、書き方は right だろーが left だろーが自由みたい。
でも、混乱しちゃいそう。
AccessみたいにGUIで自由に試せるのが欲しいわーー
以下の書籍を参照しました。
SQL Server 2008の教科書
松本美穂 松本崇博 ソシム株式会社 2009
【SQLステートメントの基本:複数テーブルの複合】
■内部結合(Inner Join)
リレーションシップをたどって、関連情報を取得する。
select *または列名
from テーブル1 inner join テーブル2
on テーブル1.結合キー列1 = テーブル2.結合キー2
※ 表示させたい列名を指定する際、結合キーと同じ名前だとエラーが出るので
select テーブル名1.列名1 として回避する。
というか、できるだけ、「テーブル名1.列名1」としたほうが良い。
※ テーブル名を何度も記述するのが面倒な場合、別名を付けることができる。
select a.列1, b.列1, b.列2
from テーブル1 as a inner join テーブル2 as b
on a.列2 = b.列1
※ クエリデザイナの上で右クリック→「エディタでクエリをデザイン」で
GUI操作することができる。
■GROUP BY句と結合演算
複数のテーブルにわたる内部結合されたデータを使って
カウントしたデータをグループ化する、
てことなんだけど、ここにきて、実例がないばかりに書ききれない。。。orz
ん~~じゃぁ、例えば、
テーブル1には、1ID、名前、2ID、
テーブル2には、2ID、部門
があるとして、
select テーブル2.2ID, 部門, count(*)
from テーブル1 inner join テーブル2
on テーブル1.2ID = テーブル2.2ID
group by 部門
だと、エラーになっちゃうの。
GROUP BY 句では、選択リストにあげたもの、
ここでは、テーブル2の2IDと部門になるんだけど
これらの列をすべて GROUP BY にも記述する必要があるのね。
なので、
select テーブル2.2ID, 部門, count(*)
from テーブル1 inner join テーブル2
on テーブル1.2ID = テーブル2.2ID
group by テーブル2.2ID,部門
が正解。
■外部結合(Outer Join)
「結合するテーブル同士で、対応するデータがない場合でも、データを取得できる。」
ってあるけど。。。
???なんですけどwwwってことでw
ここにたとえば、
++ テーブルA ++
AID 名前 BID
1 イチゴ 10
2 りんご 10
3 みかん 20
++ テーブルB ++
BID クラス
10 赤
20 黄
30 緑
てのがあったとしてー
select テーブルA.*, クラス
from テーブルA inner join テーブルB
on テーブルA.BID = テーブルB.BID
って記述すると、
AID 名前 BID クラス
1 イチゴ 10 赤
2 りんご 10 赤
3 みかん 20 黄
ってなるじゃない?
ここで、right outer join を使うとね、
select テーブルA.*, クラス
from テーブルA right outer join テーブルB
on テーブルA.BID = テーブルB.BID
で、結果は
AID 名前 BID クラス
1 イチゴ 10 赤
2 りんご 10 赤
3 みかん 20 黄
NULL NULL NULL 緑
ってなって、テーブルAには使われてないけど、テーブルBにある「γ」の行が表示されるの。
joinの右にあるテーブルのデータすべてを引っ張ってくるからね。
じゃ、この記述のうち、right を left に変えるとどうなるか?
結果は innner join の時と同じになっちゃうの。
左にあるテーブルAにあるデータしか取り込まないから。
なので、書き方は right だろーが left だろーが自由みたい。
でも、混乱しちゃいそう。
AccessみたいにGUIで自由に試せるのが欲しいわーー