Alma Core Pro かんたんSQL講座

第2回:WHERE句の応用(AND / OR / LIKE で欲しいデータを一本釣りする技術)

1. WHERE句ってなに?(データのふるい分け)

第1回ではテーブルから列を取り出す方法を学びました。しかし、データベースには何十万頭ものデータが入っているため、全件を取り出すと画面が埋め尽くされてしまいます。

そこで活躍するのが WHERE(ウェア)です。WHEREは、巨大なデータの中から**「自分の欲しい条件に当てはまる馬だけを通すフィルター(ふるい)」**の役割を果たします。

🍽️ たとえば、レストランの注文で言うと:

「メニュー表の中から、【カロリーが500kcal以下】 の料理だけを持ってきて!」

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

FROM 【kol_stride】 から、WHERE 【senko >= 55.0】(先行力が55以上)の馬だけを持ってきて!」

2. 「AND(かつ)」と「OR(または)」の基本実行例

条件を2つ以上組み合わせたいときに使うのが ANDOR です。

① AND(かつ)の実行例

先行力55以上で、なおかつ追走力も50以上ある馬(両方の条件をクリアした馬だけ)を抽出します。

SELECT race_date AS 開催日, horse_number AS 馬番, senko AS 先行力, tsuiso AS 追走力
FROM kol_stride
WHERE race_date = '20260816'
  AND senko >= 55.0 
  AND tsuiso >= 50.0;
📋 実行結果(返りデータ例)
開催日馬番先行力追走力
202608160358.452.1
202608160756.054.3
202608161161.250.8

② OR(または)の実行例

札幌競馬場(08)か、新潟競馬場(07)のどちらかに出走している馬を抽出します。

SELECT race_date AS 開催日, venue_code AS 場コード, race_number AS R, horse_number AS 馬番
FROM kol_stride
WHERE race_date = '20260816'
  AND (venue_code = '08' OR venue_code = '07')
LIMIT 4;
📋 実行結果(返りデータ例)
開催日場コードR馬番
2026081608 (札幌)0101
2026081608 (札幌)0102
2026081607 (新潟)0101
2026081607 (新潟)0102

3. 初心者が必ずハマる「カッコ ( )」のルール & 実行結果の比較

ANDOR を同じ文の中で一緒に使うときは、**絶対に注意が必要な落とし穴**があります。
SQLには算数と同じルールがあり、**「AND は OR よりも先にくっついて計算される」**という性質を持っています。

やりたいこと: 「札幌(08)か新潟(07)で、ST指数が60以上の馬を探したい」

❌ 失敗例:カッコを忘れて実行した場合
SELECT race_date AS 開催日, venue_code AS 場, horse_number AS 馬番, st AS ST指数
FROM kol_stride
WHERE race_date = '20260816'
  AND venue_code = '08' OR venue_code = '07' AND st >= 60.0;
⚠️ 意図しない返りデータ(札幌の低指数馬まで混ざってしまう!)
開催日馬番ST指数判定
2026081607 (新潟)0564.2OK (新潟のST60以上)
2026081608 (札幌)0142.1❌ なぜかST40台の札幌馬も出てしまう!
2026081608 (札幌)0238.5❌ 札幌の全頭がヒットしてしまう!

※コンピュータが「新潟かつST60以上」を先にひとまとめにしてしまうため、札幌側は「ST指数に関係なく全頭」が表示されてしまいます。

⭕ 正しい例:ORをカッコ ( ) で囲んで実行した場合
SELECT race_date AS 開催日, venue_code AS 場, horse_number AS 馬番, st AS ST指数
FROM kol_stride
WHERE race_date = '20260816'
  AND (venue_code = '08' OR venue_code = '07') 
  AND st >= 60.0;
✨ 正しい返りデータ(札幌・新潟両方のST60以上だけが抽出!)
開催日馬番ST指数判定
2026081608 (札幌)1165.8⭕ 札幌のST60以上
2026081607 (新潟)0564.2⭕ 新潟のST60以上
2026081608 (札幌)0361.0⭕ 札幌のST60以上

(venue_code = '08' OR venue_code = '07') とカッコで囲むことで、「札幌か新潟のどちらかで、かつST60以上」という正しい結果になります。

4. 複数指定をスッキリ書く「IN句」の実行例

競馬場を3つ以上指定したいとき、OR を何度も書くのは大変です。
そんなときは IN(イン)を使うと、ひとまとめにスッキリ記述できます。

IN句を使った実行例

札幌(08)・新潟(07)・小倉(03)の3場から、ST指数62以上の馬を一括抽出します。

SELECT race_date AS 開催日, venue_code AS 場, race_number AS R, horse_number AS 馬番, st AS ST指数
FROM kol_stride
WHERE race_date = '20260816'
  AND venue_code IN ('08', '07', '03')
  AND st >= 62.0
ORDER BY st DESC;
📋 実行結果(返りデータ例)
開催日R馬番ST指数
2026081608 (札幌)110566.4
2026081603 (小倉)100264.8
2026081607 (新潟)111463.1

5. あいまい検索の魔法「LIKE」とワイルドカード「%」

「馬名の一部しか覚えていない」「特定の冠名の馬を全部集めたい」「2026年8月のデータを全部見たい」というときは、イコール(=)の代わりに LIKE と記号 %(何でもありのジョーカー記号)を使います。

① 前方一致(ダノンで始まる馬)の実行例

SELECT horse_name AS 馬名, birth_year AS 生年, sire_horse_name AS 父馬名
FROM kol_uma
WHERE horse_name LIKE 'ダノン%'
LIMIT 3;
📋 実行結果(返りデータ例)
馬名生年父馬名
ダノンプレミアム2015ディープインパクト
ダノンキングリー2016ディープインパクト
ダノンザキッド2018ジャスタウェイ

② 部分一致(父馬名に「エピファネイア」を含む馬)の実行例

SELECT horse_name AS 馬名, sire_horse_name AS 父馬名, owner_name AS 馬主
FROM kol_uma
WHERE sire_horse_name LIKE '%エピファネイア%'
LIMIT 3;
📋 実行結果(返りデータ例)
馬名父馬名馬主
デアリングタクトエピファネイアノルマンディーサラブレッドレーシング
エフフォーリアエピファネイアキャロットファーム
サークルオブライフエピファネイア飯田正剛

③ 年月指定(2026年8月の全開催日)の実行例

SELECT DISTINCT race_date AS 開催日
FROM kol_stride
WHERE race_date LIKE '202608%'
ORDER BY race_date ASC;
📋 実行結果(返りデータ例)
開催日
20260801
20260802
20260808
... 他(8月の土日祝日が一覧表示されます)

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

以下の枠内のSQLをコピーし、Alma Core Pro の入力欄に貼り付けて ▶ SQL実行📊 Excel用コピー (TSV) をお試しください。

レシピ 1 2026年8月開催の「札幌・新潟」からST指数上位馬(61以上)を一括抽出

SELECT 
    race_date AS 開催日,
    venue_code AS 場コード,
    race_number AS R,
    horse_number AS 馬番,
    st AS ST指数,
    senko AS 先行力,
    tsuiso AS 追走力,
    bias AS バイアス
FROM kol_stride
WHERE race_date LIKE '202608%'
  AND venue_code IN ('08', '8', '07', '7')
  AND st >= 61.0
ORDER BY race_date DESC, st DESC
LIMIT 30;
CASE 1 Excel貼り付け結果

札幌・新潟開催からST指数61以上の実力馬が高指数順に綺麗に抽出されます

レシピ 2 競走馬マスタ(kol_uma)から特定血統・冠名の馬を検索

SELECT 
    horse_name AS 馬名,
    birth_year AS 生年,
    sire_horse_name AS 父馬名,
    dam_horse_name AS 母馬名,
    dam_sire_horse_name AS 母父馬名,
    owner_name AS 馬主
FROM kol_uma
WHERE horse_name LIKE 'ダノン%'
   OR sire_horse_name LIKE '%エピファネイア%'
LIMIT 25;
CASE 2 Excel貼り付け結果

エピファネイア産駒やダノン冠名馬の血統構成と馬主一覧が一目瞭然になります

レシピ 3 展開の主役!「快速逃げ馬」または「強烈な追込馬」を両面スクリーニング

SELECT 
    race_date AS 開催日,
    venue_code AS 場,
    race_number AS R,
    horse_number AS 馬番,
    st AS ST指数,
    senko AS 先行力,
    shunpatsu AS 瞬発力,
    bias AS バイアス
FROM kol_stride
WHERE race_date = '20260816'
  AND (senko >= 60.0 OR shunpatsu >= 65.0)
ORDER BY CAST(race_number AS INTEGER) DESC, st DESC;
CASE 3 Excel貼り付け結果

前残り候補の逃げ馬と、大外一気候補の追込馬が一覧で把握できます

7. WHERE句でエラーを出さないための3つの注意点

注意点 やってしまいがちなミス 正しい書き方・対策
① 文字列と数字の区別 WHERE senko >= '55.0'
WHERE race_date = 20260823
日付や文字は '20260823' のように**シングルクォーテーションで囲む**。指数などの数字は**囲まずにそのまま書く**のが原則です。
② 全角パーセントの混入 LIKE 'ダノン%'(全角の%) ワイルドカード記号は必ず**半角の %** を使ってください。全角だと文字そのものとして検索されてしまいます。
③ カッコの開閉ペア不足 WHERE (venue_code = '08' OR venue_code = '07' カッコを開いたら(()、必ず同じ数だけ閉じる())必要があります。