はじめてのSQL【中級編:述語について①】
こんちには。
スタッフブログ担当の岩でございます。
前回の記事では論理演算子について説明いたしました。
今回はWHERE句で使う「述語」について説明いたします。

今回はShopテーブルとSampleLikeテーブルを使って説明します。
shohin_id (商品ID) | shohin_mei (商品名) | shohin_bunrui (商品分類) | hanbai_tanka (販売単価) | shiire_tanka (仕入単価) | torokubi (登録日) |
0001 | ボールペン | 事務用品 | 100 | 50 | 2020-10-20 |
0002 | おろしがね | キッチン用品 | 500 | 350 | 2020-09-07 |
0003 | フォーク | キッチン用品 | 100 | 30 | |
0004 | 圧力鍋 | キッチン用品 | 5000 | 1000 | 2020-04-25 |
0005 | 包丁 | キッチン用品 | 8000 | | 2020-07-05 |
0006 | カッターシャツ | 衣類 | 3000 | 1500 | 2020-06-11 |
0007 | 穴あけパンチ | 事務用品 | 400 | 240 | 2020-11-27 |
0008 | Tシャツ | 衣類 | 1500 | | 2020-03-13 |
No.(番号) | string_colmn(文字列) |
01 | abcddd |
02 | dddabc |
03 | abdddc |
04 | abcdd |
05 | ddabc |
06 | abddc |
述語
述語とは、「戻り値が真理値になる」関数です。
述語の戻りはすべて真理値(TRUE、FALSE、UNKNOWN)となります。
よく使われる述語は以下の通りです。
述語 | 使い方 |
LIKE | 文字列の部分一致検索 |
BETWEEN | 範囲検索 |
IS NULL | NULLであるかの判定 |
IS NOT NULL | 非NULLであるかの判定 |
IN | ORの便利な省略形 |
EXISTS | 指定された条件にあてはまるレコード(行)が存在するか判定 |
この記事では「LIKE」、「BETWEEN」、「IS NULL」、「IS NOT NULL」について説明いたします。
LIKE述語

文字列を検索する場合、比較演算子の「=」を使うことがありますが、
これは文字列が完全に一致する場合にしか真(TRUE)となりません。
LIKE述語は文字列の部分一致検索を行うときに使います。
部分一致には大きく分けて「前方一致」、「中間一致」、「後方一致」の3種類があります。
今からSampleLikeテーブルで具体例を使って説明いたします。
●前方一致検索
SELECT *
FROM SampleLike
WHERE string_colmn LIKE 'ddd%';
前方一致とは、検索条件となる文字列が検索対象の文字列の最初に位置しているレコードだけが
選択される検索の方法です。
LIKE述語の右側で’ddd%’と指定しました。
「%」は「0文字以上の任意の文字列」を意味する特殊な記号で、
この場合は「dddではじまるすべての文字列」という意味になります。
検索結果は下記の通りとなります。
No.(番号) | string_colmn(文字列) |
02 | dddabc |
このように文字列の中に含まれる規則(今回であれば「dddを含む」という規則)に基づいて
検索することを「パターンマッチング」と呼びます。
LIKE述語を使うとパターンマッチングを記述することが可能となります。
●中間一致検索
SELECT *
FROM SmpleLike
WHERE string_colmn LIKE '%ddd%';
中間一致は検索条件となる文字列が検索対象の文字列の「どこか」に含まれていれば
レコードが選択される検索の方法です。
最初でも最後でも、真ん中でも構いません。
‘%ddd%’というように検索する文字列の最初と最後を「%」で囲むことで、
「文字列中のどこかにdddがある文字列」を表現しています。
検索結果は下記の通りとなります。
No.(番号) | string_colmn(文字列) |
01 | abcddd |
02 | dddabc |
03 | abdddc |
●後方一致検索
SELECT *
FROM SampleLike
WHERE string_colmn LIKE '%ddd';
後方一致とは前方一致の反対で、検索条件となる文字列が文字列の最後尾にある
レコードだけが選択される方法です。
検索結果は下記の通りとなります。
No.(番号) | string_colmn(文字列) |
01 | abcddd |
また、「%」の代わりに「_」(アンダーバー)を使うこともできますが、
これは「%」と違い「任意の1文字」を意味します。
例えば、「abc + 任意の2文字」で構成される文字列を検索する場合は、下記の通りに記述します。
SELECT *
FROM SampleLike
WHERE string_colmn LIKE 'abc__';
No.(番号) | string_colmn(文字列) |
04 | abcdd |
検索条件を「abc%」とすると「abcddd」と「abcdd」のふたつが選択されますが、
アンダーバーを使って文字数を制限したことで「abcdd」のみが選択されました。
BETWEEN述語

BETWEENは、範囲検索を行います。
例えば、Shopテーブルから販売単価が100円から1000円までの商品を選択する場合、
下記の通りに記述します。
SELECT shohin_id, shohin_mei, hanbai_tanka
FROM Shop
WHERE hanbai_tanka BETWEEN 100 AND 1000;
shohin_id (商品ID) | shohin_mei (商品名) | hanbai_tanka (販売単価) |
0001 | ボールペン | 100 |
0002 | おろしがね | 400 |
0003 | フォーク | 100 |
0007 | 穴あけパンチ | 500 |
BETWEENの特徴は、「100」と「1000」という両端の値も含むことです。
もし両端の値を結果に含みたくない場合は「<>」を使って書く必要があります。
SELECT shohin_id, shohin_mei, hanbai_tanka
FROM Shop
WHERE hanbai_tanka > 100
AND hanbai_tanka < 100;
shohin_id (商品ID) | shohin_mei (商品名) | hanbai_tanka (販売単価) |
0002 | おろしがね | 400 |
0007 | 穴あけパンチ | 500 |
IS NULL、IS NOT NULL
NULLの行を選択するためには「=」を使うことはできません。
IS NULLという述語を使う必要があります。
こちらの記事でも説明しております。
SELECT shohin_id, shohin_mei, shiire_tanka
FROM Shop
WHERE shiire_tanka IS NULL;
shohin_id (商品ID) | shohin_mei (商品名) | hanbai_tanka (販売単価) |
0005 | 包丁 | |
0008 | Tシャツ |
反対に、NULL以外の行を選択したければ IS NOT NULL を使います。
SELECT shohin_id, shohin_mei, shiire_tanka
FROM Shop
WHERE shiire_tanka IS NOT NULL;
shohin_id (商品ID) | shohin_mei (商品名) | hanbai_tanka (販売単価) |
0001 | ボールペン | 50 |
0002 | おろしがね | 350 |
0003 | フォーク | 30 |
0004 | 圧力鍋 | 1000 |
0006 | カッターシャツ | 1500 |
0007 | 穴あけパンチ | 240 |
まとめ
述語はSQLで抽出条件を記述するときに不可欠なものです。
以前の記事で紹介した比較演算子も述語の仲間で、正確には「比較述語」といいます。
次回は今回説明できなかった「IN」や「EXISTS」などの述語を説明いたします。
最後まで読んでくださりありがとうございました。