PostgreSQLのSQLテンプレ

間違い等ががあれば、指摘お願いします。

# データベースの操作

## 作成
```
CREATE DATABASE データベース名;
```

## 消去
```
DROP DATABASE データベース名;
```


# テーブルの操作

## 作成
```
CREATE TABLE テーブル名(
列名１ 列の型 列の制約,
列名２ 列の型 列の制約,
...
テーブルの制約1, テーブルの制約2, ... );
```

## 消去
```
DROP TABLE テーブル名;
```

## 名前の変更
```
ALTER TABLE テーブル名 RENAME TO 変更後のテーブル名;
```



# 列の操作

## 追加
```
ALTER TABLE テーブル名 ADD COLUMN 列の名前 列の型 列の制約;
```

## 消去
```
ALTER TABLE テーブル名 DROP COLUMN 列の名前;
```



# 行の操作

## 追加
```
INSERT INTO テーブル名 (列１, 列２, ...) VALUES (値１, 値２, ...);
```

## 消去
```
DELETE FROM テーブル名
 WHERE 条件;
```

## すべてを消去
```
DELETE FROM テーブル名;
```
または、

```
TRUNCATE テーブル名;
```
`TRUNCATE`コマンドは、必ずすべての行を消去する。また、`DELETE`コマンドと違い、細かい制御はできない。が、その分、`DELETE`コマンドより早い。
`DELETE`文というのは、DML文の中でもかなり実行に時間がかかる処理であるため、すべての行を消去していい場合は`TRUNCATE`コマンドを使いましょう。

## 更新
```
UPDATE テーブル名
   SET 列名 = 式;
 WHERE 条件;
```

## 取り出す

### 取り出す
```
SELECT 列名１, 列名２, ...
  FROM テーブル名;
```

### すべてを取り出す
```
SELECT *
  FROM テーブル名;
```

### 別名をつけて、取り出す
```
SELECT 列名１ AS 別名,
       列名２ AS 別名,
       ...
  FROM テーブル名;
```

### 重複行を除いて、取り出す（DISTINCT）
```
SELECT DISTINCT 列名１, 列名２, ...
  FROM テーブル名;
```

### 条件を指定して、取り出す（WHERE）
```
SELECT 列名１, 列名２, ...
  FROM テーブル名
 WHERE 条件式;
```

### 集約関数を使って、取り出す

#### テーブルの行数を数える（COUNT）
```
SELECT COUNT(*)
  FROM テーブル名:
```

#### NULLを除外して、テーブルの行数を数える（COUNT）
```
SELECT COUNT(列名)
  FROM テーブル名:
```

#### 値の重複業を除外して、テーブルの行数を数える（COUNT）
```
SELECT COUNT(DISTINCT 列名)
  FROM テーブル名:
```

#### 合計を求める（SUM）
```
SELECT SUM(列名)
  FROM テーブル名:
```

#### 平均を求める（AVG）
```
SELECT AVG(列名)
  FROM テーブル名:
``` 

#### 最大値を求める（MAX）
```
SELECT MAX(列名)
  FROM テーブル名:
```

#### 最小値を求める（MIN）
```
SELECT MIN(列名)
  FROM テーブル名:
```

### グループに分けて、取り出す
```
SELECT COUNT(列名)
  FROM テーブル名
GROUP BY 列名１, 列名２, ...;
```

### グループに対して条件を指定して、取り出す
```
SELECT 列名１, 列名２, ...
  FROM テーブル名
GROUP BY 列名１, 列名２, ...
HAVING グループの値に対する条件
```

### 検索結果を並び替えて、取り出す
```
SELECT 列名１, 列名２, ...
  FROM テーブル名
ORDER BY 並び替えの基準となる列１, 並び替えの基準となる列２, ... [ASC/DESC]
```
|名前|機能|
|---|---|
|ASK|昇順
|DESC|降順|




## 

# コメント

## １行コメント
```
-- コメント文
```

## 複数コメント
```
/* コメント文
   コメント文 */
```


# 蛇足

## SQLの命令の種類
### DDL（Data Definition Language）
DDL（データ定義言語）は、データを格納する入れ物であるデータベースやテーブルなどを作成したり消去したりします。DDLに分類される命令は次のとおりです。

CREATE：データベースやテーブルなどを作成する。
DELETE：データベースやテーブルなどを消去する。
ALATER：データベースやテーブルなどの構成を変更する。

### DML（Data Manipulation Language）
DML（データ操作言語）は、テーブルの行を検索したり変更したりします。DMLに分類される命令は次のとおりです。

SELECT：テーブルから行を検索する
INSERT：テーブルに新規行を登録する
UPDATE：テーブルの行を更新する
DELETE：テーブルの行を消去する

### DCL（Data Control Language）
DCL（データ制御言語）は、データベースに対して行った変更を確定したり取り消したりします。そのほか、RDBMSのユーザーがデータベースにあるもの（テーブルなど）を操作する権限の設定も行います。DCLに分類される命令は次のとおりです。

COMMIT：テーブルに対して行った変更を確定する
ROLLBACK：テーブルに対して行った変更を取り消す
GRANT：ユーザーに操作の権限を与える
REVOKE：テーブルに対して行った変更を確定する

## 命名規則
SQLでは、大文字・小文字は区別されません。`SELECT`お書いても`select`と書いても同じように解釈されます。テーブル名や列名などについても同様です。
ただし、テーブルに登録されているデータについては、大文字・小文字が区別されます。例えば、「Computer」と登録したデータを「COMPUTER」や「computer」と同じように扱かったりはしません。

## NULLの扱い
### 演算におけるNULLの扱い
「NULLを含む演算」には注意してください。次の演算の結果はどうなると思いますか？
① 5 + NULL
② 210 * NULL
③ NULL / 3
④ NULL / 0
正解は「全部NULL」です。NULLを含んだ計算は、問答無用でNULLになるのです。このルールは④のNULLを0で割る演算にも適用されます。通常、「5 / 0」のように0で割ろうとするとエラーになりますが、NULLを0で割る場合だけはエラーにならずNULLになります。

とはいえ、NULLを0と同じとみなして、 5 + NULL = 5という結果がほしいケースはあります。そういうときはCOALESCE関数を使いましょう。COALESCE関数の使い方は[こちら](https://blog.amedama.jp/entry/2017/06/29/212830)。

### 比較演算子におけるNULL
```
 name | age
------+-----
alis  | NULL
bob   | 32
zeke  | 40
mark  | 22
```
上のテーブルに、次のような条件で行を取り出します。
① `age >= 30`
↓結果

```
 name | age
------+-----
bob   | 32
zeke  | 40
```

② `age <> 22`

```
 name | age
------+-----
bob   | 32
zeke  | 40
```

いずれの結果には、ageがNULLである「alis」の行は含まれていませんでした。この行は年齢（age）が不明（NULL）なので、「`age >= 20`」や「age <> 22」などの判定ができないのです。また、苦しまぎれに`age = NULL`という条件式を書いても、「alis」の行は取り出せません。

SQLにはNULLかどうか判別するための専用の演算子`IS NULL`が用意されてます。NULLの行を選択したいときは、`age IS NULL`という条件式を書きましょう。NULLでない行を取り出したいときは`IS NOT NULL`という演算子を使います。

### 論理演算子におけるNULL
NULLの論理値は「UNKNOWN」になります。なぜそうなるのか気になる方は、[こちら](https://codezine.jp/article/detail/532)を読んでください。



# 参考文献
・SQL 第2版 ゼロからはじめるデータベース操作