MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLのIN句で範囲指定は可能?BETWEEN句との使い分けを解説

MySQLのIN句では、範囲指定による検索を行うことができません。同様の結果を得たい場合は、BETWEEN句を使用します。この記事では、具体的なサンプルコードを交えながら、それぞれの動作の違いをわかりやすく解説します。

IN句とBETWEEN句の基本的な違い

IN(開始値, 終了値)のように記述しても、開始値と終了値の間にある中間の値は取得されません。IN句は、カンマで区切って列挙した値と完全に一致する行だけを返す仕組みだからです。連続した範囲のデータを抽出したい場合は、BETWEEN句を使いましょう。

BETWEEN句には「両端の値を含む(inclusive)」という特徴があります。例えば、1から15までの数値データがあるとき、「2以上6以下」の数値を表示したい場合、BETWEENを使用すれば2と6自身も結果に含まれます。

サンプルテーブルを作成する

まず、検証用のテーブルを作成します。

mysql> create table SelectInWithBetweenDemo
   -> (
   -> PortalId int
   -> );
Query OK, 0 rows affected (0.77 sec)

一括挿入でレコードを登録する

続いて、バッチ挿入(一括INSERT)を使って複数のレコードを登録します。

mysql> insert into SelectInWithBetweenDemo values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15);
Query OK, 15 rows affected (0.19 sec)
Records: 15 Duplicates: 0 Warnings: 0

すべてのレコードを確認する

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from SelectInWithBetweenDemo;

実行結果は以下のとおりです。

+----------+
| PortalId |
+----------+
|        1 |
|        2 |
|        3 |
|        4 |
|        5 |
|        6 |
|        7 |
|        8 |
|        9 |
|       10 |
|       11 |
|       12 |
|       13 |
|       14 |
|       15 |
+----------+
15 rows in set (0.00 sec)

IN句で範囲指定を試してみる

ここで、IN句を使って「4から10まで」の範囲を指定してみます。

mysql> select PortalId from SelectInWithBetweenDemo where PortalId IN(4,10);

実行結果は以下のとおりです。

+----------+
| PortalId |
+----------+
|        4 |
|       10 |
+----------+
2 rows in set (0.00 sec)

上記の出力を見ると、取得できているのは4と10だけで、本来欲しい「4,5,6,7,8,9,10」という範囲の値は得られていません。このことから、IN句では範囲指定ができないことがわかります。

BETWEEN句で範囲を抽出する

次に、BETWEEN句を使ってみましょう。両端の値を含んだ形で、期待どおりの結果が得られます。

mysql> select PortalId from SelectInWithBetweenDemo where PortalId Between 4 and 10;

実行結果は以下のとおりです。

+----------+
| PortalId |
+----------+
|        4 |
|        5 |
|        6 |
|        7 |
|        8 |
|        9 |
|       10 |
+----------+
7 rows in set (0.09 sec)

4から10までの7件が、両端を含めて正しく取得できました。

両端を除外したい場合の方法

もし「両端の値を含めたくない(exclusive)」場合は、比較演算子の>(より大きい)と<(より小さい)を組み合わせて使用します。

mysql> select PortalId from SelectInWithBetweenDemo where PortalId > 4 and PortalId < 10;

実行結果は以下のとおりです。

+----------+
| PortalId |
+----------+
|        5 |
|        6 |
|        7 |
|        8 |
|        9 |
+----------+
5 rows in set (0.00 sec)

このように、4と10を除外した5から9までの5件が取得できます。

まとめ

  • IN句は列挙した値との完全一致のみを行うため、範囲指定には利用できない
  • 連続した範囲を両端含めて抽出したい場合はBETWEEN句を使う
  • 両端を除外して抽出したい場合は><を組み合わせる
  1. MySQLで月を指定してデータを抽出する方法(MONTH()関数の使い方)

    MySQLで日付データから特定の「月」に該当するレコードだけを抽出したい場合は、MONTH()関数を使うのが便利です。この記事では、実際にテーブルを作成し、サンプルデータを挿入しながら、月を条件にしたSELECT文の書き方を具体的に解説します。1. サンプルテーブルの作成まずは、出荷日(Shippingdate)を格納するdatetime型のカラムを持つテーブルを作成します。mysql> create table DemoTable1599    -> (    -> Shippingdate d

  2. MySQLで最高額の給与を取得する方法

    ```html MySQLで最高額の給与を取得するには? テーブルの中から最も高い給与(最高額の給料)を取得したい場合は、集計関数の MAX() を使用します。MAX() 関数は、指定したカラムの中で最大の値を返してくれる便利な関数です。 基本構文 select MAX(yourColumnName) AS anyAliasName from yourTableName; サンプルテーブルの作成 まず、実際に動作を確認するためのテーブルを作成しましょう。 mysql> create table demo44 -> ( -> employee_id int not null