SQL server Management Studio の使い方

以下の書籍を参照しました。
SQL Server 2008の教科書
松本美穂 松本崇博 ソシム株式会社 2009



【SQLステートメントの基本:その他のSQL92規格】
「DISTINCT」、「サブクエリ」、「CASE式」

■重複データの排除(DISTINCT)


重複したデータを排除して表示
 
select distinct 列名 from テーブル名

このままだとなんのこっちゃサッパリなので

++ テーブルA ++

AID 名前 BID
1  イチゴ 10
2  りんご 10
3  みかん 20

があったとして、

select distinct BID from テーブルA

と記述すると、

BID
10
20

とだけ表示されます。
選択リスト「BID」が表示され、
さらに重複データが省かれています。




■サブクエリ(副問い合わせ)


++ テーブルA ++

AID 名前 入り数 BID
1  イチゴ  30  10
2  りんご  12  10
3  みかん  15  20
4  さくらんぼ 50 10

っていうのがあったとして、

select MAX(入り数) as 入り数MAX from テーブルA

ってすると、もちろん入り数が一番多いさくらんぼのデータが出てくるよね。
こんな感じ

入り数MAX
50


じゃ次。
select MAX(名前) from テーブルA

ってすると、どうなるか。
文字列のMAXは、「Shift-JISコード」の一番大きい値を引っ張るんだって。
この例の場合は、「りんご」になるらしく、以下の通り。

(列名なし)
12

でもさー、MAXの値だけじゃなくて、それが何に紐付く値なのか知りたいじゃない?
そう思って、

select MAX(名前),MAX(入り数) from テーブルA

なんて記述したらどうなるか!?

(列名なし) (列名なし)
りんご    50

なんて、変な結果が出てきちゃうじゃないの!
りんごの入り数は12個だし、50個入ってるのはさくらんぼだし・・・


ここで登場するのが、「サブクエリ」
最初は表示させたい列名を列挙させといて、
where句でselect文を入れ子にしちゃう、と。

select * from テーブルA
where 入り数 = (select MAX(入り数) from テーブルA)

そうすると、こんな結果が返ってきます。

AID 名前 入り数 BID
4  さくらんぼ 50 10

入り数 = (select 最大) のほかにも
入り数 > (select 平均) とかもできるし。
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 Management Studio の使い方

以下の書籍を参照しました。
SQL Server 2008の教科書
松本美穂 松本崇博 ソシム株式会社 2009



【SQLステートメントの基本:その他の演算子】


■その他の演算子


文字データのあいまい検索に使用する。
ワイルドカードは「%」か「_」
% … 0文字以上の任意の文字列
_ … 任意の一文字
 

●例1 算術演算子

select 列名1, 列名2 +5 from テーブル名

→列名のデータに5を足した値で結果が返ってくる。
 この時、表示される列名2の名前がなく、「(列名なし)」となる。

select 列名1, 列名2 +5 as 列名2プラス5 from テーブル名

とすると、「列名2プラス5」という列名になる。


●例2 文字連結演算子の「+」

select 列名1, 列名2 + 'さん' from テーブル名

列名2のデータにすべて
値1   さん
値2   さん
というように、スペースと「さん」がついて表示


select 列名1, rtrim(列名2) + 'さん' from テーブル名

列名2のデータにすべて
値1さん
値2さん
とういうように、「さん」がついて表示



■集計関数とグループ化


合計や平均などの集計を行う。
集計関数では、NULL値は無視される。


●例1 集計関数

sum  合計
avg  平均
max  最大
min  最小
count 行数のカウント

select sum(列1) from テーブル名

→NULL値を無視して、列1の合計を集計をする。
 この時の列名は「(列名なし)」になる。

※ 平均、最大、最小、行数のカウントも同様
※ ただし、count(*)とすると、NULL値も計上できる。


●例2 グループ化 (group by)

集計関数をgroup by句と同時に使うことが多い。

select 列2 , avg(列1) from テーブル名
group by 列2

→列2ごとに、列1の平均を算出する。


●例3 having句で絞り込む

集計結果に対して絞り込みを行う。

select 列2, count(*) from テーブル名
group by 列2
having count(*) >=5

→列2ごとに、データの個数をカウントし、データ数が5以上のもののみ表示する。
 このコードだと、NULL値も計上されている。