出馬表を作ってGUIツールとMySQLの2つを一気に理解する

プログラムコードのイメージ画像

皆さんおはようございます、こんにちは、こんばんは.REDです。私はGUIツールは勿論
データベースもプログラムも、いまだに初心者です。無論プログラムなどは
コピペプログラマーですので、人に何か教えれる立場にないことも理解しています。

しかし、この記事をご覧になっている馬券師の方も私と同じように競馬ソフトを
作成してみたいという初心者の方が居るかも知れません。
私も壁に当たりましたが、初心者が競馬ソフトを作成するのには壁があるように思います。

正しい伝え方なのかは自信がありませんが、「データベースがあっても何をすればいいか分からない。」という方のお力になれればという思いで、恐れずこの記事を書くことにしました。不備などあればご指摘いただけると嬉しいです。

SPONSORED LINK

競馬ソフトを作成する時に感じる壁

さて、初心者が競馬ソフトを作成するには次のような壁があります。

  • GUIツールの使い方を勉強する
  • そもそもリレーショナルデータベースって何?
  • MySQLのルールや関数、使い方などを勉強する
  • ソフト化する時に必要なC#などの勉強
  • JRA-VANの仕様書とにらめっこ
  • その他、1つ1つ、色々勉強

全て理解しなくてもいいのですが、データを弄れるようになるまで
それ相応の時間が必要になると思います。
私には、これが結構な壁となりました。

私はせっかちです。カンニングしながら物を覚えるタイプです。
ですので、この記事はデータベースの勉強を始めたばかりの私に見せてやりたい
内容に仕上げたいと思います。長文になると思いますが、お付き合いください。

データベース初心者の馬券師がこの記事を見て、
「なんだデータベース簡単だな」って思って頂けるように お届けします!

SPONSORED LINK

リレーショナルデータベースとGUIツール

では、早速簡単な出馬表を作っていきましょう。
データベース構築は済みましたね?
まだだという方は、先にデータベース構築・データの取り込みを行ってください。

GUIツールの使い方

GUIツールを起動させてください。A5:SQL Mk-2で説明します。

A5:SQL Mk-2の起動後の画面

図解1 : A5:SQL Mk-2の起動後の画面
  1. pckeibaをクリックし、データベースログインしてください。
  2. ここをクリックすればテーブルが開きます。(今は飛ばします)
  3. localhost / pckeibaを選択してください。
  4. リレーショナルデータベースのアイコンをクリックしてください。

クエリデザイナの新しいウインドが開きましたね?

クエリーデザイナーの画面

図解2 : テーブルをドラッグアンドドロップします。
  1. pckeibaをダブルクリックしてください。
  2. Tablesをダブルクリックしてください。
  3. テーブル一覧が表示されます。
  4. テーブルをドラッグアンドドロップさせた状態

リレーショナルデータベースの意味

では、テーブル一覧の中から

  • jvd_race_shosai
  • jvd_umagoto_race_joho

を4の画面にドラッグアンドドロップして表示させてください。

表示させましたら
jvd_race_shosaiRACE_CODE
jvd_umagoto_race_johoRACE_CODE
リレーション(接続)してください。

ドラッグアンドドロップで接続できます。
テーブルとテーブルを接続する = これがリレーションデータベースといわれる理由です。

出馬表に必要なテーブルを用意する

以下のテーブルを探して4にドラッグアンドドロップしてください。
やり方は分かりますよね?
以下の画像の状態にリレーションしてください。

リレーションした画像

図解3 : 必要なテーブル同士をリレーションする。
  1. jvd_race_shosaiRACE_CODE
    jvd_umagoto_race_johoRACE_CODEをリレーションします。
  2. jvd_umagoto_race_johoSEIBETSU_CODE
    jvd_seibetsu_codeCODEをリレーションします。
  3. jvd_race_shosaiRACE_CODE
    jvd_bataijuRACE_CODEをリレーションします。
  4. jvd_umagoto_race_johoUMABAN
    jvd_bataijuUMABANをリレーションします。
  5. jvd_umagoto_race_johoKETTO_TOROKU_BANGO
    jvd_kyosoba_masterKETTO_TOROKU_BANGOをリレーションします。

次に、必要な情報にチェックを入れていきます。以下の画像の状態にしてください。

必要な情報にチェックを入れた画像

図解4 : 必要な情報にチェックマークを入れる

順番にチェックを入れてください。

  1. jvd_umagoto_race_johoWAKUBAN
  2. jvd_umagoto_race_johoUMABAN
  3. jvd_seibetsu_codeCONTENT
  4. jvd_umagoto_race_johoBAREI
  5. jvd_umagoto_race_johoBATAIJU
  6. jvd_bataijuBATAIJU
  7. jvd_umagoto_race_johoZOGEN_FUGO
  8. jvd_bataijuZOGEN_FUGO
  9. jvd_umagoto_race_johoZOGEN_SA
  10. jvd_bataijuZOGEN_SA
  11. jvd_umagoto_race_johoBAMEI
  12. jvd_umagoto_race_johoFUTAN_JURYO
  13. jvd_umagoto_race_johoKISHUMEI_RYAKUSHO
  14. jvd_umagoto_race_johoCHOKYOSHIMEI_RYAKUSHO
  15. jvd_umagoto_race_johoBANUSHIMEI_HOJINKAKU_NASHI
  16. jvd_kyosoba_masterKETTO1_BAMEI
  17. jvd_kyosoba_masterKETTO2_BAMEI

GUIツールのありがたさ

GUIツール A5:SQL Mk-2のありがたさを分かってもらえると思います。
SQLタブを選択してください。

SQL文が表示された画面

図解5 : コードを書かなくても A5:SQL Mk-2が書いてくれる

リレーションして必要な情報にチェックを入れるだけで、
A5:SQL Mk-2がSQL文を書いてくれます。(教えてくれます。)
GUIツールすげぇ~~~! A5:SQL Mk-2の作者matsuさんに感謝です!

SQL文のいろいろ解説

自分でSQL文を書かなくても基本的なSQL文が作れてしまうのが分かれば、ハードルはかなり低くなりますね。次にSQL文の簡単な説明をします。ここまでの作業が間違えていなければ、SQL文は次のようになっているはずです。

SELECT
  pckeiba.jvd_umagoto_race_joho.WAKUBAN
  , pckeiba.jvd_umagoto_race_joho.UMABAN
  , pckeiba.jvd_seibetsu_code.CONTENT
  , pckeiba.jvd_umagoto_race_joho.BAREI
  , pckeiba.jvd_umagoto_race_joho.BATAIJU
  , pckeiba.jvd_bataiju.BATAIJU AS BATAIJU1
  , pckeiba.jvd_umagoto_race_joho.ZOGEN_FUGO
  , pckeiba.jvd_bataiju.ZOGEN_FUGO AS ZOGEN_FUGO1
  , pckeiba.jvd_umagoto_race_joho.ZOGEN_SA
  , pckeiba.jvd_bataiju.ZOGEN_SA AS ZOGEN_SA1
  , pckeiba.jvd_umagoto_race_joho.BAMEI
  , pckeiba.jvd_umagoto_race_joho.FUTAN_JURYO
  , pckeiba.jvd_umagoto_race_joho.KISHUMEI_RYAKUSHO
  , pckeiba.jvd_umagoto_race_joho.CHOKYOSHIMEI_RYAKUSHO
  , pckeiba.jvd_umagoto_race_joho.BANUSHIMEI_HOJINKAKU_NASHI
  , pckeiba.jvd_kyosoba_master.KETTO1_BAMEI
  , pckeiba.jvd_kyosoba_master.KETTO2_BAMEI 
FROM
  pckeiba.jvd_race_shosai 
  INNER JOIN pckeiba.jvd_umagoto_race_joho 
    ON pckeiba.jvd_race_shosai.RACE_CODE = pckeiba.jvd_umagoto_race_joho.RACE_CODE 
  INNER JOIN pckeiba.jvd_seibetsu_code 
    ON pckeiba.jvd_umagoto_race_joho.SEIBETSU_CODE = pckeiba.jvd_seibetsu_code.CODE 
  INNER JOIN pckeiba.jvd_bataiju 
    ON pckeiba.jvd_race_shosai.RACE_CODE = pckeiba.jvd_bataiju.RACE_CODE 
    AND pckeiba.jvd_umagoto_race_joho.UMABAN = pckeiba.jvd_bataiju.UMABAN 
  INNER JOIN pckeiba.jvd_kyosoba_master 
    ON pckeiba.jvd_umagoto_race_joho.KETTO_TOROKU_BANGO = pckeiba.jvd_kyosoba_master.KETTO_TOROKU_BANGO

SQL文を説明する画像

図解6 : SQL文は理解すると難しくない

上記のSQL文の画像に、それぞれ色を付けました。

  • 選択した情報
  • 基になるテーブル
  • テーブル同士を接続するリレーション

のSQL文になります。

SQLを実行してみよう

では、実際に作ったSQLを実行してみましょう。
実行タブを選択し、緑のPLAYアイコンをクリックしてください。

SQLの実行画面

図解7 : SQLの実行結果が表示される

SQLの実行結果が表示されました。
ただ、このままでは全てのデータが表示されてしまい、出馬表としては使いにくいですね。
日付・競馬場・レース番号を指定してみましょう。

SQLタブを選択し、以下のSQL文を 末尾に追加してください。

WHERE 1 = 1 
  AND pckeiba.jvd_race_shosai.KAISAI_NENGAPPI = '2015-07-05' 
  AND pckeiba.jvd_race_shosai.KEIBAJO_CODE = '02' 
  AND pckeiba.jvd_race_shosai.RACE_BANGO = '11'
ORDER BY pckeiba.jvd_umagoto_race_joho.UMABAN ASC

SQL文を追加して、データの指定をした画像

図解8 : 指定した日・競馬場・レースだけデータが表示される
  • WHERE 1 = 1 :取得するデータを選択しているSQL文
  • ORDER BY:ASCで馬番順に並べ替えをしているSQL文

SQL文を追加したら、再度SQLの実行をしてみましょう。
2015年7月5日、函館競馬場、11レースのデータのみ表示されたと思います。

SQL文を簡潔にしよう

慣れてくるとterapadなどで一括置き換えできますが、SQL文に慣れるのが目的なので
理解できるまでは手作業で行ってください。
HTMLと同じで、自然と理解できるようになります。

SQL文から pckeiba. を全て削除してください。
pckeiba.はデータベースの名前なので必要ありません。
早く理解する為にも、自分で見やすいようにSQL文を並べ替えてください。

今後の為にも、敢えてコピペできるコードは張りません。
時間が掛かっても上記の2つを行ってください。以下のようになるはずです。

SQL文からデータベース名を削除して見やすいようにSQL文を並べ替えた状態の画像

図解9 : カンマの不足や余分でエラーが出やすいです

これで少しSQL文が見やすくすっきりしましたね。
では、再度SQLを実行してみてください。
正しく書けていないとエラーが出ますので、エラーが出たら悪いところを修正してください。

SQL文が正しければ、必ずデータが表示されるはずです。

さらに SQL文を簡潔にしよう

これを繰り返し行うことで、SQLの理解は加速します。
SQL文を読みやすくすることでSQL文を改造?しやすくなりますし、
簡単なSQL文なら手打ちで行うことができるようになります。
FROM から INNER JOIN までを下記に張り替えてください。

FROM jvd_race_shosai RA
INNER JOIN jvd_umagoto_race_joho UM ON jvd_race_shosai.RACE_CODE = jvd_umagoto_race_joho.RACE_CODE 
INNER JOIN jvd_seibetsu_code SC ON jvd_umagoto_race_joho.SEIBETSU_CODE = jvd_seibetsu_code.CODE 
INNER JOIN jvd_bataiju ON BT jvd_race_shosai.RACE_CODE = jvd_bataiju.RACE_CODE AND jvd_umagoto_race_joho.UMABAN = jvd_bataiju.UMABAN 
INNER JOIN jvd_kyosoba_master KM ON jvd_umagoto_race_joho.KETTO_TOROKU_BANGO = jvd_kyosoba_master.KETTO_TOROKU_BANGO

追加したSQL文の画像

図解10 : 追加されたのは □ で囲まれた部分です

今回追加したのは四角で囲まれた部分です。
線を引いた部分はそのままに、その他のテーブル名を全て
四角で囲まれたテーブル名に変更してください。

  • jvd_race_shosai は全て RA
  • jvd_umagoto_race_joho は全て UM
  • jvd_seibetsu_code は全て SC
  • jvd_bataiju は全て BT
  • jvd_kyosoba_master は全て KM

書き換えが終わりましたら、SQLを実行してください。
間違いがなければデータが表示されるはずです。(・∀・)ニヤニヤ

スッキリしたSQL文

これでSQL文は、かなりスッキリと見やすいものに変わりましたね。

スッキリしたSQL文

図解11 : だいぶ見やすくなりましたね

どうですか?SQLを実行して、ちゃんとデータが表示されましたか?

何?エラーばかり出る?おかしいなー・・・って、

それもそのはず。先ほどコピペしてもらったSQL文には1つ間違いがあります。
どこだか分かりますか?

(゚皿゚)_┳※・・・・・・・・・・ターン・・・・・・・・(;゚ロ゚)ヒー・・・・・・・・・・・⊃

ヒー! すみませんすみません。BTの位置が ONの後ろに来てますよね。
前に持ってくれば動くはずです。

いや、もうね、今更だけど何でこんな面倒くさい記事書き出したんだろうと・・・
やってらんねーなと(笑)

見る人も馬券のことや競馬のことなら楽しんでもらえるかもしれないけど、
ブログ書き始めてから、ずっとクソつまんねーデータベースの構築やら、
誰が興味あんねんって思ってね(笑)とほほ

文字列を結合しよう

気を取り直しまして、表示されたデータの性別と馬齢をひとまとめにしてみましょう。

SC.CONTENT,
UM.BAREI,
 
//上記のSQL文を結合させるSQL文↓
 
CONCAT(SC.CONTENT, CAST(UM.BAREI AS CHAR)),

CONCATと CASTはGoogle先生に聞いてください。

どちらかのデータを表示させる

表示されたデータの中に、馬体重が2つ・増減符号が2つ・増減が2つありますよね?
このデータは

  • 金曜日の段階では、両方データが無い状態
  • 土曜日、日曜日の段階では、速報系データにだけデータがある状態
  • 月曜日になれば、通常データのものを利用する状態

だからです。

PC-KEIBAの速報系データのダウンロードタブに、今週の開催データのみ保存するにチェックがあれば、月曜日の段階でも、通常データ・速報系データ両方が保存されるのですが、2000年(昔の)などの馬体重は、速報系データを取得することはできません。ですので、データがあるほうからデータを表示させるようにします。何言ってるかわかります?^^;

UM.BATAIJU,
BT.BATAIJU AS BATAIJU1,
 
//上記のSQL文を下記に書き換えてください↓
 
CONCAT(COALESCE(CAST(BT.BATAIJU AS CHAR), CAST(UM.BATAIJU AS CHAR)), ' kg'),

  • CONCATで馬体重と kgを結合させています。
  • COALESCEで、引数の最初の非NULL値を返します。
  • 非NULL(両方にデータが無い)場合NULLを返します。
    つまりBT.BATAIJU・UM.BATAIJUのどちらかにデータがあれば、データが表示されます。
  • CASTで、ほにゃららです。(さっき調べたでしょ?( ´△`)

後は、増減符号と増減も同じようにしてください。

見出しに名前を付ける

最後に分かりやすい名前を見出しに付けましょう。
今回は分かりやすく日本語で付けてみますが、環境によって文字化けする可能性があるので
基本的にはローマ字で名前を付けるほうがいいみたいです。

UM.WAKUBAN AS 枠,

全てのデータの後に、AS ●●,を追加してください。以下の画像のようになるはずです。

見出しに名前をつけるSQL文

図解12 : 見出しに名前がついた

この記事のまとめ

説明を優先して、途中リレーションを一気に行っていますが、
通常は1つリレーションさせたら1つ必要なデータをチェックし、
SQLが正常に動くかどうか実行(確認)しながら
必要なデータを増やしていくと良いでしょう。

プロの方から見れば稚拙で分かりにくい長文になってしまった部分は否めませんが、
何からやったら良いのかが分からないという初心者の方に、
なんとなくでも流れが分かったと思っていただけたら幸いです。
全て理解する必要はありません!色々いじってたら大丈夫!

あと、JRA-VANの仕様書はコピーして何度も見直してください。
これだけはどうしようもありません。

よし!しばらくはブログ書かないぞ!(笑)

SPONSORED LINK
この記事を書いた人

この記事を書いた人.REDの似顔絵

.RED(ドットレッド)です。
よろしくお願いします。

馬券師.Redリニューアルしました。すっきりさせたかったので、現在使えないソフトの紹介ページなどの、不必要なページ削除・リンク情報・画像の更新・カテゴリの見直しなど行いました。今後もよろしくお願いします!更新は相変わらずボチボチとします(笑)

シェアしてもらえれば、励みになります。(o˘◡˘o)

フォローはこちらから(^_-)-☆

コメント

  1. makugaiber より:

    初めまして、makugaiberと申します。
    今この記事を出てる出馬表を真似てmysqlを使い出馬表を作っているのですが、日付、競馬場、レースを指定する所で、下記のエラーが出てしまいます。

    SQL : SELECT
    pckeiba.jvd_umagoto_race_joho.WAKUBAN
    , pckeiba.jvd_umagoto_race_joho.UMABAN
    , pckeiba.jvd_seibetsu_code.CONTENT
    , pckeiba.jvd_umagoto_race_joho.BAREI
    , pckeiba.jvd_umagoto_race_joho.BATAIJU
    , pckeiba.jvd_bataiju.BATAIJU AS BATAIJU1
    , pckeiba.jvd_umagoto_race_joho.ZOGEN_FUGO
    , pckeiba.jvd_bataiju.ZOGEN_FUGO AS ZOGEN_FUGO1
    , pckeiba.jvd_umagoto_race_joho.ZOGEN_SA
    , pckeiba.jvd_bataiju.ZOGEN_SA AS ZOGEN_SA1
    , pckeiba.jvd_umagoto_race_joho.BAMEI
    , pckeiba.jvd_umagoto_race_joho.FUTAN_JURYO
    , pckeiba.jvd_umagoto_race_joho.KISHUMEI_RYAKUSHO
    , pckeiba.jvd_umagoto_race_joho.CHOKYOSHIMEI_RYAKUSHO
    , pckeiba.jvd_umagoto_race_joho.BANUSHIMEI_HOJINKAKU_NASHI
    , pckeiba.jvd_kyosoba_master.KETTO1_BAMEI
    , pckeiba.jvd_kyosoba_master.KETTO2_BAMEI
    FROM
    pckeiba.jvd_race_shosai
    INNER JOIN pckeiba.jvd_umagoto_race_joho
    ON pckeiba.jvd_race_shosai.RACE_CODE = pckeiba.jvd_umagoto_race_joho.RACE_CODE
    INNER JOIN pckeiba.jvd_seibetsu_code
    ON pckeiba.jvd_umagoto_race_joho.SEIBETSU_CODE = pckeiba.jvd_seibetsu_code.CODE
    INNER JOIN pckeiba.jvd_bataiju
    ON pckeiba.jvd_race_shosai.RACE_CODE = pckeiba.jvd_bataiju.RACE_CODE
    AND pckeiba.jvd_umagoto_race_joho.UMABAN = pckeiba.jvd_bataiju.UMABAN
    INNER JOIN pckeiba.jvd_kyosoba_master
    ON pckeiba.jvd_umagoto_race_joho.KETTO_TOROKU_BANGO = pckeiba.jvd_kyosoba_master.KETTO_TOROKU_BANGO
    WHERE 1 = 1
    AND pckeiba.jvd_race_shosai.KAISAI_NENGAPPI =’2015-07-05′
    AND pckeiba.jvd_race_shosai.KEIBAJO_CODE = ’02 ‘
    AND pckeiba.jvd_race_shosai.RACE_BANGO = ’11’
    ORDER BY pckeiba.jvd_umagoto_joho.UMABAN ASC
    SQL : #42S22Unknown column ‘pckeiba.jvd_umagoto_joho.UMABAN’ in ‘order clause’
    長文で失礼します。
    mysqlは初心者なのでどう直せばいいのか分からないので出来たらご助言を宜しくお願いします。

  2. .RED より:

    makugaiberさん初めまして。当サイトを参考にしていただき、ありがとうございます。

    >mysqlは初心者なのでどう直せばいいのか分からないので出来たらご助言を宜しくお願いします。

    エラーが出ている場所はどこですか?ちゃんと確認しましょう。
    SQL : #42S22Unknown column ‘pckeiba.jvd_umagoto_joho.UMABAN’ in ‘order clause’の後に
    at line33と出てるはずです。ということは33行目にエラーが出ているのでそこを見直されてください。

    自己解決ができない時、答えを教えてもらうのは近道に感じるものですが、理解からは遠ざかります。
    トライ&エラーを繰り返し「やりたいことの実現」の為に自己解決を心がけてください。
    それが遠回りのように感じて実は一番の近道になります。文章にすると何か偉そうですね^^;
    すみません。

    がんばってください!

  3. makugaiber より:

    ご返信ありがとうございます。
    最後の行のraceが抜けていました。
    そこを直せたのですが、今度はデータがNULLというのが出ました。
    調べては見たのですが、また分かんなくなったので再度で何か心当たりがあったら教えてくれませんか。
    お手数をお掛けします。

  4. .RED より:

    この記事自体が答えになっていませんか?