ywork2020.com

Title

なぜ、WHERE 1=1 を使うのか

目次 (INDEX)

WHERE 1=1 とは

WHERE 句でレコード抽出条件を指定する際に使用する定型文みたいなものです。 SQL としての意味は、実はありません。

MySQL では整数の 1 は TRUE と同じ価値であるため、 「 WHERE 1 」 というのは TRUE であるという意味になります。 「 WHERE 1=1 」 とした場合も、 1=1 は TRUE ですので 「 WHERE 1 」 と、まったく同じ意味になります。

さて、ここで考えてみると分りますが、レコードの抽出条件を指定する WHERE 句が TRUE を返してくるということは、レコード抽出条件が全てのレコードで通過しているということです。 つまりは、WHERE 句が有っても無くても同じ結果でレコード抽出が行われるということになります。 もっというと、抽出条件を指定する為にある WHERE 句だけど 「 1=1 」 としておくことで WHERE 句を使っていない SQL と同じ結果が得られるということです。

目次に戻る

なぜ、WHERE 1=1 を使うのか?

SELECT * FROM テーブル名;
SELECT * FROM テーブル名 WHERE 1=1;

上記の二つのクエリが同じ結果を得られることは分りました。
では、なぜ 「 WHERE 1=1 」を使うのかというと、Web ページに使われるデータベースでは多くのユーザーが利用する可能性があり、 そのユーザーごとに抽出条件は異なるでしょう。 データ抽出の条件が1つなのか、2つなのか、はたまた 5つなのかも分りません。 その多人数が使うプログラムを作るときには、恐らく次のような処理をしていくことになるでしょう。

まず、データベースに問い合わせするためのベースとなるSELECT文のクエリを作ります。 そして、ユーザーの操作を返すには 「 SELECT * FROM テーブル名 」 の基本クエリの後に追加文の処理が必要になるかもしれません。

  • 抽出条件が必要かを判定
  • 1つ目の抽出条件が必要なら WHERE 句を追加
  • 1つ目の条件式を追加
  • 2つ目の抽出条件が必要なら、どの論理演算子を使うか判定
  • 論理演算子を追加
  • 2つ目の条件式を追加
  • ...

上記のような処理をする場合に、もとから WHERE 1=1 をベースとしてプログラムの SQL に組み込んであると、 SELECT * FROM テーブル名 WHERE 1=1 AND 抽出条件 AND 抽出条件 というように 「 AND 抽出条件 」 の部分を必要な条件の数だけ追加すればクエリが作成できるので プログラムの処理が簡単になりますし、コードの視認性も向上します。

  1. SELECT * FROM テーブル名 WHERE 1=1;
  2. SELECT * FROM テーブル名 WHERE 1=1 AND 抽出条件;
  3. SELECT * FROM テーブル名 WHERE 1=1 AND 抽出条件 AND 抽出条件;

以上が 「 WHERE 1 」 、または 「 WHERE 1=1 」 を付ける理由となります。
繰り返しになりますが、本来の SQL としては無意味なものですがプログラムを組む上では便利な使い方です。

目次に戻る

サンプル テーブルの構造

データ抽出用のサンプルテーブルが必要でしたので事前に作成しています。
ここではテーブル作成までのクエリを簡易的に書いておきます。

現在、データベースにはサンプルとして以下に示す構造の japan テーブルを作成しており、 そのテーブルに 47都道府県のデータを登録した状態になっています。

サンプルコード: テーブルの作成

サンプルテーブルを以下のクエリで作成しました。

CREATE TABLE japan(
	県番号 int(11),
	都道府県 varchar(10),
	県庁所在地 varchar(10),
	地方 varchar(10)
);
カラム1
(県番号)
カラム2
(都道府県)
カラム3
(県庁所在地)
カラム4
(地方)
データデータデータデータ
データデータデータデータ

目次に戻る

サンプルコードと実行結果

ここからは実際に稼働しているデータベースに接続してクエリを実行していきます。 下記に配置された各ボタンをクリックすると、ボタンに書かれているサンプルクエリを実行して結果を表示します。

サンプルコード: SELECT 文の基本的な使い方

SELECT * FROM テーブル名;

これはテーブルデータを抽出するための基本構文です。
指定したテーブルのデータを全件、全フィールドで抽出します。 この単純なクエリはデータ量が少ない場合や開発段階では利用することが多いと思いますが、実際の運用では使いません。

実行:

検証: WHERE 1=1 を使って条件に一致したレコードのみを抽出する

SELECT * FROM テーブル名 WHERE 1=1;

ここでは、WHERE 句を使って任意のフィールドで条件に該当したレコードだけを抽出します。 ここでの抽出条件は [ 1=1 ] です。

実行:

結果としては、[ WHERE 1=1 ] だけでは全てのレコードが TRUE を返すので全件のレコードを抽出することになり、 [ WHERE 1=1 ] が無い SQL と変わりません。 つまり、普通に SQL を使うだけなら WHERE 1=1 は有っても無くても 何ら問題ありません。

検証: WHERE 1=1 に AND で条件を追加する

SELECT * FROM テーブル名 WHERE 1=1 AND 条件式 AND 条件式 ...;

ここでは、[ WHERE 1=1 ] にプログラムから動的に追加条件を付けてみます。

実行:



条件の追加: 以下の 2つのボタンは上の実行ボタンに抽出条件を追加します。
     


リセット:


実行結果を見てお分かりいただけたでしょうか。

プログラムによって [ WHERE 1=1 ] の後に [ AND 条件式 ] を追加させるだけでレコード検索は絞り込まれていきます。

つまり、WHERE 1=1 というのは上のサンプルのように、絞り込み検索の条件をプログラムから簡単に追加したいという理由で使われているのです。

目次に戻る

SQL の仕様上の注意点

※ SQL の予約句はアルファベットの大文字と小文字を区別しませんが、 任意で作成したデータベースやテーブル、カラムの名前などは区別されるので注意が必要です。

目次に戻る