そういえば、このBlogのカテゴリー、日常・コンピュータ・Linux・電気・記録となってるわけですが、
よく考えるとツッコミどころが多いな。だからといって改めないが。
この中で特異なのはLinuxだろう。実際はLinux言う割にはPHPの話をしたりむちゃくちゃだな。
そしてLinuxはコンピュータの一部だろと。まぁそうなんだけど特に多くなりそうだったから。
まぁ特にLinuxと関係ない話はコンピュータということで。
そして今日もちょっとLinuxに関係ある話でMySQLのこと。だからLinuxカテゴリー。
ところでCやらC#でプログラムを書くのは数学のような書き方をするな。
int a,b,c,d;
a=10;
b=20;
c=a+b;
d=foo(a,b)
最後のにしても数学にも多変数関数っていうのがありますからね。f(x,y)とか。
数学の書き方すると記号と文字の組み合わせなのでシンプルでよろしいね。ただ演算子が複雑でたまらん。数学の世界ではd/dxも演算子かも。
これはこれで1ついいのだが、文章を書くようにプログラムを書くのも1つだろう。
BASICでもよかったがさらに地を行くZ80のニーモニックで書こう。
LD A,10h
LD B,20h
ADD A,B;
あんまり派手な機能はないからおもしろくないけど、英語の文章に似ていると言えば似てる。
LD A,10hは”I give him water.”に似てる気もする。話すように書けるというのがこういうやつのいいところか?
けど文字ばっかりでシンプルじゃない。A=0x10;の方がシンプルだな。
というのが僕の感想。僕は演算子だらけでも気持ち悪くならないから数学みたいな書き方の方が好きだな。
自作演算子あればいいのにな。w = f {dot} x;でベクトルの内積(W=F・X)、f = b {cross} i;でベクトルの外積(F=B×I)とか求められたらおもしろそうだな。
でもそんな方法はないから、w=vector.dot(f,x);やらf=vector.cross(b,i);とすることになろうか。ちょっとわかりにくい。
話はそれたけど、SQL文は英語みたいな書き方をするもので、どうも読みにくい。
それで基本情報技術者試験で出るんだな。データベースはこの手の技術者は押さえておけということだろう。
で、ちょうど前の春の試験の問題を解いててデータベースのあたりはようわからんと。
たとえばこんなSQL文
SELECT DISTINCT 部署コード FROM 社員 S1
WHERE 5 > (SELECT COUNT(S2.社員番号) FROM 社員 S2
WHERE S1.部署コード = S2.部署コード
AND S2.職務 = 'プログラマ')
(基本情報技術者試験 平成20年度春期試験 午前試験 問58 選択肢アの内容)
一体これはなんなんだと。
SELECT文はまず受け取りたい列の名前を書く。今回は部署コードらしい。
DISTINCTは重複した結果は省くという意味らしい。ALLにすると同じものが何回も返ってくると。
FROMは元の表。社員の表のことを言っているらしい。その次のS1がようわからん。仮変数のような気がするのだが、どうなんだろ。
WHEREの条件だがその次のSELECT文の答えが5未満ならよいらしい。
その次のSELECT文だが、FROMはまたしても社員、そして仮変数らしいS2、それでS1とS2で部署コードが同じであるかという話になる。
さらに、職務がプログラマであるものがWHERE文で抜き出される、これを社員番号がNULLでないのを数える。
当然社員番号がNULLなのはただの幽霊(というか問題にNULL値を取ることはないと書いてある)ので、社員数を数えることと等価だろう。
ということで、社員の所属する全ての部署、それぞれでプログラマの社員は5人以下であるか確認して当てはまれば、その部署のコードを重複削除して表示せよという意味。
こうやって読み解けばわかるなぁ。だけど混乱しそうだな。
部署コード[] ans(社員[] 社員表){
var result = System.Collections.Generic.List<部署コード>();
foreach(社員 s1 in 社員表){
if(5 > ans(s1,社員表)) result.Add(s1.部署コード);
}
return result.ToArray();
}
int ans1(社員 s1,社員[] 社員表){
var result2 = System.Collections.Generic.List<社員番号>();
foreach(社員 s2 in 社員表){
if( (s1.部署コード == s2.部署コード)||(s2.職種 == "プログラマ") ){
result2.Add(s2.社員番号);
}
}
return result2.Count;
}
イメージ的なものだが、内のSELECT文をans1メソッド、外のSELECT文をansメソッドであらわしてみた。
これだけのものがあのところに詰め込まれてると。
と、どうもめんどくさい例を挙げたけど、SQL文って面白いよねとも思うわけだ。
それで、ちょうどMySQLを使っているのだから、勉強してみるのもよかろうと思って本を借りてきた。
いろいろ表を作って遊んでみて、それでPHPのプログラムを書こうかなと。
PHPはわりとMySQLを扱いやすく出来ている。そういうライブラリが標準であるから。
けどやはりSQL文なんです。登録するのもINSERT INTO mytable VALUES (100,”foo”,”bar”)という風に書く。
というよりMySQLと話すと言った方がいいよね。
その会話文を作るお手伝いをする機能がPHPにはあるし、その会話を送る機能はPHPはすごく充実してると。
気合入れてやりますかね。