PostgreSQLのインストール、挙動確認までの手順

## 概要
* PostgreSQLのインストールやセットアップ、SQL Shellにてデータベース作成等を含めた挙動確認までの手順を記載。
* インストールを行う際初めてでも挙動確認まで完了できることを目的として作成。

# インストールの前に
### DB(データベース)とは
* 大量にあるデータを検索や蓄積が簡単にできるようにコンピューター上で整理したデータの集合体のこと。
* PostgreSQL、Oracle Database、Microsoft SQL Server、MySQL等。

### PostgreSQLとは
* Webシステムで使われることが多く、オープンソースで開発されているRDBMS（リレーショナルデータベース管理システム）の1つ。
* Linuxなど主要なUNIX系OSとWindowsに対応し、ライセンスコストがかからないこと、高品質なプログラムであることなどのメリットがある。
* 日本語にも対応し、商用に耐えうる機能の豊富さや性能、様々な要素をユーザー定義できる高い拡張性を備えている。

### SQL Shellとは
* データベースに対してSQLクエリを実行するための対話型のコマンドラインインターフェース（CLI）のこと。
* データベース管理システム（DBMS）が提供するツールやコマンドを使って、SQLコマンドを直接入力してデータベースと対話する。
* データベースの操作、クエリの実行、データベースの管理などの用途がある。

# PostgreSQLインストール手順
### ダウンロード
1. 日本PostgreSQLユーザ会
https://www.postgresql.jp/download
各OSごとのダウンロード先記載されている。今回OSはWindowsで進める。

2. Windows installers
https://www.postgresql.org/download/windows/
Interactive installer by EDBの下にあるDownload the installerという青文字を押す。

3. Download PostgreSQL
https://www.enterprisedb.com/downloads/postgres-postgresql-downloads
バージョンが一番新しいもののWindows x86-64を押す。
※2023/12/15現時点、16.1をダウンロード。


4. ファイルのダウンロード開始
### インストール開始
* ファイルを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/f45cd386-5c38-4b76-a5d0-f7ab9e07d49f.png)

* Setupのためのポップアップが表示される
※変更がない場合は基本的に「Next>」で進む。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/09f4c7c5-845a-1049-76e2-cb92a1b205ed.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/14ea1f99-fda4-b6ed-c2ce-b09998c757b1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/076f33cd-de48-8844-b965-d6f6d174f93a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/2f703ede-b202-1b73-a11e-caafc441efbb.png)

* Password登録画面が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/0f3e0da6-2b0d-7bd8-7d6a-dc5d09a5f9d8.png)

* 「Password」「Retype password」に同じ文字列をパスワードとして入力し、「Next>」を押す。
:::note warn
入力したパスワードは後の手順の中でも使用する重要なものなので、忘れないように。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/05f20822-b95a-46f2-cdd9-7545253c11fd.png) 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/aed126e5-6285-d50d-c8bd-c47312487e6f.png)

* Advanced Options画面が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/524c7161-811b-1544-c221-9584547e3fb8.png)

* 右横の「∨」より「Japanese, Japan」を選択し、「Next>」を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/54620401-e927-1e76-738f-63505c7cd387.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/619750c3-b36b-bf81-b254-c01c74d2a68a.png)

* インストールに移る画面が表示され、「Next>」を押すとインストールがスタートする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/c2cda196-3d9f-2214-dde7-46e3e0b93777.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/011a180e-5865-af88-2839-f27427c81897.png)

* インストールが完了すると以下のような画面が表示されるため、「Finish」で終了。
※「Finish」を押した後、スタックビルダが表示された場合は、「×」を押し、ウイザードを閉じる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/e2cdc216-ae0a-8b24-633a-19beba9aabb5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/2b064060-8b13-8222-10a2-63303ee767ac.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/3d48e91a-5b5d-d0e4-c06c-f703fec5657f.png)


# SQL Shellにて挙動確認
### SQL Shellを起動する
* デスクトップの検索窓に「SQL」と入力すると、Postgresqlインストール時に自動でインストールされているSQL Shellが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/e29d95cf-99af-66f3-6bde-0263cda8d10e.png)
* 開くとServer [localhost]:と書かれた画面が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624672/d85e9537-a828-6b8f-71d7-b7ebc92d8554.png)


### データベース等の作成をする
* Server [localhost]:が表示されている状態でEnterキーを押していくと、以下のように一行ずつ文字列が表示されていく。
```
Server [localhost]:
Database [postgres]:
Port [5432]:
Username [postgres]:
Client Encoding [SJIS]:
ユーザー postgres のパスワード:
```

* 6行目の「ユーザー postgres のパスワード:」を表示した後、postgressqlインストール時に2回入力したパスワードを入力しEnterキーを押すと、以下のように表示される。
:::note warn
パスワードを入力したとしても「ユーザー postgres のパスワード:」の横には何も表示されない(入力した文字の確認ができない)ため注意。
:::
```
ユーザー postgres のパスワード:
psql (16.1)
"help"でヘルプを表示します。

postgres=# 
```
:::note info
パスワードを入力しないまま＆間違えて入力したままEnterキーを押すと、以下のような表示がでるため先に進めない。
:::
```
ユーザー postgres のパスワード:
psql: エラー: "localhost"(::1)、ポート5432のサーバーへの接続に失敗しました: fe_sendauth: no password supplied
続行するには何かキーを押してください . . .
```

#### データベース作成
* 「testdb」というデータベースを作成するため、先ほど表示された「postgres=# 」の横にCREATE文を入力。「CREATE DATABASE」が表示されるとデータベース作成完了。
```
postgres=# CREATE DATABASE testdb;
CREATE DATABASE


postgres=# 
```
:::note info
すでに作成されている場合は以下のような表示がでる。
:::

```
postgres=# CREATE DATABASE testdb;
ERROR:  データベース"testdb"はすでに存在します


postgres=#
```

* 「¥l」というデータベースの一覧を表示するコマンドを入力し、作成されたデータベースを表示。
```
postgres=# \l
                                                                      データベース一覧
   名前    |  所有者  | エンコーディング | ロケールプロバイダー |      照合順序      | Ctype(変換演算子)  | ICUロケール | ICUルール: |     アクセス権限
-----------+----------+------------------+----------------------+--------------------+--------------------+-------------+------------+-----------------------
 testdb    | postgres | UTF8             | libc                 | Japanese_Japan.932 | Japanese_Japan.932 |             |            |
 postgres  | postgres | UTF8             | libc                 | Japanese_Japan.932 | Japanese_Japan.932 |             |            |
 template0 | postgres | UTF8             | libc                 | Japanese_Japan.932 | Japanese_Japan.932 |             |            | =c/postgres          +
           |          |                  |                      |                    |                    |             |            | postgres=CTc/postgres
 template1 | postgres | UTF8             | libc                 | Japanese_Japan.932 | Japanese_Japan.932 |             |            | =c/postgres          +
           |          |                  |                      |                    |                    |             |            | postgres=CTc/postgres
(4 行)


postgres=#
```

* データベースへの接続を意味する「¥c」とデータベース名である「testdb」を以下のように入力。データベースの接続が切り替わり、postgres=#からtestdb=#へ表示が変化したことが確認できる。 
```
postgres=# \c testdb
データベース"testdb"にユーザー"postgres"として接続しました。


testdb=#
```

* 「¥dn」で対象のデータベースに作成済みのスキーマ一覧を表示し確認。
```
testdb=# \dn
        スキーマ一覧
  名前  |      所有者
--------+-------------------
 public | pg_database_owner
(1 行)


testdb=#
```

#### スキーマ作成
* データベース同様CREATE文を用いて「edu_app1」というスキーマを作成。
```
testdb=# CREATE SCHEMA edu_app1;
CREATE SCHEMA


testdb=#
```

* 再度「¥dn」を入力し、スキーマ一覧を表示。作成が完了していることを確認。
```
testdb=# \dn
         スキーマ一覧
   名前   |      所有者
----------+-------------------
 edu_app1 | postgres
 public   | pg_database_owner
(2 行)


testdb=# 
```

#### テーブル作成
* CREATE文を用いてedu_app1スキーマ内に「user」というテーブルを作成。更にこのテーブルにidとnameという2つの列(カラム)を生成。
:::note info
idのINTEGERは整数型で、nameのvarchar(30)は30文字までの可変長文字列型を意味する。
:::
```
testdb=# CREATE TABLE edu_app1.user(id INTEGER, name varchar(30));
CREATE TABLE
testdb=# \dt edu_app1.*
           リレーション一覧
 スキーマ | 名前 |  タイプ  |  所有者
----------+------+----------+----------
 edu_app1 | user | テーブル | postgres
(1 行)


testdb=# 
```

* INSERT文を用いてedu_app1スキーマのuserテーブル内に、id列に0、name列に'00-name'という値を持つ新しい行(レコード)を挿入。
:::note info
INSERT 0 1というメッセージの場合は「1行が挿入された」、INSERT 0 0の場合は「0行が挿入された（挿入されなかった）」ことを示す。
:::
```
testdb=# INSERT INTO edu_app1.user(id,name)values (0,'01-佐藤 健太');
INSERT 0 1
testdb=#
```

* 更に行を追加。
```
testdb=# INSERT INTO edu_app1.user(id,name)values (1,'02-加藤 涼子');
INSERT 0 1
testdb=# INSERT INTO edu_app1.user(id,name)values (2,'03-山田 太郎');
INSERT 0 1
testdb=#
```

* SELECT文を用いて、edu_app1スキーマのuserテーブルの列と行を全て検索し表示。挿入した行が全て表示されていることを確認。
```
testdb=# SELECT * FROM edu_app1.user;
 id |     name
----+--------------
  0 | 01-佐藤 健太
  1 | 02-加藤 涼子
  2 | 03-山田 太郎
(3 行)


testdb=#
```

:::note info
列(今回でいうid,name)をどれかに指定して表示させたい場合は以下のように指定。複数指定の場合は「,」を使用して指定。
:::
```
testdb=# SELECT id FROM edu_app1.user;
 id
----
  0
  1
  2
(3 行)


testdb=#
```
```
testdb=# SELECT id,name FROM edu_app1.user;
 id |     name
----+--------------
  0 | 01-佐藤 健太
  1 | 02-加藤 涼子
  2 | 03-山田 太郎
(3 行)


testdb=#
```
#### テーブルの行の削除
* テーブル内をリセットしたい時はDELETE文を用いる。
DELETE FROMでテーブル内の行全てを削除する。
```
testdb=# DELETE FROM edu_app1.user;
DELETE 2
testdb=# SELECT * FROM edu_app1.user;
 id | name
----+------
(0 行)
```
### 入力したコマンドとその結果(全体)
```
Server [localhost]:
Database [postgres]:
Port [5432]:
Username [postgres]:
Client Encoding [SJIS]:
ユーザー postgres のパスワード:
psql (16.1)
"help"でヘルプを表示します。

postgres=# CREATE DATABASE testdb;
CREATE DATABASE
postgres=# \l
                                                                      データベース一覧
   名前    |  所有者  | エンコーディング | ロケールプロバイダー |      照合順序      | Ctype(変換演算子)  | ICUロケール | ICUルール: |     アクセス権限
-----------+----------+------------------+----------------------+--------------------+--------------------+-------------+------------+-----------------------
 testdb    | postgres | UTF8             | libc                 | Japanese_Japan.932 | Japanese_Japan.932 |             |            |
 postgres  | postgres | UTF8             | libc                 | Japanese_Japan.932 | Japanese_Japan.932 |             |            |
 template0 | postgres | UTF8             | libc                 | Japanese_Japan.932 | Japanese_Japan.932 |             |            | =c/postgres          +
           |          |                  |                      |                    |                    |             |            | postgres=CTc/postgres
 template1 | postgres | UTF8             | libc                 | Japanese_Japan.932 | Japanese_Japan.932 |             |            | =c/postgres          +
           |          |                  |                      |                    |                    |             |            | postgres=CTc/postgres
(4 行)


postgres=# \c testdb
データベース"testdb"にユーザー"postgres"として接続しました。
testdb=# \dn
        スキーマ一覧
  名前  |      所有者
--------+-------------------
 public | pg_database_owner
(1 行)


testdb=# CREATE SCHEMA edu_app1;
CREATE SCHEMA
testdb=# \dn
         スキーマ一覧
   名前   |      所有者
----------+-------------------
 edu_app1 | postgres
 public   | pg_database_owner
(2 行)


testdb=# CREATE TABLE edu_app1.user(id INTEGER, name varchar(30));
CREATE TABLE
testdb=# \dt edu_app1.*
           リレーション一覧
 スキーマ | 名前 |  タイプ  |  所有者
----------+------+----------+----------
 edu_app1 | user | テーブル | postgres
(1 行)


testdb=# INSERT INTO edu_app1.user(id,name)values (0,'01-佐藤 健太');
INSERT 0 1
testdb=# INSERT INTO edu_app1.user(id,name)values (1,'02-加藤 涼子');
INSERT 0 1
testdb=# INSERT INTO edu_app1.user(id,name)values (2,'03-山田 太郎');
INSERT 0 1
testdb=# SELECT * FROM edu_app1.user;
 id |     name
----+--------------
  0 | 01-佐藤 健太
  1 | 02-加藤 涼子
  2 | 03-山田 太郎
(3 行)
```