構文:
operand
comparison_operator
ANY (subquery
)operand
IN (subquery
)operand
comparison_operator
SOME (subquery
)
比較演算子の後に続かなければいけない
ANY
キーワードは、「もしサブクエリが返すカラム内の値の
ANY
に対する比較が
TRUE
であれば、TRUE
を返す」 という事を意味します。例:
SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);
テーブル (10)
を含むテーブル
t1
内に行があると仮定してください。10
以下である値 7
が
t2
の中にあるので、もしテーブル
t2
が (21,14,7)
を含むなら、その式は TRUE
です。もしテーブル t2
が
(20,10)
を含むか、テーブル
t2
が空であれば、その式は
FALSE
です。もしテーブル
t2
が (NULL,NULL,NULL)
を含むなら、その式は UNKNOWN
です。
サブクエリと共に利用される時、IN
という言葉は = ANY
のエイリアスとなります。従って、これら2つのステートメントは同じになります。
SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2); SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2);
式のリストと共に利用される時、IN
と = ANY
は同義語ではありません。IN
は式のリストを取る事ができますが、=
ANY
はできません。詳しくは
項11.1.3. 「比較関数と演算子」
を参照してください。
NOT IN
は <> ANY
のエイリアスではありませんが、<>
ALL
のエイリアスです。詳しくは
項12.2.8.4. 「ALL
を持つサブクエリ」
を参照してください。
SOME
という言葉は
ANY
のエイリアスです。従って、これら2つのステートメントは同じになります。
SELECT s1 FROM t1 WHERE s1 <> ANY (SELECT s1 FROM t2); SELECT s1 FROM t1 WHERE s1 <> SOME (SELECT s1 FROM t2);
SOME
が利用される事はほとんどありませんが、なぜこれが役に立つのか、この例が表しています。通常、英語で
「a はどの b とも同等ではない」
と言うと、「 a と等しい b は無い」
と解釈されますが、SQL
構文ではそのような意味ではないのです。その構文は、「a
と同等ではない b がいくつかある」
と意味します。<> SOME
を代わりに利用すると、そのクエリが本当に意味している事を全員がきちんと理解する助けになります。