思考停止するな

ネットワークとかアプリケーションとかWebとか

EXISTS句について

スポンサーリンク

最近SQLを書く事が多いのですが、イマイチEXISTS句がわかってなくてうまく使う事ができていなかったので、EXISTS句について勉強した事をメモとして残します。

EXISTSとは存在検査で、副問合せによって返されたレコードが一つでもあればTRUE、一つもなければFALSEを返す。
そのため、副問い合わせで戻されるレコード数は1レコードでも複数レコードでも同じTRUEとなる。

副問い合わせの中には、相関副問い合わせというものがある。
これは、主問い合わせの結果をチェックするというものである。
相関副問い合わせでは、主問い合わせの表の1行毎に副問い合わせが実行される。
そのため、主問い合わせで指定されたデータが存在すれば真を返し、存在しなければ偽を返す。真の行だけが抽出される。

EXISTSを使う場合って WHERE EXISTS(サブクエリ)って感じで書くみたいです。
WHRE句っていうと、絶対にこの列にこの値って感じに条件を指定しないといけないと思っていたけど、相関副問い合わせでは違うみたい。

よくEXISTS句で用いる時の書き方は以下のような書き方をよくするようだ。

SELECT 列名1, 列名2, ...
FROM テーブル名
WHERE EXISTS (
    SELECT 列名
    FROM テーブル名
)

EXISTS句を使うタイミングとしては、
1.あるテーブルにとあるデータが存在するものだけを別のテーブルから抽出する(データが存在するかどうかを条件とする)
2.複数の列を1グループとしてその中にある最大値の行を取得
とかかな。

1のSQL

SELECT
  *
FROM
  ta1
WHERE
  EXISTS (
      SELECT
          *
      FROM
          ta2
      WHERE
          ta1.hoge = ta2.hoge
  )
;

EXISTS使わないで無理やり結合させても実現できそうだけど、
EXISTS句をちゃんと使えるようになったら、すっきりとしたSQLがかけるようになりそう。