第4回:JOIN結合(出馬表 × 指数 × 競馬場マスタを合体させて自分専用の新聞を創る技術)
これまでは「1つのテーブル(本棚)」からデータを取り出していましたが、実際の競馬予想では**「競馬道の出馬表(馬名・騎手名)」**を見ながら、**「ストライドの指数(ST指数・先行力)」**を横に並べて同時に比べたいはずです。
別々のテーブルに分かれているデータを、共通のキー(開催日や馬番)を使って横にドッキングさせる魔法が JOIN(ジョイン:結合)です。Excelで言うと「VLOOKUP関数」や「XLOOKUP関数」と全く同じ役割を果たします。
「【出馬表(馬名と騎手が書いてある紙)】」の右側に、「【指数表(各馬の能力値が書いてある紙)】」を、同じ馬番同士でピタッと重ねてホチキス留めするようなものです。
「FROM kol_den2(出馬表) に、LEFT JOIN kol_stride(指数表) を同じ馬番で合体させて持ってきて!」
データベースでは、データの重複を防ぎ高速に動かすために、役割ごとにテーブルが綺麗に分けられています。
| テーブル名 | 入っている主なデータ | テーブルの役割 |
|---|---|---|
kol_den2 |
レース日、場コード、R、馬番、馬名、騎手名、斤量 | JRA公式の出馬表データ |
kol_stride |
レース日、場コード、R、馬番、ST指数、先行力、追走力、瞬発力 | ストライド競馬新聞の独自指数データ |
mst_venue |
場コード(08)、競馬場名(札幌) | 数字コードを日本語の場名に直すマスタ表 |
kol_uma |
馬コード、馬名、父馬名、母父馬名、馬主名 | 全競走馬の血統マスタ |
テーブルを合体させるときは、SQLが長くなって見づらくなるのを防ぐために、テーブルに**1文字の「あだ名」**を付けます。
kol_den2 d ➔ 出馬表(den2)なので頭文字の dkol_stride s ➔ ストライド(stride)なので頭文字の smst_venue v ➔ 競馬場(venue)なので頭文字の vkol_uma u ➔ 競走馬(uma)なので頭文字の u※項目を指定するときは、d.horse_name(出馬表の馬名)、s.st(ストライドのST指数)のように**「あだ名.項目名」**と書くことで、どのテーブルの列かを明確にします。
どの馬とどの指数を合体させるかを指定するのが ON(オン)です。
競馬データでは「馬番」だけを一致させると別の日のレースの馬と混ざってしまうため、**「日付・競馬場・レース番号・馬番」の4つすべてが一致するデータ同士をガッチャンコします**。
FROM kol_den2 d
LEFT JOIN kol_stride s
ON d.race_date = s.race_date
AND d.venue_code = s.venue_code
AND d.race_number = s.race_number
AND d.horse_number = s.horse_number
結合には主に2種類ありますが、競馬予想では**「LEFT JOIN」を使っておけば99%間違いありません**。
| 結合の種類 | 仕組み | 使いどころ |
|---|---|---|
| LEFT JOIN (基本推奨) |
左側(出馬表)の馬を1頭も削らず全頭残す。指数がまだ配信されていない馬がいても、指数欄が空欄になるだけで出馬表からは消えません。 | 通常はこちらを使用。出走全頭を網羅した出馬表を作るとき。 |
| INNER JOIN (完全一致) |
出馬表と指数の両方にデータが揃っている馬だけを残し、片方にしかない馬は自動的に消去します。 | 「指数が算出されている馬だけをランキング分析したい」とき。 |
出馬表(kol_den2)に場所マスタ(mst_venue)を結合するだけで、数字の「08」が自動的に「札幌」に変換されて出力されます[cite: 11]。
SELECT
d.race_date AS 開催日,
v.venue_name AS 競馬場,
d.race_number AS R,
d.horse_number AS 馬番,
d.horse_name AS 馬名
FROM kol_den2 d
LEFT JOIN mst_venue v
ON d.venue_code = v.venue_code
WHERE d.race_date = '20260816' AND d.venue_code IN ('08', '8') AND d.race_number = '11'
LIMIT 3;
| 開催日 | 競馬場 | R | 馬番 | 馬名 |
|---|---|---|---|---|
| 20260816 | 札幌 | 11 | 01 | オニャンコポン |
| 20260816 | 札幌 | 11 | 02 | イガッチ |
| 20260816 | 札幌 | 11 | 03 | ピンクジン |
以下の枠内のSQLをコピーし、Alma Core Pro の入力欄に貼り付けて ▶ SQL実行 ➔ 📊 Excel用コピー (TSV) をお試しください。
レシピ 1 出馬表 + 競馬場マスタ + ストライド指数の完全合体(カスタム出馬表)
札幌メインレース(11R)を対象に、馬名・騎手名とストライド指数を一挙統合したカスタム競馬新聞です。
SELECT
d.race_date AS 開催日,
v.venue_name AS 競馬場,
d.race_number AS R,
d.horse_number AS 馬番,
d.horse_name AS 馬名,
d.jockey_name AS 騎手,
s.st AS ST指数,
s.senko AS 先行力,
s.tsuiso AS 追走力,
s.shunpatsu AS 瞬発力,
s.bias AS バイアス
FROM kol_den2 d
LEFT JOIN mst_venue v
ON d.venue_code = v.venue_code
LEFT JOIN kol_stride s
ON d.race_date = s.race_date
AND d.venue_code = s.venue_code
AND d.race_number = s.race_number
AND d.horse_number = s.horse_number
WHERE d.race_date = '20260816' AND d.venue_code IN ('08', '8') AND d.race_number = '11'
ORDER BY CAST(d.horse_number AS INTEGER) ASC;
競馬場マスタから「札幌」が自動結合され、馬名・騎手・各指数が完璧に並んだ出馬表
レシピ 2 当日の全競馬場メインレース(11R)からST指数60以上の実力馬を横断抽出
mst_venue と結合しているため、どの競馬場(札幌・新潟・小倉など)の高指数馬かが漢字で一目瞭然になります。
SELECT
d.race_date AS 開催日,
v.venue_name AS 競馬場,
d.race_number AS R,
d.horse_number AS 馬番,
d.horse_name AS 馬名,
d.jockey_name AS 騎手,
s.st AS ST指数,
s.senko AS 先行力,
s.tsuiso AS 追走力
FROM kol_den2 d
LEFT JOIN mst_venue v
ON d.venue_code = v.venue_code
INNER JOIN kol_stride s
ON d.race_date = s.race_date
AND d.venue_code = s.venue_code
AND d.race_number = s.race_number
AND d.horse_number = s.horse_number
WHERE d.race_date = '20260816'
AND d.race_number = '11'
AND s.st >= 60.0
ORDER BY s.st DESC;
各場のメインレースからST指数60以上の実力馬を能力順にスクリーニング
レシピ 3 圧巻の4テーブル結合(出馬表 × 競馬場 × 指数 × 競走馬血統マスタ)
出馬表・場所名・指数に加えて、競走馬マスタ(kol_uma)から「父馬名」「母父馬名」まで合体させた最強データシートです。
SELECT
d.race_date AS 開催日,
v.venue_name AS 競馬場,
d.race_number AS R,
d.horse_number AS 馬番,
d.horse_name AS 馬名,
u.sire_horse_name AS 父馬名,
u.dam_sire_horse_name AS 母父馬名,
d.jockey_name AS 騎手,
s.st AS ST指数,
s.senko AS 先行力,
s.shunpatsu AS 瞬発力
FROM kol_den2 d
LEFT JOIN mst_venue v
ON d.venue_code = v.venue_code
LEFT JOIN kol_stride s
ON d.race_date = s.race_date
AND d.venue_code = s.venue_code
AND d.race_number = s.race_number
AND d.horse_number = s.horse_number
LEFT JOIN kol_uma u
ON d.horse_code = u.horse_code
WHERE d.race_date = '20260816' AND d.venue_code IN ('08', '8') AND d.race_number = '11'
ORDER BY CAST(d.horse_number AS INTEGER) ASC;
競馬場・馬名・血統・騎手・指数が1行に集約された予想データシート
お疲れ様でした! 第1回から第4回までの学習により、あなたは競馬データ分析に必要なSQLスキルを完全に習得しました。
SELECT & AS(欲しい項目を日本語見出しで自由自在に抽出)WHERE(AND / OR / LIKE による高精度な条件スクリーニング)GROUP BY & 集計関数(コース別・種牡馬別・枠番別の統計集計)JOIN(出馬表・マスタ・指数・血統の完全統合によるオリジナル新聞生成)これらのクエリを組み合わせれば、市販の競馬ソフトでは見られない独自の切り口で、勝率の高い軸馬や穴馬を瞬時に発見することができます。