SQL: WHERE 1 の意味


プログラムでSQLを組み立てる処理中に

  • SELECT * FROM table_name WHERE 1
  • SELECT * FROM table_name WHERE 1 = 1

という記述を見ることがあります。

これは機能的には SELECT * FROM table_name; と何ら変わりない。

WHERE 1

MySQLでは整数の1はTRUEと等価である。

WHERE 1 = 1

(1 = 1) を評価すると当然TRUEなのでWHERE 1WHERE 1 = 1は全く同じ結果となる。

そしてWHEREで指定する条件が必ず真であるならば、すべての行が選択されるので、
WHERE を指定しない、SELECT * FROM table_name;と結果は同じになる。

ではSELECT * FROM table_name;
SELECT * FROM table_name WHERE 1は同じ結果となるのに、
何故わざわざWHERE 1を書くのかというと、そのほうがプログラミングするうえで都合がいいからです。

SQLで条件を指定する時、1つ目の条件はWHERE句で指定し、2つ目以降の条件はANDかORで指定します。

SELECT * FROM テーブル名 WHERE 1つ目の条件 AND 2つ目の条件 AND 2つ目の条件 ...

SQLを組み立てるときに「それが1つ目の条件ならばWHEREで指定する」という処理が面倒なので、
あらかじめ WHERE = 1 という全ての行にマッチする条件をつけておいて、
それ以外の条件を足していくようにしておいたほうが、簡単なのです。

次のプログラムはusersテーブルをemailとnameで絞り込み検索する処理です。

  • emailだけが指定されて入れば、emailだけで検索
  • nameだけが指定されて入れば、nameだけで検索
  • emailとnameが指定されていれば、emailとnameのAND検索

このようにクエリを組み立てたい場合は
後者のWHERE 1があるほうがシンプルになる。

WHERE 1 無し:

$sql = "SELECT * FROM users";
if($email){
    $sql .= " WHERE email = :email";
}
if($name){
    if($email){
        $sql .= " AND name = :name";
    }
    else{
        $sql .= " WHERE name = :name";
    }
}

WHERE 1 あり:

$sql = "SELECT * FROM users WHERE 1";
if($email){
    $sql .= " AND email = :email";
}
if($name){
    $sql .= " AND name = :name";
}