Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

SQLのwhere句のbetweenを使った条件指定についてまとめています。

SQLのwhere句でのbetweenは条件の範囲指定が可能

以下は、employeesテーブルのemp_no(社員番号)が20000~20005までのレコードを抽出するSQLの例です。

mysql> SELECT * FROM employees
    -> where emp_no between 20000 and 20005;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  20000 | 1961-09-14 | Jenwei     | Matzke    | F      | 1990-11-29 |
|  20001 | 1962-05-16 | Atreye     | Eppinger  | M      | 1990-04-18 |
|  20002 | 1955-12-25 | Jaber      | Brender   | M      | 1988-01-26 |
|  20003 | 1953-04-11 | Munehiko   | Coors     | F      | 1991-02-07 |
|  20004 | 1952-03-07 | Radoslaw   | Pfau      | M      | 1995-11-24 |
|  20005 | 1956-02-20 | Licheng    | Przulj    | M      | 1992-07-17 |
+--------+------------+------------+-----------+--------+------------+
6 rows in set (0.00 sec)

betweenでは、数値以外にも日付や文字列に対しても条件指定が可能です。

【関連記事】
SQL betweenで範囲指定するサンプルコード 速度アップにもつながる? 

where句でbetweenを複数指定する

betweenによる条件をorで接続して複数指定することが可能です。以下のSQLは、emp_noが20000~20005、30000~30003のレコードを抽出する例です。

mysql> SELECT * FROM employees
where emp_no between 20000 and 20005
or emp_no between 30000 and 30003;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  20000 | 1961-09-14 | Jenwei     | Matzke    | F      | 1990-11-29 |
|  20001 | 1962-05-16 | Atreye     | Eppinger  | M      | 1990-04-18 |
|  20002 | 1955-12-25 | Jaber      | Brender   | M      | 1988-01-26 |
|  20003 | 1953-04-11 | Munehiko   | Coors     | F      | 1991-02-07 |
|  20004 | 1952-03-07 | Radoslaw   | Pfau      | M      | 1995-11-24 |
|  20005 | 1956-02-20 | Licheng    | Przulj    | M      | 1992-07-17 |
|  30000 | 1953-01-07 | Matt       | Avouris   | F      | 1985-10-21 |
|  30001 | 1953-03-27 | Izaskun    | Morton    | M      | 1988-05-21 |
|  30002 | 1960-08-23 | Branimir   | Snedden   | M      | 1998-09-24 |
|  30003 | 1952-11-25 | Takahito   | Vilarrasa | M      | 1990-08-22 |
+--------+------------+------------+-----------+--------+------------+
10 rows in set (0.00 sec)

複数のbetween条件以外にも、別の条件式ともandやorで接続して複数条件の指定が可能です。

where句のbetweenでNULL指定すると、結果は空(Empty)

where句のbetweenにNULLを指定すると、MySQLの場合は結果が空(Empty)となりました。

mysql> select * from employees where emp_no between 10008 and null limit 10;
Empty set (0.01 sec)

mysql> select * from employees where emp_no between null and 20000 limit 10;
Empty set (0.00 sec)

mysql> select * from employees where emp_no between 10000 and 20000 limit 10;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  10001 | 1953-09-02 | Georgi     | Facello   | M      | 1986-06-26 |
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      | 1985-11-21 |
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |
|  10004 | 1954-05-01 | Chirstian  | Koblick   | M      | 1986-12-01 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak  | M      | 1989-09-12 |
|  10006 | 1953-04-20 | Anneke     | Preusig   | F      | 1989-06-02 |
|  10007 | 1957-05-23 | Tzvetan    | Zielinski | F      | 1989-02-10 |
|  10008 | 1958-02-19 | Saniya     | Kalloufi  | M      | 1994-09-15 |
|  10009 | 1952-04-19 | Sumant     | Peac      | F      | 1985-02-18 |
|  10010 | 1963-06-01 | Duangkaew  | Piveteau  | F      | 1989-08-24 |
+--------+------------+------------+-----------+--------+------------+
10 rows in set (0.01 sec)

mysql> select max(emp_no) from employees;
+-------------+
| max(emp_no) |
+-------------+
|      500000 |
+-------------+
1 row in set (0.00 sec)

一般的には、betweenの値にNULLを指定した場合の結果は、不定となると考えたほうが良さそうです。PostgreSQL、MySQL、SQLLite、Oracleでは結果が空集合とのデータがありますが、バージョン等によって結果が変わってくる可能性があります。

関連)Ruby2.6のInfiniteRangeをActiveRecordで利用した時の挙動を各RDBMSに対して調査した – Qiita

betweenにはNULLを指定しないように対策しておくのが無難と言えるでしょう。

SQLのwhere句のbetweenまとめ

ポテパンダの一言メモ
  • where句でbetweenを使って条件の範囲指定が可能
  • betweenは数値のほか、日付や文字列を対象にすることが可能
  • 複数のbetwwenやその他の条件指定をandやorで接続してwhere句に記述することができる

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。