パソナについて
記事検索

【サンプル有】betweenを使って読みやすいSQLを書こう!

条件指定において大事な役割を果たすbetweenの使い方をサンプルデータとサンプルSQLを使いながらご説明します。

【サンプル有】betweenを使って読みやすいSQLを書こう!

条件指定において大事な役割を果たすbetweenの使い方をサンプルデータとサンプルSQLを使いながらご説明します。

スキルアップ

2022/12/26 UP

where句のなかでデータの範囲を指定して抽出できるのがbetweenです。where句が何行にもわたり複雑になると、SQLの可読性を下げ、SQLの記載ミスやデータの抽出ミスを招きかねません。

可能な限り記載量を減らしたいのはプログラムのコードもSQLも共通です。betweenは条件指定の最小値と最大値を1行で記載するため、where句のなかを読みやすくしてくれるデータ操作言語です。

条件指定において大事な役割を果たすbetweenの使い方をサンプルデータとサンプルSQLを使いながらご説明します。

betweenとは

まずはbetweenの概要を解説します。

範囲指定をしてデータを抽出する

betweenは条件に最大値と最小値を指定して、その間のデータを抽出します。

betweenを使わないと、

where id >= 10 and id <= 20

のような形で、条件をandでつながなければなりません。項目名や指定する条件が長くなってくると見づらい形になります。

betweenが使えれば同じ条件を

where id between 10 and 20

の形で書けます。

idが10から20の間に該当するレコードを抽出したいことが明確になり、読みやすいSQLが書けるのがbetweenの特徴です。

範囲外のデータを抽出する際はnot betweenを使う

指定した範囲に含まれないデータを抽出するにはnot betweenを使います。idが10から20以外のデータを抽出したい場合は、

where id not between 10 and 20

の形で表記します。

もちろん上記条件をbetweenを使わずに書くことは可能です。その場合、

where id < 10 and id > 20

の条件指定になります。not betweenであるためbetweenのときとは大小関係が逆になり、イコールがなくなります。

難しいものではないため読めば誰でもわかるSQLですが、between、not betweenを使う方が最大値、最小値の関係性がわかりやすくなります。

betweenの使い方

ここからは、実際にサンプルのデータとSQLを示しながら、betweenを説明します。

betweenのSQLサンプル

例として以下のレコードが入った年齢テーブルからデータを抽出してみましょう。

id 氏名 年齢
4040224 田中重郎 55
4090784 山田和美 47
5020193 鈴木剛規 33
5100629 木村和香 36

年齢が30歳から40歳の方を抽出する場合のSQLを記載します。

※サンプルコード

select * from 年齢
where 年齢 between 30 and 40

抽出結果は以下のとおりとなります。

id 氏名 年齢
5020193 鈴木剛規 33
5100629 木村和香 36

30歳から40歳に該当した鈴木剛規、木村和香の2レコードが抽出されました。

反対にnot betweenを使って、30歳から40歳に該当しない方のデータを抽出してみます。SQLはこうなります。

※サンプルコード

select * from 年齢
where 年齢 not between 30 and 40

抽出結果がこう変わります。

id 氏名 年齢
4040224 田中重郎 55
4090784 山田和美 47

30歳から40歳に該当しない田中重郎、山田和美の2レコードが抽出されました。

このようにbetweenの条件式には大小関係のある値を持ってくるのが一般的です。例えば、今回の年齢テーブルであれば、idをbetweenの条件にして出力することも可能です。

ただしbetweenで評価する値と条件式の値はデータの型がそろっていなければなりません。今回の例でいえば年齢列のデータ、条件として入れた30、40の3つは数値型でデータ型がそろっています。

単なる数値の際はそれほど気にしなくていいポイントですが、年齢列が文字列になっていないかは確認しておきましょう。

DBMSによっては暗黙のうちにデータ型が変換されていることもありますが、思わぬミスを防止するためには頭に入れておきたいポイントです。例えばidは既定の桁数が決まっていることがあり、その場合、不足した桁数分、ゼロ埋めされています。そしてゼロ落ちを防ぐために一見数値に見えるデータが文字型になっていることもあります。

なおbetweenの条件式には大小比較のできる値が入ってくることを前提としているため、全角スペースなどの空白やnullを指定することはできません。DBMSによってはエラーが出ずに結果が出力されることもありますが、空白やnullをどのように解釈するかがDBMSの種類、同じ種類でもバージョンによって異なります。実行時にエラーが出なかったとしても、条件指定に空白やnullを入れるのは避けましょう。

betweenを使う際の注意点

使い方を理解したところで、ここからはbetweenを使う際に陥りがちなミスやエラーの原因を示します。

条件指定の値は開始値、終了値を含む

betweenは条件指定した値を含む形でデータを抽出します。

where 年齢 between 30 and 40

上記の条件なら、年齢列が30以上、40以下のレコードが抽出されます。比較式でいう大なりイコール、小なりイコールで条件指定したのと同じ状態です。上限値、下限値に当たる部分の境界値の扱いは注意しましょう。

betweenで境界値を含まない形での条件指定は難しいため、条件指定した値を含みたくないときは工夫する必要があります。年齢のように整数で一歳刻みなのがわかる値であれば

where 年齢 between 31 and 39

で条件指定することにより、30と40に該当するレコードを省くことができます。

それ以外の刻み方の複雑な値などは、betweenを使わずに

where 年齢 > 30 and 年齢 < 40

で記載するのが無難です。

日付の指定方法に注意する

betweenは評価する値と条件式の値の型がそろっていないと正しくデータを抽出できません。日付を示す値を持った列が時間の情報まで持っている場合、そのデータ型に合わせて条件指定します。

例えば2022-01-01 00:00:00のタイムスタンプ型でデータを持つ日時列に

where 日時 between 2022-01-01 and 2022-01-05

で条件指定をしてしまうと、1月5日のデータが抽出できません。このwhereの条件は暗黙でデータ型がそろえられ、

where 日時 between 2022-01-01 00:00:00 and 2022-01-05 00:00:00

とみなされるからです。そのため、2022-01-05 12:00:00 などは2022-01-05ですが範囲外となってしまいます。

1月5日までのデータを取得したい場合は、終了日に1日プラスして

where 日時 between 2022-01-01 and 2022-01-06

としてしまうのが簡単です。

文字列を条件に指定しない

人の名前や商品名などを条件指定する値とし、アルファベット順の意味でbetween a and cや五十音順の意味でbetween あ and お などの条件指定が可能なDBMSもあります。

ただしデータ型が合わなかったり、暗黙の解釈が入ったりとDBMSによって抽出結果が異なる場合があるため注意が必要です。また日本語のわかる人にしか五十音順の条件指定は伝わらず、漢字の読みの解釈で抽出にもれが出る可能性があります。

DBMSが暗黙で解釈してくれるのは便利ですが、すべてのDBMSで同じ結果が出るわけではありません。数値のように大小関係が明確でない文字列は条件に指定しない方が、抽出結果が一意に特定できる可読性の高いSQLになるといえるでしょう。

Betweenを使って可読性の高いSQLを書こう!

一定の範囲に収まるデータを抽出するのに便利なのがbetweenです。where句の条件式を<=、>=などの演算子で表記しなくてすむため、SQLを見やすく作れます。

自分が試しにデータを抽出するレベルのSQLであればどんな書き方をしても構いませんが、業務の一部であったり、プログラムに組み込んだりするSQLは他の人が読んでも同じ意味に解釈できるわかりやすいものにする必要があります。

誰が見てもわかるSQLを書くためにも条件式を単純化してくれるbetweenは使えるようになっておいて損はありません。