Beyond The Limit

はじまりは2001年

SQL学び直し11

第六章:関数、術語、CASE式

6-3:CASE式

  • 単純CASE式と検索CASE式の2種類がある、検索CASE式は単純CASE式の機能を全て含む
  • 検索CASE式は以下のような式になる
CASE WHEN <評価式> THEN <式>
          WHEN <評価式> THEN <式>...
          ELSE <式>
END
  • 最後のENDは必須、ELSEは省略しても良いが可読性が落ちるので省略しない

第七章:集合演算

7-1:テーブルの足し算と引き算

  • UNION、テーブルの足し算
    • select AAA from B union select CCC from D; というような感じになる、重複行を排除して各テーブルが合体されたものが表示される
    • UNION ALLで重複行も表示される
  • INTERSECT、テーブルの共通部分のみ抽出
    • select AAA from B intersect select CCC from D; というような感じになる、共通しているレコードのみ出力される
  • EXCEPT、レコードの引き算
    • select AAA from B except select CCC from D; というような感じになる、テーブルBからテーブルDと重複したものを排除して出力される

今日はここまで。

SQL学び直し10

第六章:関数、術語、CASE式

6-2:術語

  • 術語とは戻り値が真理値(TRUE/FALSE/UNKNOWN)のいずれかになるもの
  • LIKE検索にて、%は0文字以上の任意の文字列、_は任意の一文字を現す(__だと任意の2文字)
  • BETWEENは範囲検索
  • IS NULLはnullを検索、IS NOT NULLはnullを外して検索
  • INはORを省略したもの、IN(A,B,C)というように使う、AまたはBまたはCとなる
  • NOT INはINの否定、NOT IN(A,B,C)というように使う、AでもなくBでもなくCでもないものとなる
  • INにはサブクエリを利用することができる
  • IN( SELECT...)と記述する、括弧内の結果が複数行であっても全てORで検索対象にしてくれる
  • サブクエリを使ってSQLを組んでおけば、メンテナンスフリーの度合いが強まる
  • EXISTS術語は「ある条件に合致するレコードの存在有無」を調べる、あればTRUE、なければFALSEを返す
  • EXISTSの引数は常に相関サブクエリを指定する、常にSELECT *を使う

今日はここまで。

SQL学び直し9

第六章:関数、術後、CASE式

6-1:いろいろな関数

  • 関数は数が多いので代表的なものだけ覚える、他は使う時にリファレンスを見るようにする
  • COUNT、SUM、AVGなども関数の一つ(集約関数)
  • 文字列を結合する関数はパイプ、カラム1 || カラム2 from…という感じになる、3つでもいける
  • EXTRACTで日付の要素を切り出すことが出来る、切り出した後は日付型ではなく数値型になる
    • こんな使い方
SELECT CURRENT_TIMESTAMP,
       EXTRACT(YEAR   FROM CURRENT_TIMESTAMP) AS year,
       EXTRACT(MONTH  FROM CURRENT_TIMESTAMP) AS month,
       EXTRACT(DAY    FROM CURRENT_TIMESTAMP) AS day,
       EXTRACT(HOUR   FROM CURRENT_TIMESTAMP) AS hour,
       EXTRACT(MINUTE FROM CURRENT_TIMESTAMP) AS minute,
       EXTRACT(SECOND FROM CURRENT_TIMESTAMP) AS second;
  • nullを値に変換する際はCOALESCE関数を使う

Windowsがお亡くなりになったので、今日はここまで。
MacKindleが物凄く使いづらくてたまらない。

SQL学び直し8

第五章:複雑な問い合わせ

5-2:サブクエリ

  • サブクエリとは使い捨てのビュー
  • select ... from (select文を書く) as ビュー名、このビューは保存されない
    • fromの中のselect文が実行された後、外側のselect文が実行される
    • select ... from (asの後の)ビュー名となる
  • サブクエリの中にサブクエリを作って入れ子にすることも可能、内側のサブクエリから実行される
  • スカラ・サブクエリとは、戻り値が単一の値(単一行)になるサブクエリのこと
    • whereの=や<>の条件などと一緒に使用する
    • スカラ・サブクエリはwhere句以外の場所でも利用できる
    • スカラ・サブクエリが複数行を返すと、それはスカラ・サブクエリではなくただのサブクエリである

5-3:相関サブクエリ

  • 相関サブクエリは小分けにしたグループ内での比較をする時に使う
  • 相関サブクエリの結合条件はサブクエリの中に書かないとエラーになる
  • 結合条件はサブクエリの中に記述する


今日はここまで。

SQL学び直し7

第四章:データの更新

4-4:トランザクション

第五章:複雑な問い合わせ

5-1:ビュー

  • ビューを"作る際"order byは使えない、ビューを更新はできなくないが制限がある
  • ビューとテーブルはSELECTするだけであれば特に気にする必要が無い
  • テーブルはデータを保存・保持している、ビューはデータを保存・保持していない代わりにSELECT文を保持している
  • ビューは参照される度にSELECT文を実行し、一時的に仮想のテーブルを作成する
  • ビューの実行順序はビューに保持されたSELECT文が実行され、その後にFROMにビューを指定したSELECT文の内容が実行される
  • ビューを元にビューを作る、多段ビューも作成できるが、なるべくやらない。パフォーマンスが低下する。
  • postgres9.3だけど参考

今日はここまで。

SQL学び直し6

第四章:データの更新

4-2:データの削除(DELETE文の使い方)

  • DELETE文は行を削除、TRUNCATE文はテーブル全行を削除
    • `DELTE FROM テーブル名`よりも`TRUNCATE テーブル名`の方が処理が高速である

4-3:データの更新(UPDATE文の使い方)

  • UPDATE文を使えば、制約に引っかからない場合はNULLへ更新することも可能
  • `UPDATE テーブル名 SET 更新内容1,更新内容2...`とすることで、複数列の更新も可能、カンマで区切る
  • `UPDATE テーブル名 SET (更新列名1,更新列名2)=(更新データ1,更新データ2)...`とすることで、複数列の更新も可能、カンマと括弧使う


やっぱりUSキーボードよりJISキーボードの方が使いやすい。
慣れの問題もあるんだろうけど、使い慣れたモノを使うのが一番だと思う。

自宅の環境としては、

  • デスクトップのWin10(Win8Win8.1→Win10へアップグレード)
  • ノートのMacBookPro
  • 液晶2台+MacBookProで3面モニター

という無駄に変な環境なので、次期iMacが出たらiMacと液晶1台にして、WinはParalellsとかでまとめたいなぁ。
って夢をメモしておきます。

今日はここまで。

SQL学び直し5

第四章:データの更新

4-1:データの登録(INSERT文の使い方)

  • CREATE TABLE文でテーブルを作る際に"DEFAULT 値"でデフォルト値を決めておける
    • INSERT文を使う際は"DEFAULT"と入力することでデフォルト値が入る、明示的にDEFAULTを入れた方が良い
  • INSERT INTO テーブルA...SELECT FROM テーブルB文でテーブルBのデータをテーブルAにコピーすることができる
    • このSELECT文にはwhereやgoup byなどの条件も付与できる、ただしorder byは使っても意味が無い

今日はここまで。

SQL学び直し4

第三章:集約と並べ替え

3-4:検索結果を並べ替える

  • order by には複数カラムを指定出来る、左側から指定したカラムが優先されて並び変わる
  • ソートするキーにnullが含まれている場合は先頭か最後にまとめられる、DBMSによって変わる

今日はここまで。

SQL学び直し3

第三章:集約と並べ替え

3-3:集約した結果に条件を指定する

  • group byの後にhavingは書ける、whereは行に対する条件、havingはグループに対する条件を記述する
  • havingに記述できるのは、定数、集約関数、group byで指定した列名
  • whereでもhavingでもどちらでも結果が同じ場合があるかもしれないが、行に対する条件指定かグループに対する条件指定かを考えてSQLを組むべき


今日はここまで。

SQL学び直し2

第三章:集約と並べ替え

3-1:テーブルを集約して検索する

  • 集約関数は基本的にNULLを除外して集計する、ただしcount(*)のみNULLを含んだ全行を数える、count(カラム名)だとNULLが除外される
    • COUNTはレコード数を数える、SUMはデータの合計を返す
    • SUM/AVGの内訳はNULL値を除外して計算される、AVGに関しては分母からNULL値の行数が引かれて平均が計算される
    • countとdistinctを併用する場合はcount(distinct カラム名)となる、括弧内の処理が先に行われるため

3-2:テーブルをグループに切り分ける

  • group byとcountの組み合わせで分類ごとの行数(NULL含)が集計できる
  • from (where) group byという並びにしないといけない
  • NULLもグルーピングされる
  • group byを使う時はグルーピングするカラム、集約関数、定数以外はselect句に入れられない
  • group byを使う時はgroup by句に別名(as〜)は使えない(出来たとしても標準外なのでよくない)
  • group byは結果をソートしない、ランダムに出力する
  • whereの条件に集約関数(count、sum他)は使えない


今日はここまで。