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

MySQL:BETWEEN句で開始値と終了値を除外して取得する方法

MySQLのBETWEEN句で開始値と終了値を除外するには?

MySQLのBETWEEN句は、指定した範囲の検索において、デフォルトでは開始値と終了値(両端の値)も結果に含まれます。しかし実際の開発では、「範囲内のデータは欲しいけれど、両端の値は除きたい」というケースも少なくありません。

そのような場合は、BETWEENNOT INを組み合わせることで、開始値と終了値を除外した範囲検索が簡単に実現できます。ここでは具体的な構文とサンプルコードを紹介します。

基本構文

開始値と終了値を結果から除外したい場合は、次のような構文を使用します。

SELECT * FROM テーブル名 
WHERE 列名 BETWEEN 開始値 AND 終了値 
  AND 列名 NOT IN (開始値, 終了値);

BETWEENで範囲を絞り込みつつ、NOT INによって両端の値を明示的に排除している点がポイントです。

サンプルテーブルの作成

それでは、動作を確認するためにサンプルテーブルを作成しましょう。テーブル作成クエリは以下の通りです。

mysql> create table BetweenWithoutEndPoints
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> Name varchar(20),
    -> Age int,
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (0.54 sec)

AUTO_INCREMENTによりIdが自動採番され、Name(名前)とAge(年齢)を持つシンプルなテーブルです。

レコードの挿入

続いて、INSERT文を使っていくつかのレコードを挿入します。

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Mike',23);
Query OK, 1 row affected (0.21 sec)

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Larry',25);
Query OK, 1 row affected (0.21 sec)

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('David',28);
Query OK, 1 row affected (0.16 sec)

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Sam',26);
Query OK, 1 row affected (0.15 sec)

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Carol',21);
Query OK, 1 row affected (0.14 sec)

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('John',29);
Query OK, 1 row affected (0.18 sec)

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('James',20);
Query OK, 1 row affected (0.41 sec)

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Robert',26);
Query OK, 1 row affected (0.17 sec)

mysql> insert into BetweenWithoutEndPoints(Name,Age) values('Michael',30);
Query OK, 1 row affected (0.16 sec)

全レコードの確認

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

mysql> select * from BetweenWithoutEndPoints;

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

+----+---------+------+
| Id | Name    | Age  |
+----+---------+------+
| 1  | Mike    | 23   |
| 2  | Larry   | 25   |
| 3  | David   | 28   |
| 4  | Sam     | 26   |
| 5  | Carol   | 21   |
| 6  | John    | 29   |
| 7  | James   | 20   |
| 8  | Robert  | 26   |
| 9  | Michael | 30   |
+----+---------+------+
9 rows in set (0.00 sec)

開始値と終了値を除外した範囲検索の実行

それでは本題のクエリです。以下の例では、Idが3以上8以下のレコードの中から、Id 3と8を除外して取得しています。

mysql> select * from BetweenWithoutEndPoints
    -> where Id between 3 and 8 and Id not in (3, 8);

実行結果:

+----+-------+------+
| Id | Name  | Age  |
+----+-------+------+
| 4  | Sam   | 26   |
| 5  | Carol | 21   |
| 6  | John  | 29   |
| 7  | James | 20   |
+----+-------+------+
4 rows in set (0.04 sec)

結果のポイント

出力を見ると、Id 3(David)とId 8(Robert)が除外され、Id 4〜7の4件のみが取得できていることがわかります。このように、BETWEEN ... AND ...NOT IN (...)を併用すれば、境界値を含まない範囲検索を簡単に実装できます。

なお、この手法は日付型や数値型など、他のデータ型に対しても同様に使えます。範囲条件と除外条件の組み合わせは、実務のデータ抽出でも頻繁に活用されるテクニックなので、ぜひ覚えておきましょう。

  1. MySQLのTINYINT(1)とブール型(BOOLEAN)の違いとは?

    結論から言うと、TINYINT(1)とブール型(BOOLEAN)の間に違いはありません。MySQLでは、BOOLまたはBOOLEANというキーワードは内部的にTINYINT(1)へと変換されます。つまり、BOOLやBOOLEANはTINYINT(1)の別名(シノニム)として扱われるのです。それでは、実際にテーブルを作成して確認してみましょう。BOOLEAN型でテーブルを作成するmysql> create table DemoTable ( isMarried Boolean ); Query OK, 0 rows affected (1.77 sec)次に、作成したテーブルの構造

  2. MySQLにおける「!=NULL」と「IS NOT NULL」の違いとは?

    MySQLでは、値を!=NULLと比較すると、結果は必ずNULLになります。つまり、!=NULLという比較は意味を持ちません。NULLは「不明な値」を表すため、通常の比較演算子では判定できないのです。NULL値を判定するには、専用の演算子であるIS NOT NULLを使用します。ここでは、!=NULLとIS NOT NULLの違いを実際に確認するために、まずテーブルを作成します。テーブルの作成まず、次のコマンドでテーブルを作成します。mysql> create table DemoTable1970     (