メニュー

競馬予想のウマニティ

ウマニティからのお知らせ

となかい一朗さんの競馬日記

競馬 SQLでビッグデータ分析-ACCESSのFORMから回収率分析(2)

 公開 488

 前回いきなり、VBAとSQLのコードをのっけたのでハードルが上がった感じがするんじゃないかと思います。ですが、全体像が見えてないと、なかなか、個別のことを理解しにくいと思いましたので、あえて、そこから入りました。

 今回は、まずVBAとSQLを区別したうえで、SQLのSELECT文の部分について解説したいと思います。

 SQLというのは、データから必要な情報を拾ってきたり、データを更新したり、新たにデータを書き込んだりする命令のことです。
 Accessの場合、「クエリ」という機能を使っても、このSQLという単発の命令を実行できます。「このデータをとってきなさい」「このデータを削除しなさい」とこんな感じで、一つ一つ命令を出していく感じです。さらに、「マクロ」という機能で、いくつかの「クエリ」を組み合わせて実行することもできますので、SQLだけ理解していれば、ある程度のことは、「クエリ」と「マクロ」を通じて実行できます。ただし、ある程度使いこんでいくと、「マクロ」は、かなり自由度が低いので物足りなくなってきます。
 VBAは、マクロで用意されている以上の、様々なことがかなり自由にできるようになります。(例えばですが、スクレイピングという、HP上の情報を取ってくるようなこともできるようになります。)
 だから、SQL→データを扱う単発の命令、VBA→データを扱う単発の命令を制御して、もっといろいろなことを可能にする自由度の高いプログラミング というふうに理解してもらえたらいいんじゃないかと思います。クエリとマクロは、クエリがSQLを単発で動かすためにAccessが用意している機能、マクロはクエリを組み合わせて動かすためにAccessが用意している機能でVBAの簡単なもの・・・という感じでしょうか。

 さて、では、本日は、前回用いたコード中の「SELECT」文についての解説をしたいと思います。SQLの一番の基本です。
 
 一番単純な命令は、SELECT (フィールド名) FROM (フィールド名があるテーブル名) というものになります。
 例えば、RaceUmaのテーブルに入っているデータの馬名一覧を知りたいのであれば、
 「SELECT RaceUma.馬名 FROM RaceUma」 ということになります。
 テーブルに入っているすべてのフィールドのデータを見たいということになれば、「*」というのを使って、
 「SELECT * FROM RaceUma」 で見ることができます。

 しかし、昔のデータを見たいのに、いちいち全部表示して・・・というようなことはもちろんしません。
 一番基本的な抽出条件の絞り方は、上の文の最後に 「WHERE ~」という文を付け加えて、抽出するデータの範囲を指定するやり方です。

 例えば、開催年が2020年のデータを持ってきたければ、RaceUmaには、「年」というフィールドがあるので、
 「SELECT RaceUma.馬名 FROM RaceUma WHERE RaceUma.年=2020」で抽出できます。
 開催日というデータもありますが、これで指定しようという場合は、「日付/時刻型」というデータ型(テーブルを選択して、右クリックして、「デザインビュー」で開くと、Access上で、データ型が確認できます。)なので、WHERE以下は、「WHERE RaceUma.開催日 >= #2020/1/1#」 というふうに、日付を「#」で囲みます。データ型のことはまたあとで詳しく説明したいと思います。
 
 2020年で表示をしても、最新のものから古いものへとみていきたいのに、古いものが上の方に出てくる、とかであれば、さらに後ろに「order by (フィールド名) (DESC or ASC)」という並べ替えをする命令をつけます。Descが降り順(大きい方から)、Ascが昇り順(小さい方から)です。
 「SELECT RaceUma.馬名 FROM RaceUma WHERE RaceUma.年=2020 order by RaceUma.開催日 Desc」

 年毎に表示するというのは、場合によってはあるかもしれませんが、しかし、なんといっても一番よく指定する条件はレースごと・・・ということになると思います。
 RaceUmaにはRaceIDというフィールドがあります。
 「年(4桁)月(2桁)日(2桁)場コード(2桁)回次(2桁)日次(2桁)レース番号(2桁) 」 という数字なのですが、注意点が一つ。このRaceIdというフィールドは、データ型が、「短いテキスト」になっています。先ほど申し上げたとおり、データ型については、また後で説明しますが、ここでは、ダブルクォーテーションで囲んであげてください。
 例えば、2020年11月7日の東京(場コードは05) 5回開催1日目10レースだと、"2020110705050110"になります。これを指定して着順(フィールド名は、「確定着順」)で並べ替えて、馬の名前と着順と単勝オッズを表示するとかだと、

 「SELECT RaceUma.馬名,RaceUma.確定着順,RaceUma.単勝オッズ FROM RaceUma WHERE RaceUma.RaceId="2020110705050110" order by RaceUma.確定着順 Asc」

 になります。

 このあたりで、Accessのクエリに、上のをコピペして、確認してみましょう。
 上の方の「作成」→「クエリデザイン」→左上の表示のところを選択して「SQL」を押したあとでてくるところに張り付けて名前をつけて保存後、左のクエリをダブルクリックすれば、さきほど書いたSQL文を、命令として実行してくれます。

 さらに、並べ替えて上から何番目というような指定もできます。着順で並べたもののうち、上から3番目(1~3着)を指定したければ、SELECTの後ろに TOP 3 という言葉をつけたりします。

 「SELECT Top 3 RaceUma.馬名,RaceUma.確定着順,RaceUma.単勝オッズ FROM RaceUma WHERE RaceUma.RaceId=2020110705050110 order by RaceUma.確定着順 Asc」
 
 結果が画像です。(手前味噌ですが、先日大穴が当たったレースを例としてとりあげました。^^)

 とりあえず、今回はここまでです。次回以降で、Group化による集計やデータ型について付け加えていきます。

ナイス  (10)

関連キーワード

 ナイス!(10

この日記へのコメント

コメントの投稿は会員登録(無料)が必要です。
コメントはありません。

新着競馬日記

人気競馬日記


トップ予想家
U指数
凄馬
ROBOTIP