SQL実践入門第2章を読んだ
2章のまとめをやっていく。
postgresqlのインストール
macを利用しているので、homebrewを使ってインストールを行った。 また、インストール、初期設定にあたって以下のQiitaを参考にした。 https://qiita.com/_daisuke/items/13996621cf51f835494b
文字コードの初期化
$ initdb /usr/local/var/postgres -E utf8
サーバの起動
$ postgres -D /usr/local/var/postgres
ユーザの作成
$ createuser -P <pg-user>
dbの作成
$ createdb example-db -O <pg-user>
2章はじめに
RDBはテーブルを「リレーション」という単位で保持している(実装ではこれを「テーブル」と呼んでいる。) WHERE句に複雑な条件を指定する場合、見通しが悪くなったらベン図を描いてみるとうまく整理できる。
INでOR条件を簡略化
SELECT name, address FROM Address WHERE address = '東京都' OR address = '福島県', OR address = '千葉県'; ↓ SELECT name, address FROM Address WHERE address IN ('東京都', '福島県', '千葉県');
SELEC文は手続き型の関数
SELECT文は読み取り専用の関数 入力の型も出力の型も両方「リレーション」であり、それ以外の型の値を取ることは無い。
GROUP BY句
合計や平均などの集計演算をSQL文で行えるようになる
HAVING句
集約した結果に対してさらに絞り込みをかけるために使う。レコードの「集合」に対して条件指定を行う絞り込み機能。
ORDER BY句
SELECT文の結果について、レコードの並び順を保証したいならば明示的に順番を指定する必要がある。
ビューとサブクエリ
ビュー(View) SELECT文をデータベースに保存する機能 データベースに保存されるという点ではテーブルと同じなのだが、テーブルと違い中にデータを持つことはない。あくまでただの「SELECT文」を保存したもの。
サブクエリ FROM句に直接してするSELECT文のこと。(sub-下位の query-問い合わせ) また、SQLではサブクエリから順に実行される
// ビューの作成 CREATE VIEW CountAddress (v_address, cnt) AS SELECT address, COUNT(*) FROM Address GROUP BY address; // ビューからデータを選択する SELECT v_address, cnt FROM CountAddress; // ビューは実行時にSELECT文(サブクエリ)に展開される SELECT v_address, cnt FROM (SELECT address AS v_address, COUNT(*) AS cnt) FROM Address GROUP BY address) AS CountAddress;
SQLで集合演算
UNION 和集合
INTERSECT 積集合
EXCEPT 差集合
ウィンドウ関数
ウィンドウ関数とは大まかに言うと集約機能を省いたGROUP BY句(GROUPBY句のもつ「カット」と「集約」と言う2つの機能のうち、カットだけの機能を残したもの) パフォーマンス改善においても主要な役割を果たす
トランザクションと更新
SQLの更新機能は2種類に分類される - 挿入(INSERT) - 削除(DELETE) - 更新(UPDATE) (挿入と更新を合わせたマージという更新機能もある)
DELETEでデータを削除する
DELETE文における削除対象は列ではなく行なので、DELETE文で一部の列だけを削除しようとするとエラーになる。(DELETE文で列名を指定することはできない) もし一部の列だけを削除したいのであればUPDATE文を使って行う。