今回はwikipediaのデータを使ってちょっと遊んでみました。
Wikipediaは全ての言語版において全てのデータを公開しています。
形式はsqlだったりxmlだったり、ファイルサイズもキロバイトからギガバイト(英語だとテラとか)まで様々です。
今回は、サイズもそこそこで文字化けの心配もないsimpleEnglishのwikipediaのデータを使用しました(特にこの中のこの中のcategoryというものとcategorylinkを使用しました。)。
→データはこちら:http://dumps.wikimedia.org/simplewiki/latest/
この記事で取り上げた句や関数は以下の通りです。
<導入>
- source
- describe
- select
- where
- 算術式
- between
- order by
- like
- and と or
- length
- round
- mod
どんな脈絡かと言われると非常に困ります。ごめんなさい。
sqlファイルを読み込む際は、以下のようなコマンドを使用します。
【sqlファイルの読み込み】
source filename;
そうすると以下のようにばーーーーと処理が進み、読み込みが完了します。
中身がはいっているかどうか確認します。
テーブルがどんな構造をしているのか、このようなGUIアプリではだいたいそういう機能がついていますが
コマンドでももちろんそういうものを表示するものがあります。
【テーブル構造を把握する:describe】
describe category;
このように見ていくと、とりあえずたくさん項目があるのがわかります。
簡単に、各項目がどんなことを表しているのかを整理したいと思います(相当ざっくり)。
- cat_title→カテゴリー名
- cat_page→そのカテゴリに属する記事ページの数
- cl_timestamp→記事にカテゴリーが割り振られた時間の記録
- cl_sortkey→記事名(厳密にはソートするためにある列だが、英語なので、そのまま記事名となる。例えばこれが日本語だと、「日本語」という記事に対して「にほんご」と振ってある(らしい))
(ここからはGUIアプリのSquel Proで)
【ページ数(降順)で並び替え。カテゴリー名も表示してTitleという別名で表示】
select `cat_title` Title, `cat_pages` from category order by `cat_pages` desc
別名を付けたいときは、スペースを空けて、その別名を書く。
並び替えは、order byで出来ます。デフォルトは昇順。降順にするには最後にdescをつけます。
→とにかくstub系(短い記事であんまり役に立たなさそうなもの)が多いようです。
【カテゴリー名の中に[you]という文字列を含むものを表示】
select `cat_title` from category where `cat_title` like '%you%'
likeによって比較してあげています。
%を前につけると、「you で終わる文字列(指定した文字列以前はしばりをつけない)」ということになり、逆に%を後につけると「youで始まる文字列(指定した文字列以後はしばりをつけない)」ということになります。
【カテゴリーページが100より大きいものをカテゴリー名(降順)で並び替える】
select * from category where `cat_pages`>100 order by `cat_title` desc
【タイムスタンプが2011年5月以降のものを降順で出力する】
select `cl_to` CategoryName,`cl_timestamp` from `categorylinks` where cl_timestamp > '2011-05-01 00:00:00' order by `cl_timestamp`
【上記について、2011年4月から2011年5月までに限定する】
select `cl_to` CategoryName,`cl_timestamp` from `categorylinks` where cl_timestamp between '2011-05-01 00:00:00' and '2011-04-01 00:00:00' order by `cl_timestamp`
算術式が使えます。whereは出したいレコードの制限条件を入れたいときに使います。また、数値だけでなく、日付なんかにも使うことができるようです。
また、○日〜○日みたいな間をとりたいときはbetweenが使えます。
ただし、betweenの場合は、between A and BのAとBの順番に縛りがあります。必ず、A<Bにしないとうまく動きません。
*をつけると、特定の列でなく、すべての列を表示することができます。
【カテゴリーの振られたページが100ページ以上で、かつ、
カテゴリーの名前に「phy」が含まれているものをタイトル降順で表示】
select * from category where `cat_pages`>100 and `cat_title` like '%phy%' order by `cat_title` desc
and は「かつ」、orは「もしくは」の意味を持ちます。2つ以上条件があるときには、andかorでつなぎます。
【カテゴリー名が10文字以上のものを選び出す】
select `cat_title` Title, length(`cat_title`) Length from category where length(`cat_title`) > 10
length関数を使うと文字列の長さを測ることができます。
【カテゴリーに属するページ数を四捨五入(1の位)する。
さらに、その結果を7で割って余りが0のものだけを降順表示】
select cat_id, cat_title, round(`cat_pages`,-1) PageCount from `category` where mod(round(`cat_pages`,-1),7)=0 order by PageCount desc
mod(p,q)で、pをqで割った余りを返します。
また、round(a,b)で、aを小数第b位までの数になるように四捨五入してくれます。マイナスの値を指定すると、1の位/10の位と小数以上のところを指定することになります。
また、ここでは、関数roundとmodを実践しましたが、その他にもwhere句の中で関数を「ネスト」させる(modの中に、さらにroundを入れてあげる)ということもやってみました。
-------
次回は結合や集合関数あたりを頑張ろうと思います。