第2回:WHERE句の応用(AND / OR / LIKE で欲しいデータを一本釣りする技術)
第1回ではテーブルから列を取り出す方法を学びました。しかし、データベースには何十万頭ものデータが入っているため、全件を取り出すと画面が埋め尽くされてしまいます。
そこで活躍するのが WHERE(ウェア)です。WHEREは、巨大なデータの中から**「自分の欲しい条件に当てはまる馬だけを通すフィルター(ふるい)」**の役割を果たします。
「メニュー表の中から、【カロリーが500kcal以下】 の料理だけを持ってきて!」
「FROM 【kol_stride】 から、WHERE 【senko >= 55.0】(先行力が55以上)の馬だけを持ってきて!」
条件を2つ以上組み合わせたいときに使うのが AND と OR です。
先行力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;
| 開催日 | 馬番 | 先行力 | 追走力 |
|---|---|---|---|
| 20260816 | 03 | 58.4 | 52.1 |
| 20260816 | 07 | 56.0 | 54.3 |
| 20260816 | 11 | 61.2 | 50.8 |
札幌競馬場(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 | 馬番 |
|---|---|---|---|
| 20260816 | 08 (札幌) | 01 | 01 |
| 20260816 | 08 (札幌) | 01 | 02 |
| 20260816 | 07 (新潟) | 01 | 01 |
| 20260816 | 07 (新潟) | 01 | 02 |
AND と OR を同じ文の中で一緒に使うときは、**絶対に注意が必要な落とし穴**があります。
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指数 | 判定 |
|---|---|---|---|---|
| 20260816 | 07 (新潟) | 05 | 64.2 | OK (新潟のST60以上) |
| 20260816 | 08 (札幌) | 01 | 42.1 | ❌ なぜかST40台の札幌馬も出てしまう! |
| 20260816 | 08 (札幌) | 02 | 38.5 | ❌ 札幌の全頭がヒットしてしまう! |
※コンピュータが「新潟かつST60以上」を先にひとまとめにしてしまうため、札幌側は「ST指数に関係なく全頭」が表示されてしまいます。
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指数 | 判定 |
|---|---|---|---|---|
| 20260816 | 08 (札幌) | 11 | 65.8 | ⭕ 札幌のST60以上 |
| 20260816 | 07 (新潟) | 05 | 64.2 | ⭕ 新潟のST60以上 |
| 20260816 | 08 (札幌) | 03 | 61.0 | ⭕ 札幌のST60以上 |
※(venue_code = '08' OR venue_code = '07') とカッコで囲むことで、「札幌か新潟のどちらかで、かつST60以上」という正しい結果になります。
競馬場を3つ以上指定したいとき、OR を何度も書くのは大変です。
そんなときは 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指数 |
|---|---|---|---|---|
| 20260816 | 08 (札幌) | 11 | 05 | 66.4 |
| 20260816 | 03 (小倉) | 10 | 02 | 64.8 |
| 20260816 | 07 (新潟) | 11 | 14 | 63.1 |
「馬名の一部しか覚えていない」「特定の冠名の馬を全部集めたい」「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;
| 馬名 | 父馬名 | 馬主 |
|---|---|---|
| デアリングタクト | エピファネイア | ノルマンディーサラブレッドレーシング |
| エフフォーリア | エピファネイア | キャロットファーム |
| サークルオブライフ | エピファネイア | 飯田正剛 |
SELECT DISTINCT race_date AS 開催日
FROM kol_stride
WHERE race_date LIKE '202608%'
ORDER BY race_date ASC;
| 開催日 |
|---|
| 20260801 |
| 20260802 |
| 20260808 |
| ... 他(8月の土日祝日が一覧表示されます) |
以下の枠内の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;
札幌・新潟開催から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;
エピファネイア産駒やダノン冠名馬の血統構成と馬主一覧が一目瞭然になります
レシピ 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;
前残り候補の逃げ馬と、大外一気候補の追込馬が一覧で把握できます
| 注意点 | やってしまいがちなミス | 正しい書き方・対策 |
|---|---|---|
| ① 文字列と数字の区別 | WHERE senko >= '55.0'WHERE race_date = 20260823 |
日付や文字は '20260823' のように**シングルクォーテーションで囲む**。指数などの数字は**囲まずにそのまま書く**のが原則です。 |
| ② 全角パーセントの混入 | LIKE 'ダノン%'(全角の%) |
ワイルドカード記号は必ず**半角の %** を使ってください。全角だと文字そのものとして検索されてしまいます。 |
| ③ カッコの開閉ペア不足 | WHERE (venue_code = '08' OR venue_code = '07' |
カッコを開いたら(()、必ず同じ数だけ閉じる())必要があります。 |