PostgreSQL を初めて使ってみる

## インストール

### For mac

```
$ brew install postgresql
```
  
以下のように出力されれば成功
  
```
~/M/p/postgres ❯❯❯❯❯  postgres --version
postgres (PostgreSQL) 10.1
```

### For CentOS

- [CentOSにPostgreSQL9.5をインストールおよびテスト](https://qiita.com/SOJO/items/a1d97887d24c3e44596f)

### For Ubuntu
- [UbuntuにPostgreSQLをインストール](https://qiita.com/kaitoii11/items/7acd24cce5315792931f)


<br>

## 使ってみる

### サーバの起動

```
$ postgres -D /usr/local/var/postgres
```

### サーバのデーモン起動 & 停止

- 起動  

```
$ pg_ctl start -D /usr/local/var/postgres
```
- 停止  

```
$ pg_ctl stop -D /usr/local/var/postgres
```

### データベースの一覧
```
$ psql -l
```


### データベースへの接続

```
$ psql -d database -U user -h host
```
- -d: データベース名(未指定の場合、ログインユーザー名のデータベースに接続)
- -U: ユーザ名(未指定の場合、ログインユーザー名)
- -h: ホスト名(未指定の場合、localhost)

<br>

## データベース接続時に使うコマンド

⚠️ `psql -d postgres` で接続したとする

### psqlから抜け出す

```
postgres=# \q
```

### ユーザー一覧の表示

```
postgres=# \du
```

### ユーザーの作成

```
postgres=# create user <username>
```

```
postgres=# CREATE ROLE <ロール名> WITH LOGIN PASSWORD '<パスワード>';
```

### ユーザーにパスワードを持たせる

```
postgres=# \password <username>
...
Enter new password:
Enter it again:
```


### データベース一覧の表示

```
postgres=# \l
```

### 他のデータベースに接続

```
postgres=# \c <dbname>
```

### データベースの作成
```
postgres=# create database <dbname>;
```

### テーブルの作成

以下をpsql内で実行する

```
CREATE TABLE Staff
(
id    CHAR(4)    NOT NULL,
name   TEXT       NOT NULL,
age    INTEGER    ,
PRIMARY KEY (id)
);
```
- MySQLで自動的な連番を格納するカラム(シリアル)を作りたいとき、AUTO_INCREMENTを対象カラムに設定する。
PostgreSQLでは、設定やオプションではなくserial型としてデータ型が準備されている。

以下のように書く

```
create table sample (
  id SERIAL,
  valeu integer
) ;
```


もしくはこれを`.sql`ファイルにかき、ファイルからコマンドを実行できる。
また、ファイルを作成し、`creatdb`というコマンドがあるのでそれでもいいと思われる
**`createdb`については以下に詳細をかく**

### テーブル一覧の表示

```
postgres=# \z
```

### テーブル定義の表示

```
postgres=# \d <tablename>
```

### ファイルからコマンド実行

```
postgres=# \i filename.sql
```

### 権限付与

```
postgres=# GRANT 権限名 ON DATABASE データベース名 TO ユーザ名;

postgres=# GRANT <権限の種類> ON <テーブル名> TO <ロール名>;

postgres=# GRANT 権限名 ON スキーマ名.テーブル名 TO ユーザ名;

```

### 履歴の表示

```
postgres=# \s
```
<br>

## テーブル操作一覧

### テーブル内のデータ一覧

```
select * from <tablename>;
```

### 指定したカラムの内容を小さい順に表示

```
select * from <tablename> order by <column>;
```

### 指定したカラムの内容を大きい順に表示

```
select * from <tablename> order by <column> desc;
```

### 表示数指定

```
select * from <tablename> limit <num>;
```

### 表示の開始位置指定

```
select * from <tablename> offset <num>;
```

### データ更新

```
update <tablename> set <contents of update>;
```

### カラムの追加

```
alter table <tablename> add <columnname> <datatype>;
```

### カラムの削除

```
alter table <tablename> drop <columnname>;
```

### カラムの型変更
```
alter table <tablename> alter column <columnname> type <datatype>
```


### カラムの変更

```
alter table テーブル名 rename <old_column_name> to <new_column_name>;
```

<br>

## createdb 

createdbは、新しいPostgreSQLデータベースを作成できる

通常、このコマンドを実行したデータベースユーザが、新しいデータベースの所有者になる。 ただ、コマンドを実行するユーザが適切な権限を持っている場合、-Oオプションを使用して別のユーザを所有者に指定することができる。

createdbはCREATE DATABASEというSQLコマンドのラッパです。 したがって、このユーティリティでデータベースを作成しても、これ以外の方法でサーバにアクセスしてデータベースを作成しても何も違いはない。


### オプション

#### dbname
- 作成するデータベースの名前を指定します。 この名前はクラスタ内の全てのPostgreSQLデータベースの中で一意でなければならない

#### -O owner
- 新しいデータベースの所有者となるデータベースユーザを指定する

以上以外のオプションが知りたい場合は以下を参照してください

[https://www.postgresql.jp/document/9.4/html/app-createdb.html](https://www.postgresql.jp/document/9.4/html/app-createdb.html)

<br>

## リファレンス
- [https://qiita.com/mm36/items/1801573a478cb2865242](https://qiita.com/mm36/items/1801573a478cb2865242)
- [https://www.postgresql.jp/document/9.4/html/app-createdb.html](https://www.postgresql.jp/document/9.4/html/app-createdb.html)
- [PostgreSQLコマンドチートシート](https://qiita.com/Shitimi_613/items/bcd6a7f4134e6a8f0621)