【PostgreSQL】ポケモンずかんをつくってSQLを学ぶ1（テーブルを作成）

##はじめに
この記事はPostgreSQLの勉強のアウトプットにポケモンずかんをつくりながら学びを深める試みです。pgAdminで作業をしているためご了承ください。
また登録されるポケモンの順序などは実際のポケモン図鑑の順番とは違いがありますので宜しくおねがいします。

####過去の記事
現在までの操作を記事化してたら謎にシリーズ化し始めてます。

- → 現在の記事はここです
- [【PostgreSQL】ポケモンずかんをつくってSQLを学ぶ2（データの登録・変更）](https://qiita.com/takahirocook/items/29945efdb41e030874eb)
- [【PostgreSQL】ポケモンずかんをつくってSQLを学ぶ3（データを取り出す）](https://qiita.com/takahirocook/items/89aba8585dcd42dd310f)

筆者はポケモン第２世代までしかわからないですし、SQL初学者のため謎の動きもするかとおもいますが、それも生々しく残しながら楽しく学習していきます。

##データベースを作る
まずは大元となるポケモン図鑑のデータベース本体を作成する。
今回の場合、ポケモン図鑑は海外では**「pokedex」**というらしいので、今回作るデータベース名は**「pokedex」**とします。

- pgAdminの場合は `データベース（右クリック）→ 作成 → データベース`
- ターミナルの場合は`createdb データベース名`。今回の場合は`createdb pokedex`となります。

##デーブルを作成する
###データ型で扱う
ポケモン図鑑に載せたいデータを洗い出します。
今回は **ナンバー(number)、なまえ(name)、ぶんるい(category)、タイプ1(type1)、タイプ2(type2)、たかさ(height)、おもさ(weight)、説明文(description)、作成日(created)**
を載せていこうと思います。

データ型には大きく４つの型が存在します。

- 文字列型
- 数値型
- 日付型
- 倫理/ビット型

これらを使い、それぞれに情報に適切なデータ型を用意します。

| 区分          | データ型             | 用途例                                           | 
| ------------- | -------------------- | ------------------------------------------------ | 
| 文字列型      | char(固定長数)       | 郵便番号など、長さが一定のもの                   | 
| 文字列型      | varchar(可変長数)    | 人名やアイテム名など、長さが一定ではないもの     | 
| 文字列型      | text                 | セリフや長い文章など、最大文字数を指定しないもの | 
| 数値型        | int<br>(別名)integer | 整数。小数点を含まない数値                       | 
| 数値型        | double<br>(別名)real | 浮動小数点数                                     | 
| 数値型        | float                | 浮動小数点数                                     | 
| 数値型        | money                | 金銭や通貨の値を表す金額データ型                 | 
| 数値型        | serial               | 連番。図鑑のナンバーや登録番号など               | 
| 日付型        | date                 | 日付                                             | 
| 日付型        | time                 | 時刻                                             | 
| 日付型        | timestamp            | 日付と時刻                                       | 
| 論理/ビット型 | boolean              | 真偽値                                           | 

こちらのデータ型をつかい、それぞれのデータに当てはめると

- ナンバーは連番にしたいので **sereal**
- なまえは６文字以内の文字列にしたいので **varchar(6)**
- ぶんるいは６文字以内の文字列にしたいので **varchar(7)**
- タイプ1は5文字以内の文字列にしたいので **varchar(5)**
- タイプ2は5文字以内の文字列にしたいので **varchar(5)**
- たかさは小数点込みなので **float**
- おもさは小数点込みなので **float**
- 説明文は長文なので **text**
- 投稿日時はその時の日時にしたいので **timestamp**

といった感じに収めようと思います。

###制約をつける

こちらのデータに、「このデータは必須である」や、「重複ができない」などといった制約を与えることで、**入力のミスなどに気づきやすくなる**など扱いやすくなります。

| 制約        | 意味                                                                       | 用途                                                                                                                        | 
| ----------- | -------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | 
| not null    | 入力必須                                                                   | 入力しなくていいもの以外。                                                                                                  | 
| unique      | 値の重複を許さない                                                         | 同じユーザー名やメールアドレスなど                                                                                          | 
| check       | 条件をみたしているかチェックする                                           | （例） 説明文（description）テキストの文字が5文字以上であることをチェックする.<br>body text check(length(description) > 5), | 
| default     | デフォルトの値を決める                                                     | （例）現在時刻をデフォルトに設定する<br>created timestamp　default 'now'                                                    | 
| primary key | not nullとuniqueの両方の性質を持つ。<br>※一つのテーブルに１つしか設定不可 | （例）idを一意の値として設定する    id serial primary key,<br>                                                              | 

ポケモン図鑑登録の際に制約を当てはめるなら

- **`number`をprimary keyとして設定する。**
- **基本的にデータはほぼ全部入力必須。**
- **タイプ２を所持していないポケモンがいるため`type2`には制約を与えない。**

後々修正していくとはおもいますが、ひとまずはこの内容でテーブルを作成したいと思います！

###create文
これらを活用し、create table文でテーブルを作成します。create table文の書き方は以下です。

```
CREATE TABLE "テーブル名" (
カラム定義1,
カラム定義2,
カラム定義3,
 ...
)
```
そこからポケモン図鑑のテーブルを作っていきましょう

```sql
CREATE TABLE "pokemon" (	
	number serial primary key,
	name varchar(6) not null unique,
	category varchar(7) not null,
	type1 varchar(5) not null,
	type2 varchar(5),
	height float not null,
	weight float not null,
	description text check(length(description) > 5),
	created timestamp default 'now'
)
```
実行すればポケモン図鑑のテーブルができるはずです！

###select文でテーブルを確認する
テーブルができたかどうか、確認していきましょう。確認するコマンドはこちらです。

```sql
select * from pokemon;
```
作成できていましたかね？次からはテーブルの中にポケモンのデータをいれていきましょう。