SQLのbetweenについてまとめています。
SQL betweenの構文
SQLのbetweenは、wherej句にカラム名 between <下限値> and <上限値>と指定します。下記は、emp_no(社員番号)に数値で範囲指定する場合の記述方法です。
select * from employees where emp_no between 10010 and 10020; +--------+------------+------------+-------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-------------+--------+------------+ | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | | 10011 | 1953-11-07 | Mary | Sluis | F | 1990-01-22 | | 10012 | 1960-10-04 | Patricio | Bridgland | M | 1992-12-18 | | 10013 | 1963-06-07 | Eberhardt | Terkki | M | 1985-10-20 | | 10014 | 1956-02-12 | Berni | Genin | M | 1987-03-11 | | 10015 | 1959-08-19 | Guoxiang | Nooteboom | M | 1987-07-02 | | 10016 | 1961-05-02 | Kazuhito | Cappelletti | M | 1995-01-27 | | 10017 | 1958-07-06 | Cristinel | Bouloucos | F | 1993-08-03 | | 10018 | 1954-06-19 | Kazuhide | Peha | F | 1987-04-03 | | 10019 | 1953-01-23 | Lillian | Haddadi | M | 1999-04-30 | | 10020 | 1952-12-24 | Mayuko | Warwick | M | 1991-01-26 | +--------+------------+------------+-------------+--------+------------+ 11 rows in set (0.00 sec)
数値、文字列、日付、時刻等に対して使用可能です。
なお、不等号で書き直すと、上記のSQLは以下のようになります。
select * from employees where emp_no >= 10010 and emp_no <= 10020;
betweenを使うと上限値、下限値を含む条件指定になります。下限値未満、上限値より大きいという条件指定はbetweenでは表現できません。不等号を使った条件式を記述する必要があります。
SQL betweenの使い方
SQL betweenで文字列範囲指定
betweenで扱えるのは数値だけではありません。文字列の範囲指定も可能です。文字列の場合、デフォルトでは範囲判定はアルファベット順にソートした順番にそって判定されます。
mysql> SELECT * FROM employees WHERE first_name BETWEEN 'A' AND 'D' LIMIT 10; +--------+------------+------------+------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+------------+--------+------------+ | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10014 | 1956-02-12 | Berni | Genin | M | 1987-03-11 | | 10017 | 1958-07-06 | Cristinel | Bouloucos | F | 1993-08-03 | | 10023 | 1953-09-29 | Bojan | Montemayor | F | 1989-12-17 | | 10033 | 1956-11-14 | Arif | Merlo | M | 1987-03-18 | | 10034 | 1962-12-29 | Bader | Swan | M | 1988-09-21 | | 10035 | 1953-02-08 | Alain | Chappelet | M | 1988-09-05 | | 10036 | 1959-08-10 | Adamantios | Portugali | M | 1992-01-03 | +--------+------------+------------+------------+--------+------------+ 10 rows in set (0.00 sec)
なお、日本語などのマルチバイト文字の場合、範囲指定が想定通りに動作しないケースがあります。この場合は、照合順序設定を確認して、想定通りにソートが可能かどうか確認してみてください。
【関連記事】
▶SQLの昇順ソート指定はasc マルチバイト文字列のソートは照合順序に従う
SQL betweenで日付の範囲指定
日付型や時刻型のカラムに対しても範囲指定が可能です。以下の例は、employeesテーブルから、誕生日(birth_date)が1960年1月1日~1962年12月31日のデータを抽出する例です。
mysql> SELECT * FROM employees WHERE birth_date BETWEEN '1960-01-01' AND '1962-12-31' LIMIT 10; +--------+------------+------------+-------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-------------+--------+------------+ | 10012 | 1960-10-04 | Patricio | Bridgland | M | 1992-12-18 | | 10016 | 1961-05-02 | Kazuhito | Cappelletti | M | 1995-01-27 | | 10021 | 1960-02-20 | Ramzi | Erde | M | 1988-02-10 | | 10027 | 1962-07-10 | Divier | Reistad | F | 1989-07-07 | | 10032 | 1960-08-09 | Jeong | Reistad | F | 1990-06-20 | | 10034 | 1962-12-29 | Bader | Swan | M | 1988-09-21 | | 10038 | 1960-07-20 | Huan | Lortz | M | 1989-09-20 | | 10043 | 1960-09-19 | Yishay | Tzvieli | M | 1990-10-20 | | 10044 | 1961-09-21 | Mingsen | Casley | F | 1994-05-21 | | 10046 | 1960-07-23 | Lucien | Rosenbaum | M | 1992-06-20 | +--------+------------+------------+-------------+--------+------------+ 10 rows in set (0.00 sec)
【関連記事】
▶SQL betweenで範囲指定するサンプルコード 速度アップにもつながる?
まとめ
- SQLのbetweenは範囲指定条件が可能
- betweenは<上限値>以上、<下限値>以下の指定。不等号で書き換えが可能。
- betweenは数値のほか、文字列や日付、時刻に対して指定が可能