SELECT (1,2)=(1,2) とか SELECT (1,2) IN ( (1,2) )

SELECT (1,2)=(1,2);
SELECT (1,2) IN ((1,2));

この括弧の使い方がドキュメントのどこで説明されているんだろうと思って人力検索で質問したんだけど、回答が出る前に答えが見つかった...。質問をキャンセルしたら、質問自体が消えて無くなるんですな。コメントに書き足そうと思っていたのに、それができなくなってしまったので日記に。

この時点までの話は、単一値や値のカラムを返すサブクエリなどのような、スカラやカラム サブクエリに関しての物でした。行サブクエリ は単列を戻し、ひいては複数のカラム値を返す事ができるサブクエリ異型です。ここに2つ例があります。

SELECT * FROM t1 WHERE (1,2) = (SELECT column1, column2 FROM t2);
SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2);

もしテーブル t2 が column1 = 1 と column2 = 2 の場所に行を持っていれば、ここにあるクエリは両方 TRUE です。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.2.8.5 行サブクエリ

で、知りたかったこと...

式 (1,2) と ROW(1,2) は時々 row constructors と呼ばれます。それら2つは同等の物です。それらは、別のコンテキストの中でも正当です。例えば、次の2つのステートメントは意味的に同等です。(1つ目は MySQL 5.1.12 まで最適化する事ができませんが)

  SELECT * FROM t1 WHERE (column1,column2) = (1,1);
  SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;

ANDをいっぱい書くより楽そうだなと思ったけど、ANDで書いたほうがよさそうだなぁ。