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句に記述することができる