- 2009年2 月24日(火)
- 未分類
shimazakiです。
今日はSQLの話です。
SQLってプログラムと違い、上から順に処理されるわけではなく、まとめて処理されるのでなかなか理解できません。
SQLってこんなことも出来たのか!と感動した時の話をしたいと思います。
例えばこんなテーブルがあったとして(試験の結果テーブルだと思っていただければ)
- sampleTbl
- 100点の人数と、90〜99点の人数と、80〜89点の人数と70〜79点一覧を抽出したい場合
| ID | point |
|---|---|
| A | 100 |
| B | 90 |
| C | 88 |
| D | 70 |
| E | 95 |
| F | 80 |
select ‘p100′ as pnt,count(*) as cntpoint from sampleTbl where point = 100
union
select ‘p90′ as pnt,count(*) as cntpoint from sampleTbl where point between 90 and 99
union
select ‘p80′ as pnt,count(*) as cntpoint from sampleTbl where point between 80 and 89
union
select ‘p70′ as pnt,count(*) as cntpoint from sampleTbl where point between 70 and 79;
pnt cntpoint p100 1 p90 3 p80 1 p70 1
というSQLを、
select
sum( if( point=100, 1,0)) as p100,
sum( if( point between 90 and 99 , 1,0 ) ) as p90,
sum( if( point between 80 and 89 , 1,0 ) ) as p80,
sum( if( point between 70 and 79 , 1,0 ) ) as p70
from sampleTbl;
p100 p90 p80 p70 1 3 1 0
と言うSQLに変更します。
条件に一致する行を1とし、その個数をカウントすることで、結果を一行で取得することができます。
これが、単一の試験結果であればそれほど利点はないのですが、例えば、今回のテスト結果と前回のテスト結果を表示する画面、というものがあった場合、先述のunion方式では結果データの構成が複雑になってしまいますが、後述の方法であれば、今回の結果行と前回の結果行という取得が可能なので、結果データの構成が分かりやすくなります。
SQLの理解がまだまだ足りないと思う今日この頃でした。
- Newer: なでしこのススメ
- Older: JavaScriptを理解するための5つの条件+α