SQL server Management Studio の使い方


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


【使用テーブル】


++ 果物 ++

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




■CASE式(条件分岐)


複数の条件分岐のしかた。


case [式]
when 条件1 then 条件1を満たした場合の値
when 条件2 then 条件2を満たした場合の値
 else すべての条件を満たしていない場合の値
end


つったってー、こんなんじゃわからんので、実際に書いてみる。


select
case BID
when 10 then '赤色の果物'
when 20 then '黄色の果物'
else 'わかんない~'
end
,* from 果物


で、これの結果が、


(列名なし)  AID  名前   入り数  BID
赤色の果物  1  イチゴ    30   10
赤色の果物  2  りんご    12   10
黄色の果物  3  みかん    15   20
赤色の果物  4  さくらんぼ  50   10
赤色の果物  5  マンゴー   15   10


こんな感じでどうでしょう。。。



あと、こんなこともできました。


select
case
when 20 > 入り数 and 入り数 >= 15 then '15~20個入り'
when 入り数 >= 20 then '20個以上'
else '少数'
end
,* from 果物
order by 入り数


で、結果


(列名なし)    AID  名前   入り数  BID
少数         2  りんご    12   10
15~20個入り   3  みかん    15   20
15~20個入り   5  マンゴー   15   10
20個以上      1  イチゴ    30   10
20個以上      4  さくらんぼ  50   10

SQL server Management Studio の使い方


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




【使用テーブル】


++ 果物 ++

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


++ 色 ++

BID color

10  赤

20  黄

30  緑




■UNION ALL


このうち、AID=1のイチゴの行だけ抽出した場合、


select * from 果物 where AID =1


ってするとよいです。
じゃ、AIDが「1」と「2」のものを抽出する場合は??


select * from 果物 where AID =1 or AID =2  でも


select * from 果物 where AID in (1,2)   でも


select * from 果物 where AID =1
union all
select * from 果物 where AID =2


でも表示できます。




■UNION


では、抽出結果に重複がある場合、
例えば、AIDが「3」で、入り数が15の物を表示させたい場合は??


select * from 果物 where AID = 3
union all
select * from 果物 where 入り数 = 15


だと、結果は


AID 名前 入り数 BID
3  みかん  15  20
3  みかん  15  20
5  マンゴー 15  10


って、結果に重複ができてしまいますよね。
この場合は、


select * from 果物 where AID = 3
union
select * from 果物 where 入り数 = 15


ってしてあげると、


AID 名前 入り数 BID
3  みかん  15  20
5  マンゴー 15  10


となり、ほしい結果が得られます。


※UNIONは、重複行を排除する分、パフォーマンスが下がるので
できるだけUNION ALLを使うほうがいいみたい。




■UNION と ORDER BY


UNIONで連結したとき、ORDER BYが使えるのは、
はじめのSELECTステートメントに対してのみ。

あまり、実用的ではない気がするんだけど、
UNIONって、列名が違っていても、データ型と列数が同じならば
特にエラーが出ないとのことなので、以下の例で見ていきます。


select AID, 名前 from 果物
union all
select BID,color from 色


これって、


果物テーブルの「AID」と「名前」
色テーブルの「BID」と「color」

いっしょくたに表示させてください
、って言ってるのね。

こんな感じ。


AID 名前
1  イチゴ
2  りんご
3  みかん
4  さくらんぼ
5  マンゴー
10 赤
20 黄
30 緑


でだ、これにORDER BYを使う場合は、
果物テーブルの「AID」か「名前」に対してのみですよ、ってこと。
書き方は、


select AID, 名前 from 果物
union all
select BID,color from 色
order by AID



「order by AID」は、「order by 1」とも記述できて、
「order by 名前」は、「order by 2」とも記述できる。
つまり、はじめのSELECTステートメントの選択リストを左から番号振ってるのね。

SQL server Management Studio の使い方

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




■複数件のサブクエリ


++ 果物 ++

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



ってテーブルがあったとします。


・・・すぅっごくいまさらなんだけど、
「BID」は単純に果物の色分けです。
BID=10 のものは、赤い果物
BID=20 のものは、黄色い果物
って、私が勝手に決めてるだけです。。。



んでね、色分けごとに、入り数が最大値のものを抽出したい場合、


select * from 果物
where 入り数 = (select max(入り数) from 果物 group by BID)


ってしたくなるんだけど、これだとよくわかんないエラーが出ます。
()内の結果が複数個あるから、らしいんだけど。
そこで使うのが、「IN演算子」


select * from 果物
where 入り数 in (select max(入り数) from 果物 group by BID)


ってすると、


AID 名前 入り数 BID
3  みかん  15  20
4  さくらんぼ 50 10
5  マンゴー 15  10


てな結果が返ってきます。
が、イラナイモノがありますですよね・・・


5  マンゴー 15  10


これ、なんで出てきちゃってるの!?

BID=20のみかんの最大入り数「15」と同じなので
取得されているようです。

要するに、


select * from 果物
where 入り数 in ( 50, 15 )


の結果を返してるんですね。。。



そこで、()内の結果を(selectステートメントの結果、っているう言い方するみたい)
テーブルのようにしちゃいましょう。
inner joinのところでちょびっと出てきた、
別名を付ける方法です。
http://ameblo.jp/beginner-shelly/entry-10826661854.html



select * from 果物
inner join(select BID, MAX(入り数)M入り数 from 果物 group by BID) as tableB
on 果物.BID = tableB.BID


ってすると。。。


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


うむむ??ほしい結果とは違う…
では、一行追加して、


select * from 果物
inner join(select BID, MAX(入り数)M入り数 from 果物 group by BID) as tableB
on 果物.BID = tableB.BID
and 果物.入り数 = tableB.M入り数



AID 名前   入り数 BID BID M入り数
3  みかん    15  20  20   15
4  さくらんぼ   50  10  10   50


うおー!できた!!
こういうのを、「インライン ビュー」と言うらしいです。



最後の行に、

order by 列名 asc  とか

order by 列名 desc とか記述すると、
昇順、降順に並べ替えて表示させることができます。