ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

IT Doesn't matter ってことなんでしょうね。日本のIT投資意欲最下位

2007-05-20 18:59:27 | Weblog

そりゃー、そーだろーなー、テレビのCM(NTTコミュニケーションズ)で

「ビジネスにおける、ITの役割はひとまず終わろうとしています」

っていって、画面には

「さよならIT」

って出てくるぐらいだしなあ(ここの3段目真ん中の広告、広告をクリックするとすぐにCMが始まり、音が出ます)、

IT優等生といわれたイトーヨーカドーは、結局ITコストがかさみ、
セブンイレブンと合併して、セブンアンドアイという、自分たちの名前が
後になるという屈辱を味わわなければならなくなった昨今、

「IT投資に意義があるのか?」と懐疑的にならないほうが、おかしいよね。

ここのニュース
日本のIT投資への意識は世界最下位、ガートナー調べ
http://pc.watch.impress.co.jp/docs/2007/0518/gartner.htm

先進国の中で、日本が最下位ということですが、一般に先進国のIT投資意識は低いみたいです。1位インド、6位中国です。

 先進国は、一通り投資したから低いんでしょうね。
 ガートナーグループの人などは、コンピューター化を進めたほうが良いという意見のように見えるけど、そーなのかなあー、まじコンピューター化のコストが足引っ張ってて、過剰なコンピューター化は経営上好ましくないと思うが。。

 で、今のコンピューター化は、過剰に近いと思う(Excelマクロで十分っていうのも、プログラムつくってる)。コンピューター業界の人は気がつかないだけで、コンピューターの投資効果のなさや問題を、経営陣は気づき始めてしまったということだろう。
 日本の場合、それより通信への投資のほうが儲かるし。。。

 まー、国も、それに早く気づいて、IT先進国家になるんじゃなくって、ITでみんなが幸せになるような国家を目指して、余計な開発に税金を投入しないようになってくれると、税金を納める国民は、ありがたいんだけどね。
 国でもROEを求めて、投資に見合う利益(受益者負担分+コストカット分)がないときは、開発をしないという立場が大切だよね。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Hello World程度のデータベース(その20:外部スキーマ(4)SQLその3)。

2007-05-20 15:04:46 | 土日シリーズ

 情報処理とは何から、データベースの基本的な話(情報処理試験のデータベーススペシャリスト程度の話まで)を書く、土日のシリーズ「Hello World程度のデータベース」です。

 今までで、三層スキーマ構造(概念スキーマ、内部スキーマ、外部スキーマ)の概念スキーマ、内部スキーマをやって、今は、外部スキーマの話です。

 で、SQLについては、大体こんな内容というのを前回やりました。
●レコードの検索   select
  ・1つの表を条件をつけずによむ
  ・WHERE句
  ・ORDER BY
  ・GROUP BYとHAVING
  ・2つ以上の表
  ・結合あれこれ(外部結合、内部結合、自然結合、自己結合)
  ・副問い合わせと限定述語
  ・UNION、INTERSECT,EXCEPT

●レコードの追加   insert
  ・レコードの追加
  ・SELECT文を利用した複数行の追加

●レコードの削除   delete
  ・レコードの削除(WHERE句も含めて)
  ・副問い合わせを使ったもの

●レコードの更新   update
  ・レコードの更新(WHERE句も含めて)
  ・SET句における元の値の利用
  ・副問い合わせを使ったもの

●その他
  ・コミットとロールバック
  ・参照制約
  ・トリガーとストアド・プロシージャ(ストアド・プログラム)


今回から説明するのですが、はじめにselectの1つの表の部分である

・1つの表を条件をつけずによむ
・WHERE句
・ORDER BY
・GROUP BYとHAVING

について説明してみたいと思います。




■1つの表を条件をつけずによむ

まず、以下のようなテーブル,SHAIN_TBLがあったとします。
CREATE TABLE SHAIN_TBL (
  SHAINID INTEGER NOT NULL,
  SEI VARCHAR(20), 
  SEI_KANA VARCHAR(30),
  MEI VARCHAR(20) ,
  MEI_KANA VARCHAR(30),
  NYUSYANEN  INTEGER,
  KYOYU_SYUBETU INTEGER,
  KYUYO  INTEGER,
  PRIMARY KEY(SHAINID)
); 

上記のCREATE TABLEのみかたは、ここ

このとき、このテーブルのなかにあるデータをすべてだしたければ、

SELECT * FROM SHAIN_TBL;

です。こうすると、全部の項目が表示されますけど、姓(SEI),名(MEI),給与(KYUYO)が出したい場合、

SELET SEI,MEI,KYUYO FROM SHAIN_TBL

となります。つまり

SELECT 項目名(,項目名・・・) FROM テーブル名
(全項目の場合、項目名は *)

となります。




■WHERE句

ここで、KYOYU_SYUBETUが0のとき月給、1のとき日給、2のとき時給で、KYUYOの値は、、

  KYOYU_SYUBETUが0のとき月給の値
  KYOYU_SYUBETUが1のとき日給の値
  KYOYU_SYUBETUが2のとき時給の値

というとき、月給の人だけ出したい場合は、

SELET SEI,MEI,KYUYO FROM SHAIN_TBL WHERE KYOYU_SYUBETU=0

ということになります。
つまり、条件をつける場合は、WHERE句を

SELECT 項目名(,項目名・・・) FROM テーブル名 WHERE 条件式
(全項目の場合、項目名は *)

となります、条件式のところに

SELET SEI,MEI,KYUYO FROM SHAIN_TBL WHERE KYOYU_SYUBETU=0 AND NYUSYANEN = 2005;

のように、AND,ORをつけることも可能です
(上記の場合、入社年2005年で月給の人となる)

このとき、ANDとORでは、ANDのほうが優先順位がたかくなるので、ORを優先させたいところがあれば、()かっこでくくります。
ちなみに、条件式は

項目 比較演算子 値

という具合に書き、比較演算子に、< > <= >= = <> があるのは(ただし< >は、本当は半角)他の言語とおなじですが、それ以外に、BETWEEN 値 AND 値 やINやLIKEなどの演算子もSQLにはあります。
 また、AND、ORのほかにNOTという演算子もありますNOTはANDより優先順位は高いです。




■ORDER BY

 結果を整列させたい場合もあります。
 さっきの、月給を出すとき、給与が昇順(小さいものから大きいものになるように並べる)とか、降順(大きいものから小さいものへ)にならべかえたいなどなど。。。

 たとえば、月給の人をだすとき、給与を昇順に出したい場合は、

SELET SEI,MEI,KYUYO FROM SHAIN_TBL WHERE KYOYU_SYUBETU=0 ORDER BY KYUYO;

ということになります。降順なら

SELET SEI,MEI,KYUYO FROM SHAIN_TBL WHERE KYOYU_SYUBETU=0 ORDER BY KYUYO DESC;

とDESCをつけます(昇順のときASCをつけてもよいが、つけなくてもデフォルトが昇順なので、昇順となる)

つまり、条件をつける場合は、ORDERBY句を

SELECT 項目名(,項目名・・・) FROM テーブル名 WHERE 条件式 ORDER BY 項目名 (降順ならDESC)

(全項目の場合、項目名は *)

で、複数項目で昇順、降順を並べたい場合(年、月、日が、別々の項目で、年、月、日の順に昇順にしたい場合)

  項目名1 ,項目名2・・・

とカンマで項目名を並べます。
 なお、項目1は昇順、項目2は降順、項目3は昇順。。などというときには

 項目1,項目2 DESC,項目3

のように書きます。




■GROUP BY

 今、同じ入社年度の人のなかで、最高の給料(ただし月給)を出したいとします。
 年度が特定されているのならいいのですが、全部の年度。。。なので、実際には、
1.各年度ごとにまとめる
2.そのなかから最大値をさがす
ということになります。でも、今回のように、月給という制約がある場合、
0.まず、条件に合うレコードを抽出
ということを先にやらないといけません。

で、各年度ごとにまとめる、つまり、グループ化するのにGROUP BY句を使います。
上記の例では、こんなふうにかきます。

SELET NYUSYANEN,MAX(KYUYO) FROM SHAIN_TBL WHERE KYOYU_SYUBETU=0 GROUP BY NYUSYANEN;

MAXやMIN,COUNTのような、複数レコードを集めて、何か操作数ものをSQL集合関数とよびます。SQL集合関数は、GROUP BYがあれば、グループごとにまとめて(GROUP BYで指定された項目の値が同じもの同士でまとめて)、その中で集合関数の操作をします。
 もし、GROUP BYがなければ、全部が対象になります。

たとえばMAX(KYUYO)で、
SELET MAX(KYUYO) FROM SHAIN_TBL WHERE KYOYU_SYUBETU=0;
とかくと、前レコードのなかでの最高の給与を示します。

まとめるとGROUP BY句は

SELECT SQL集合関数(,項目名・・・) FROM テーブル名 WHERE 条件式 GROUP BY 項目名




■HAVING

 で、ここで、入社年毎にまとめ、平均月給(AVG)を求めるが、その平均給与が30万円以上の場合のみだす・・という場合、AVG(KYUYO)に対して、30万以上か?と聞くことになります。
 で、じゃあ、これをWHERE句にかいていいか。。。というと困ります。

 集合関数にはCOUNTなどもあるのですが、COUNTの場合、まずWHERE句を処理したもののCOUNTをとりたいわけです(月給の人の人数とか)。そうすると。。

 WHERE句の処理→GROUP BY句の処理

とすすみますので、GROUP BY句で初めてもとまるSQL集合関数の値、MAXやMIN、COUNTは、WHEREのところでは、求められません。
どーしましょー

というので、HAVING句があります。
これは、GROUP BY句を行った後にもとまる、SQL集合関数の値を使った条件を書きます。

つまり、

 WHERE句の処理→GROUP BY句の処理→HAVING句の処理

とすすみます。
上記の平均月給30万以上の入社年度だと、

SELET NYUSYANEN,AVG(KYUYO) FROM SHAIN_TBL WHERE KYOYU_SYUBETU=0 GROUP BY NYUSYANEN HAVING AVG(KYUYO) >= 300000;

となります。

まとめるとHAVING句は

SELECT SQL集合関数(,項目名・・・) FROM テーブル名 WHERE 条件式 GROUP BY 項目名 HAVING 条件式

です。




 ということで、次回もSELECTの続き、主に2つ以上の表についてです。




  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする