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で自由に試せるのが欲しいわーー