No Programming, No Life

プログラミング関連の話題や雑記

SQLのANY, SOME, ALL, USINGについて

どうも、ふもです。
なんだか今年の夏は雨ばっかりですね。

さて、今日はSQLについてです。
現在携わっているお仕事ではOracleデータベースを使っているのですが、とある事情でSQLのリファレンスを眺めていたら、ほとんど使わないキーワードに出会いました。
タイトルにあるように、ANY, SOME, ALLとUSINGについてです。
ちなみにいままで、業務で取り扱ってきた様々なシステムで見かけたことは無かったと記憶しているので、そうとう珍しいんじゃないかなと思います。
機能の詳細はググってもらうとして、ANYとUSINGだけ軽くどんな感じなのか紹介して終わりにしたいと思います。

ANY

ANYはINとほぼ同じ感じで利用できるようです。

SELECT * FROM デーブル
WHERE
    AAA = ANY(10, 20, 30)

個人的に強力だなぁと思ったのは、複数の値の組み合わせでマッチできるところです。

SELECT * FROM デーブル
WHERE
    (AAA, BBB) = ANY(
        (10, 'a'),
        (20, 'b')
    )

ちなみに、SOMEはANYと同じ意味で使えるらしいです。エイリアスですね。
ANYで複数の条件を指定した場合は、そのどれかにマッチした行が残ります。
あと、ALLは逆に全てにマッチした場合のみ行が残るみたいです。

USING

よく使われるキーワードですが、ここではINNER JOINとかLEFT JOINとかのテーブル結合の時に使うもののお話です。

USINGはONの代わりに結合条件を書く時に利用できます。結合するテーブル同士の列名が同じ場合で、等結合となるような場合に利用できます。

FROM
    T1
    INNER JOIN
    T2
    USING (AAA, BBB, CCC)

これは、ONを使った場合の以下と同等の意味になります。

FROM
    T1
    INNER JOIN
    T2
    ON (
        T1.AAA = T2.AAA AND
        T1.BBB = T2.BBB AND
        T1.CCC = T2.CCC
    )

列名が揃ってないと使えないですが、だいぶコードの見通しが良くなりますよね。デーブル設計時からこれを見越して、結合する予定の列名は統一しておくと良さそうな気がしました。


さて、いかがだったでしょうか。
私自身は、普段何気無く使っているものの中にもまだまだ未知のものが隠されていることを実感できてなんだか面白かったです。
もうこんなことは知っていると門を閉ざさずに、一度、よく見知った言語や製品などのマニュアルやリファレンスを眺めてみることをお勧めします。