January 19, 2009

達人に学ぶSQL徹底指南書 - 1.8

1.8 EXISTS述語の使い方

SQLの"述語論理"という側面について、初歩から噛み砕いて説明されている。いろいろ再発見があったので、頭で理解した内容をメモ。(体感するには豊富なサンプルコードと練習問題がためになる。)

--
1.EXISTSの数学的な意味

EXISTS は、言葉にすると"ある〜"(論理学用語でいうところの、存在量化子 ∃)と表現できる。
EXISTS と対になるはずの、"すべての〜"(論理学用語でいうところの、全称量化子 ∀)を直接表現する述語はSQLにはない。全称量化子と存在量化子(ド・モルガン則を使って)は互いに書き換え可能だから、理論的にはどちらかがあればよい、という理由から。(さぼってる・・・?)
→ NOT EXISTS (SELECT * FROM tbl WHERE ^条件) という二重否定で代用する。
→ 「すべて〜」という言葉が出てくると、SQLが途端にメンドウになるのはこのせい。

たしかに、"すべての〜"を表現する述語があれば、楽になるケースは多いかも。


--
2.条件分岐はやっぱりCASE式

"ある〜","すべての〜"に続く条件が分岐しているときは、CASE式の出番。

--
3.HAVING <-> EXISTS <-> ANY(IN)/ALL

集合論と述語論理は、おおざっぱにいって同じ対象を違う言葉で記述しているといえる(厳密には同じものではない。はず。勉強不足;;)。
SQL言語の言葉で言い直すと、
HAVING と EXISTS は変換可能(なことが多い)。

ではどっちがいいのか、というとそれぞれ一長一短というところ。

HAVING のよいところ。
  • コードが見やすい
EXISTS のよいところ。
  • パフォーマンスがよい
  • 集約しないので、HAVINGより結果の情報が細かい単位で出せる
さらに HAVING / EXISTS は、 スカラー値での存在量化子/全称量化子といえる ANY(IN), ALL を使って書き直すこともできる。




達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)
達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)
クチコミを見る


mocoh at 00:27コメント(0)トラックバック(0)技術書  

トラックバックURL

コメントする

名前
URL
 
  絵文字
 
 
記事検索
訪問者数
  • 今日:
  • 昨日:
  • 累計:

Amazonライブリンク
livedoor プロフィール

mocoh

  • ライブドアブログ