MySQL:BETWEEN句で開始値と終了値を除外して取得する方法
MySQLのBETWEEN句で開始値と終了値を除外するには?
MySQLのBETWEEN句は、指定した範囲の検索において、デフォルトでは開始値と終了値(両端の値)も結果に含まれます。しかし実際の開発では、「範囲内のデータは欲しいけれど、両端の値は除きたい」というケースも少なくありません。
そのような場合は、BETWEENとNOT 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 (...)を併用すれば、境界値を含まない範囲検索を簡単に実装できます。
なお、この手法は日付型や数値型など、他のデータ型に対しても同様に使えます。範囲条件と除外条件の組み合わせは、実務のデータ抽出でも頻繁に活用されるテクニックなので、ぜひ覚えておきましょう。
-
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)次に、作成したテーブルの構造
-
MySQLにおける「!=NULL」と「IS NOT NULL」の違いとは?
MySQLでは、値を!=NULLと比較すると、結果は必ずNULLになります。つまり、!=NULLという比較は意味を持ちません。NULLは「不明な値」を表すため、通常の比較演算子では判定できないのです。NULL値を判定するには、専用の演算子であるIS NOT NULLを使用します。ここでは、!=NULLとIS NOT NULLの違いを実際に確認するために、まずテーブルを作成します。テーブルの作成まず、次のコマンドでテーブルを作成します。mysql> create table DemoTable1970 (