オープンソースデータベース標準教科書 -PostgreSQL- を読んでみた
はじめに
この記事はオープンソースデータベース標準教科書 -PostgreSQL- を読んでみた感想をまとめました。
※書籍はこちらからダウンロードしました。
抜粋:
オープンソースデータベース標準教科書 (Ver.3.0.0)
LPI-Japan 発行
読んでみて思ったこと
無料なので、PostgreSQL勉強中の方はぜひ目を通してみると良いと思います。
というか、たった98ページしかないのですが、
普通に内容詰まってて、SQLに困った時や
あれ、トランザクションってなんだっけ?やリストアって?
となった時とかにも使えそう!
これが無料なんて正直ありがたいです🙏
しかもEPUB版をダウンロードすると、macユーザーであれば
「ブック」アプリから見れるのでおすすめ👍
現在私はデータベースの勉強を主に進めており、
最近だと、「達人に学ぶDB設計徹底指南書第2版」を読ませていただきました。
得た知識はまだ頭の中でうっすらとしているので
様々な本を読んでいくことでインプットが定着していけたらなと思っています。
この本で改めて自身が習得したこと(復習も兼ねて羅列します)
⚫︎表定義の修正はALTER TABLE
を使用する
上の画像のように、\h ALTER TABLE
を叩けばヒントが見れる👀
新しい列を追加する(=ADD COLUMN)ようなactionを指定することが可能。
ただし、表定義の修正は行わないのが原則。
⚫︎DROP TABLE
DROP TABLE
文は表と表データだけでなく、関連する索引やビューなど、その他のものも併せて削除してしまう。
表を再作成する場合、これらも再定義する必要があるため時間がかかるという問題が発生する。
→このような問題が起きないよう、行データだけを一括で削除する場合にはTRUNCATE
文を使用する。
⚫︎PostgreSQLとSELinuxの関係
COPY文はPostgreSQLがOS上にファイルを作成してデータをセーブする。
このファイル作成が、OS側のセキュリティを制御しているSELinuxによって拒否される場合があるそう。
ファイル"/home/postgres/customer.csv" を書き込み用にオープンできませんでした: 許可がありません”
SELinuxのログは/var/log/audit/audit.logに記録されている。
行いたい処理がSELinuxによって拒否される場合は、/tmpディレクトリのように拒否されない場所にファイルを作成する処理に変更するか、SELinuxの設定を適切に変更する必要がある。
⚫︎EXISTS演算子
SELECT文の中にSELECTを入れることができる
(例)
“ossdb=# SELECT * FROM prod;
prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 50
2 | りんご | 70
3 | メロン | 100
4 | バナナ | 30
(4 行)
ossdb=# SELECT * FROM orders;
order_id | order_date | customer_id | prod_id | qty
----------+----------------------------+-------------+---------+-----
1 | 2024-04-06 14:55:30.607262 | 1 | 1 | 10
2 | 2024-04-06 14:55:30.612462 | 2 | 2 | 5
3 | 2024-04-06 14:55:30.6152 | 3 | 3 | 8
4 | 2024-04-06 14:55:30.616348 | 2 | 1 | 3
5 | 2024-04-06 14:55:30.617621 | 3 | 2 | 4
(5 行)
ossdb=# SELECT prod_id,prod_name FROM prod
WHERE EXISTS (SELECT * FROM orders WHERE orders.prod_id = prod.prod_id);
prod_id | prod_name
---------+-----------
1 | みかん
2 | りんご
3 | メロン
(3 行)”
⚫︎IN演算子
副問い合わせの結果を主問い合わせのWHERE句の条件に対する値として実行できる。
(例)
ossdb=# SELECT prod_id FROM orders WHERE qty > 5;
prod_id
---------
1
3
(2 行)
ossdb=# SELECT prod_id,prod_name FROM prod
WHERE prod_id IN (SELECT prod_id FROM orders WHERE qty > 5);
prod_id | prod_name
---------+-----------
1 | みかん
3 | メロン
(2 行)
⚫︎アクセス権限確認
\dp データベース名
Discussion