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文を使って行う。