Alma Core Pro かんたんSQL講座

第4回:JOIN結合(出馬表 × 指数 × 競馬場マスタを合体させて自分専用の新聞を創る技術)

1. JOIN(テーブル結合)ってなに?(ExcelのVLOOKUPと同じ!)

これまでは「1つのテーブル(本棚)」からデータを取り出していましたが、実際の競馬予想では**「競馬道の出馬表(馬名・騎手名)」**を見ながら、**「ストライドの指数(ST指数・先行力)」**を横に並べて同時に比べたいはずです。

別々のテーブルに分かれているデータを、共通のキー(開催日や馬番)を使って横にドッキングさせる魔法が JOIN(ジョイン:結合)です。Excelで言うと「VLOOKUP関数」や「XLOOKUP関数」と全く同じ役割を果たします。

📋 たとえば、書類のホチキス留めで言うと:

【出馬表(馬名と騎手が書いてある紙)】」の右側に、「【指数表(各馬の能力値が書いてある紙)】」を、同じ馬番同士でピタッと重ねてホチキス留めするようなものです。

💻 これをデータベースへの命令(SQL)に置き換えると:

FROM kol_den2(出馬表) に、LEFT JOIN kol_stride(指数表) を同じ馬番で合体させて持ってきて!」

2. なぜテーブルが分かれているの?(データの整理術)

データベースでは、データの重複を防ぎ高速に動かすために、役割ごとにテーブルが綺麗に分けられています。

テーブル名 入っている主なデータ テーブルの役割
kol_den2 レース日、場コード、R、馬番、馬名、騎手名、斤量 JRA公式の出馬表データ
kol_stride レース日、場コード、R、馬番、ST指数、先行力、追走力、瞬発力 ストライド競馬新聞の独自指数データ
mst_venue 場コード(08)、競馬場名(札幌) 数字コードを日本語の場名に直すマスタ表
kol_uma 馬コード、馬名、父馬名、母父馬名、馬主名 全競走馬の血統マスタ

3. テーブルの「あだ名(エイリアス)」と「ON(合体条件)」のルール

テーブルを合体させるときは、SQLが長くなって見づらくなるのを防ぐために、テーブルに**1文字の「あだ名」**を付けます。

よく使う「あだ名」の付け方
  • kol_den2 d ➔ 出馬表(den2)なので頭文字の d
  • kol_stride s ➔ ストライド(stride)なので頭文字の s
  • mst_venue v ➔ 競馬場(venue)なので頭文字の v
  • kol_uma u ➔ 競走馬(uma)なので頭文字の u

※項目を指定するときは、d.horse_name(出馬表の馬名)、s.st(ストライドのST指数)のように**「あだ名.項目名」**と書くことで、どのテーブルの列かを明確にします。

合体条件「ON」の超重要ルール

どの馬とどの指数を合体させるかを指定するのが 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

4. 「LEFT JOIN」と「INNER JOIN」の使い分け

結合には主に2種類ありますが、競馬予想では**「LEFT JOIN」を使っておけば99%間違いありません**。

結合の種類 仕組み 使いどころ
LEFT JOIN
(基本推奨)
左側(出馬表)の馬を1頭も削らず全頭残す。指数がまだ配信されていない馬がいても、指数欄が空欄になるだけで出馬表からは消えません。 通常はこちらを使用。出走全頭を網羅した出馬表を作るとき。
INNER JOIN
(完全一致)
出馬表と指数の両方にデータが揃っている馬だけを残し、片方にしかない馬は自動的に消去します。 「指数が算出されている馬だけをランキング分析したい」とき。

5. 場所コード(08)を漢字(札幌)に変換する基本例

出馬表(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札幌1101オニャンコポン
20260816札幌1102イガッチ
20260816札幌1103ピンクジン

6. そのまま使える!お宝抽出実践レシピ集

以下の枠内の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;
CASE 1 結合結果

競馬場マスタから「札幌」が自動結合され、馬名・騎手・各指数が完璧に並んだ出馬表

レシピ 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;
CASE 2 スクリーニング結果

各場のメインレースから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;
CASE 3 4テーブル結合結果

競馬場・馬名・血統・騎手・指数が1行に集約された予想データシート

7. 全4回の講座総括(マスターした分析スキル)

お疲れ様でした! 第1回から第4回までの学習により、あなたは競馬データ分析に必要なSQLスキルを完全に習得しました。

🏆 Alma Core Pro で身についたデータ分析スキル一覧:
  • 第1回: SELECTAS(欲しい項目を日本語見出しで自由自在に抽出)
  • 第2回: WHEREAND / OR / LIKE による高精度な条件スクリーニング)
  • 第3回: GROUP BY & 集計関数(コース別・種牡馬別・枠番別の統計集計)
  • 第4回: JOIN(出馬表・マスタ・指数・血統の完全統合によるオリジナル新聞生成)

これらのクエリを組み合わせれば、市販の競馬ソフトでは見られない独自の切り口で、勝率の高い軸馬や穴馬を瞬時に発見することができます。