SQL

SQL – 量化を実現するとても便利なEXISTS述語

0

EXISTS述語

通常のサブクエリであれば、「内側の副問い合わせを1回処理⇒主問い合わせ(外側クエリ)を1回処理」というシンプルな手順だが、相関サブクエリ(副問い合わせ)を使用したSQL文は「外側クエリでテーブルから行を絞り込む過程で、各行について抽出してもよいかを判定するために、繰り返し副問い合わせを実行する」ので、DBMSの負荷がかかり、敬遠されがち。
ただ、この相関サブクエリを利用してもパフォーマンスが良く、複数行を一単位とみなした高度な条件記述ができるのがEXISTS述語。EXISTS述語は「量化」という述語論理の機能を実現することができる。

EXISTS述語の「述語」とは、戻り値が真偽値になる関数を指している。=、<、>、BETWEEN、IN、IS NULL等々も、返り値が真偽値なので述語として捉えることができる。

特徴

EXISTS述語の特徴は入力値が「行の集合」である点にある。これは他の述語と比較すると分かりやすい。

「行の集合」を入力するからこそ、複数行を一単位とみなした高度な条件記述ができる。

述語論理には、量子化と呼ばれる述語があり、
①「全称量化子」⇒ 全てのxは条件Pを満たす (for All x, 〜)
②「存在量子化」⇒ 条件Pを満たすxが(少なくとも1つ)存在する (there Exists x that 〜)
という2つを意味を含有している。
EXISTS述語は②の「存在量子化」を実装した述語。「じゃ、全称量化子は・・・」となるが、残念ながらSQLには①の「全称量化子」を実装した述語が存在しない。じゃ、全称量化子(全てのxは条件Pを満たす)を実装したかったらどうするのか?
答えは②の「存在量子化(=EXISTS述語)」を使った二重否定で表現すること。
つまり、

全ての行について条件Pを満たす = 条件Pを満たさない(否定1回目)行が1つも存在しない(否定2回目)

と命題を言い換える必要があるということ。

ケーススタディ(学校の生徒とテストの点数)

全ての教科が50点以上の生徒はだれ?

全ての教科が50点以上 = 50点以上でない(50点未満)subjectが1つも存在しない

数学の点数が80点以上、国語の点数が50点以上の生徒はだれ?

数学の点数が80点以上、国語の点数が50点以上
= 数学の点数が80点未満で、国語の点数が50点未満のsubjectが存在しない

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0
ABOUT ME
chopes
前職では、人材業界で法人営業・キャリアアドバイザー・大阪責任者をしていました。他にも、新入社員の研修策定と育成、面談者の集客におけるスカウト業務や中途採用の面接官、新卒採用の2次選考官、インターンシップのメンターとしてプログラムに参加していました。退職後は、未経験でエンジニアになるためにスクールに通学して勉強。2ヶ月の転職活動を経て、今春からRailsエンジニアとして第二のキャリアを歩むことになりました。主に学習記録や未経験エンジニアについてアウトプットしていきたいと思います! 以下、Twitterアカウントですので、気軽にフォローしてください! Twitter:@chopesu_se