SQLの「~以上」についてまとめています。
SQLの「~以上」を抽出するサンプルコード集
指定の数値以上を抽出するには「>=」
「以上」を指定するには、where条件文に「>=」を指定します。intやfloat型のほか、日付型のデータにも使用可能です。
select * from employees where hire_date >= '1995-01-01' limit 10; +--------+------------+------------+-------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-------------+--------+------------+ | 10016 | 1961-05-02 | Kazuhito | Cappelletti | M | 1995-01-27 | | 10019 | 1953-01-23 | Lillian | Haddadi | M | 1999-04-30 | | 10022 | 1952-07-08 | Shahaf | Famili | M | 1995-08-22 | | 10024 | 1958-09-05 | Suzette | Pettey | F | 1997-05-19 | | 10026 | 1953-04-03 | Yongqiao | Berztiss | M | 1995-03-20 | | 10054 | 1957-04-04 | Mayumi | Schueller | M | 1995-03-13 | | 10084 | 1960-05-25 | Tuval | Kalloufi | M | 1995-12-15 | | 10093 | 1964-06-11 | Sailaja | Desikan | M | 1996-11-05 | | 10105 | 1962-02-05 | Hironoby | Piveteau | M | 1999-03-23 | | 10120 | 1960-03-26 | Armond | Fairtlough | F | 1996-07-06 | +--------+------------+------------+-------------+--------+------------+ 10 rows in set (0.00 sec)
平均値以上を抽出するには、avg()とサブクエリを組み合わせる
下記のサンプルは、employees(社員)テーブルとsalaries(給与)テーブルから、給与が平均値以上の社員のemp_no(社員番号)、first_name(姓名の名)、last_name(姓名の姓)、直近の給与(salary)を抽出しています。直近の給与は、to_dateに9999-01-01が指定されている前提です。
select employees.emp_no, first_name, last_name, salary from employees left join salaries on employees.emp_no = salaries.emp_no and to_date='9999-01-01' where salary >= ( select avg(salary) from salaries ) limit 10; +--------+------------+-------------+--------+ | emp_no | first_name | last_name | salary | +--------+------------+-------------+--------+ | 10001 | Georgi | Facello | 88958 | | 10002 | Bezalel | Simmel | 72527 | | 10004 | Chirstian | Koblick | 74057 | | 10005 | Kyoichi | Maliniak | 94692 | | 10007 | Tzvetan | Zielinski | 88070 | | 10009 | Sumant | Peac | 94409 | | 10010 | Duangkaew | Piveteau | 80324 | | 10013 | Eberhardt | Terkki | 68901 | | 10016 | Kazuhito | Cappelletti | 77935 | | 10017 | Cristinel | Bouloucos | 99651 | +--------+------------+-------------+--------+ 10 rows in set (0.67 sec)
サブクエリで平均を出すためにテーブルフルスキャンを使用しているので、salariesのような件数の多いテーブルを対象にすると、クエリが遅くなります。salariesテーブルは280万件以上のデータが格納されています。
mysql> select count(*) from salaries; +----------+ | count(*) | +----------+ | 2844047 | +----------+ 1 row in set (0.88 sec)
~以上、~以下(範囲指定)を指定するには、between
範囲指定をするには、betweenを使います。下記の例では、雇用日(hire_date)が1990年1月1日以上(以降)、1991年1月1日以下(以前)のデータを抽出しています。
SELECT * FROM employees where hire_date between '1990-01-01' and '1991-01-01' limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10011 | 1953-11-07 | Mary | Sluis | F | 1990-01-22 | | 10032 | 1960-08-09 | Jeong | Reistad | F | 1990-06-20 | | 10037 | 1963-07-22 | Pradeep | Makrucki | M | 1990-12-05 | | 10043 | 1960-09-19 | Yishay | Tzvieli | M | 1990-10-20 | | 10050 | 1958-05-21 | Yinghua | Dredge | M | 1990-12-25 | | 10056 | 1961-09-01 | Brendon | Bernini | F | 1990-02-01 | | 10074 | 1955-08-28 | Mokhtar | Bernatsky | F | 1990-08-13 | | 10077 | 1964-04-18 | Mona | Azuma | M | 1990-03-02 | | 10082 | 1963-09-09 | Parviz | Lortz | M | 1990-01-03 | | 10086 | 1962-11-19 | Somnath | Foote | M | 1990-02-16 | +--------+------------+------------+-----------+--------+------------+ 10 rows in set (0.01 sec)
【関連記事】
▶SQL betweenで範囲指定するサンプルコード 速度アップにもつながる?
まとめ
- 数値に「~以上」の条件を指定するには「>=」
- 平均値以上を抽出するには、avg()とサブクエリを組み合わせる
- betweenで~以上、~以下の範囲指定が可能