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のコッドさんストラップ等 がほしいという方も話を受け付けます。 ご静聴、ありがとうございました。
© Copyright 2024 ExpyDoc