メインセッション #2 SQLってどないやねん

SQLってどないやねん
こんな時どっちを使うの?
自己紹介
通称 : まつけん
本名 : まつけん
SE歴 : 10年目
得意とする言語 : b-shellスクリプト
C言語
SQL
今日のお題目
•
•
•
•
•
= NULL と IS NULL
DISTINCT と GROUP BY
IN と EXISTS
COUNT(*) と COUNT(カラム名)
UNION と UNION ALL
= NULL と IS NULL
なんで、IS NULL と書かなあかんねん。
• リレーショナル・データベースは、3値論理に基づいて実装されてい
•
•
•
•
ます。
3値論理とは、リレーショナル・データベースの生みの親のコッドさん
が提唱したもので、True, Falseに加え、unknownという値を組み合わ
せたものです。
3値論理では、NULLはTrue、False 両方とも比較するとNULLになり
ます。
したがって、= NULL はすべてFalse (結果が得られない)ということ
になるなあ、あ、じゃあどうやってNULLを抽出しよう?
→ じゃあ、IS NULLってかいちゃえば?
という感じで仕様が決められたのかどうかは知りません。
が、あきらめてIS NULLって書いてください。
余談:コッドさんってだれ?
エドガー・F・コッド
イギリス生まれの学者さんで、
リレーショナル・データベースを提唱した、
多分、すごい偉い人。
ちなみに、肖像画は、まつけんJr(3歳)に、コッドさん
書いてと依頼して書いてもらいました。
DISTINCT と GROUP BY
DISTINCTっているの?
別にGROUP BY で重複行を除けばいいやん。
• GROUP BYは、あくまで、抽出した結果を集計するために使います。
• そのため、重複行を除くためだけにGROUP BYを使われると、SQLの
意図がわかりづらくなります。
• せっかく、重複行を除くというDISTINCTがあるので、そっちを使いま
しょう。
IN と EXISTS
INとEXISTSってどう違うん?
• INは、値リストで一致するものがあるとTrue、EXISTSは、サブクエ
リーで指定された条件で一致するものがあるとTrueになります。
• 要するに、10、20、30などの固定値と比較するならIN、他のテーブ
ルの値と比較するならEXISTSを使いましょう。
※補足
特にNOT IN は、値リストの中にNULLがあると、絶対抽出されませ
ん。
例) WHERE カラム名 NOT IN ( ‘A’, ‘B’, NULL )
または
WHERE カラム名 NOT IN ( SELECT NULLを含む列 From … )
COUNT(*) と COUNT(カラム名)
COUNTの括弧の中は、なにを書いたらいいん?
• COUNT(カラム名)のほうが早いという都市伝説が昔ささやかれてい
ましたが、そんなことはありません。
• そもそも、COUNT(*)は、レコード数を返します。対して、COUNT(カラ
ム名)は、カラムに含まれるNULL以外のレコード数を返します。
• そう、結果からして変わってきます。
UNION と UNION ALL
UNION ALLってなに?
• UNION ALLとは、2つのSQLの結果を返します。
• 対して、UNION は、2つのSQLの結果から重複するものを除いたも
のを返します。
• したがって、UNIONは、ソート、重複除外というコストがかかるため、
パフォーマンスが悪くなる場合があります。
• 重複したデータがあってもよい、または絶対重複しない場合は、
UNION ALLを使いましょう。
緊急告知
ブログはじめました。
YAMAHA人間
http://yamahasuki.blogspot.com/
•
•
•
•
MotoGP等レースネタ
プラモデル製作記
その他データベース等の事なんかも書いています。
一応、この勉強会のことも書いていくので、よろしければ感想等をコ
メントしてください。
• 特に次回、データベースについてお話するので、こんな内容がいい
なあ等ありましたらぜひ。
• ちなみに、プラモデル製作依頼、まつけんJrのコッドさんストラップ等
がほしいという方も話を受け付けます。
ご静聴、ありがとうございました。