データベース(PostgreSQL)

# PostgreSQLとは
- RDBMS(リレーショナルデータベース管理システム)
<img width="100" alt="スクリーンショット 2022-08-26 17 33 48" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495496/c04c4ac5-7d32-23c2-d5e6-2a93381bd90d.jpeg">

　※RDBとは、テーブル(エクセルみたいな)という形でデータを返します。
　　複数のテーブルを関連づけることができる

# ローカルからPostgreSQLに接続する方法
```
$ psql -h localhost -p 5432 -U postgres -d postgres
```
https://www.javadrive.jp/postgresql/connect/index2.html

### ローカルに戻るコマンド
```
postgres=# \q
```



## 途中で終了する場合はセミコロンで終了できる。
```
postgres=# k
postgres-# ;
ERROR:  syntax error at or near "k"
LINE 1: k
        ^
postgres=# 
```



## テーブル作成
`$ create table posts (title varchar(255), body text);`
```
postgres=# create table posts (title varchar(255), body text);
CREATE TABLE
```

`$ ¥dt`
※テーブル一覧
```
postgres=# \dt
         List of relations
 Schema | Name  | Type  |  Owner   
--------+-------+-------+----------
 public | posts | table | postgres
(1 row)
```


`$ ¥d posts`
※テーブルのカラムを表示する
```
postgres=# \d posts
                       Table "public.posts"
 Column |          Type          | Collation | Nullable | Default 
--------+------------------------+-----------+----------+---------
 title  | character varying(255) |           |          | 
 body   | text                   |           |          | 
```

`$ alter table posts rename to myposts;`
※テーブル名前変更
```
postgres=# alter table posts rename to myposts;
ALTER TABLE
```

`$ drop table myposts;`
※テーブル削除
```
postgres=# drop table myposts;
DROP TABLE
```

`外部ファイルを使用する方法`
```
postgres=# \i commands.sql
※ターミナル開いてcommands.sqlファイルを作成して、ファイルの中身に
create table posts (title varchar(255), body text);
を記載して、上記コマンドを実行するとテーブルが作成される
```

# データの型
- 数値: integer(int),real(実数),serial(連番)
- 文字: char(5)-固定文字の場合, varchar(255)-上限付きの可変長,
※読み方、char = キャラ
- 真偽: boolean TRUE FALSE　 t　 f
- 日付: date(日付), time(時間),timestamp(両方)
　
# フィールドに制約をつけてみよう
- 制約
  * not null(入力必須のものにつける)
  * unique(重複した値を許さない、同じEメールアドレスを許さない)
  * check(内容をチェックする)
  * default
  * primary key,(not null, unique)(一意に決めるための主キー)
 ※テーブルにつき1つだけしか設定できない

```
create table posts(
    id serial primary key,(一意に決まるもの)
    title varchar(255) not null,(タイトルが体と困る)
    body text check(length(body) > 5),(五文字以上)
    is_draft boolean default TRUE,
    created timestamp default 'now',(現在時刻に設定)
);
```

# insert文を使ってみよう
`insert into posts (title, body) values ('title', 'body1111'); `
```
postgres=# insert into posts (title, body) values ('title', 'body1111');
INSERT 0 1
```

`select * from posts;`
※全てのレコードを見ることができる
```
postgres=# select * from posts;
 title |   body
-------+----------
 title | body1111
(1 row)
```

# select文を使ってみよう
`値を追加`
```
postgres=# create table users (
    id serial primary key,
    name varchar(255),
    score real,
    team varchar(255)
);
insert into users (name, score, team) values
('aa', 5.5, 'red'),
('ss', 8.3, 'blue'),
('dd', 2.2, 'blue'),
('ff', 5.0, 'green'),
('gg', 4.6, 'red'),
('hh', 4.7, 'green');
CREATE TABLE
postgres-# \dt
         List of relations
 Schema | Name  | Type  |  Owner
--------+-------+-------+----------
 public | posts | table | postgres
 public | users | table | postgres
(2 rows)
```

`$ \d users`
フィールドが設定されていることを確認
※`$ \x`、拡張表示はonです。表示がいつもと違う形に　なる、`\x`2回入力すると戻る

```
postgres-# \d users
                                    Table "public.users"
 Column |          Type          | Collation | Nullable |              Default
--------+------------------------+-----------+----------+-----------------------------------
 id     | integer                |           | not null | nextval('users_id_seq'::regclass)
 name   | character varying(255) |           |          |
 score  | real                   |           |          |
 team   | character varying(255) |           |          |
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
```

`$ select * from users; `
※全てのフィールドを表示する
```
postgres=# select * from users;
 id | name | score | team
----+------+-------+-------
  1 | aa   |   5.5 | red
  2 | ss   |   8.3 | blue
  3 | dd   |   2.2 | blue
  4 | ff   |     5 | green
  5 | gg   |   4.6 | red
  6 | hh   |   4.7 | green
(6 rows)
```

`$ select name, score from users; `
※全てのフィールドを表示する
```
postgres=# select name, score from users;
 name | score
------+-------
 aa   |   5.5
 ss   |   8.3
 dd   |   2.2
 ff   |     5
 gg   |   4.6
 hh   |   4.7
(6 rows)
```

# where句を使ってみよう
`$ select * from users where score > 4.0;`
※ **scoreが4以上のものを抽出する**
```
postgres=# select * from users where score > 4.0;
 id | name | score | team
----+------+-------+-------
  1 | aa   |   5.5 | red
  2 | ss   |   8.3 | blue
  4 | ff   |     5 | green
  5 | gg   |   4.6 | red
  6 | hh   |   4.7 | green
(5 rows)
```
>`$ select * from users where score = 5.0;`
※scoreが5のものを抽出する
`$ select * from users where score ！= 5.0;`
※scoreが5以外のものを抽出する
など、

`$ select * from users where name = 'ff';`
※ **文字列に関して抽出する**
```
postgres=# select * from users where name = 'ff'
postgres-# ;
 id | name | score | team
----+------+-------+-------
  4 | ff   |     5 | green
(1 row)
```

`$ select * from users where name like '%a';`
※ **%i = 最後にaがつくものを抽出する**
```
postgres=# select * from users where name like '%a'
postgres-# ;
 id | name | score | team
----+------+-------+------
  1 | aa   |   5.5 | red
(1 row)
```

>`$ select * from users where name like 'h_h';`
※ h_h = 最初と最後の文字を指定して抽出が可能 

# order by、limit、offsetを使おう
`$ select * from users order by score;`
※ **フィールドごとの並び替え(小さい順)**
```
postgres=# select * from users order by score;
 id | name | score | team
----+------+-------+-------
  3 | dd   |   2.2 | blue
  5 | gg   |   4.6 | red
  6 | hh   |   4.7 | green
  4 | ff   |     5 | green
  1 | aa   |   5.5 | red
  2 | ss   |   8.3 | blue
(6 rows)
```

`$ select * from users order by score desc;`
※ **scoreごとの並び替え(大きい順)**
```
postgres=# select * from users order by score desc;
 id | name | score | team
----+------+-------+-------
  2 | ss   |   8.3 | blue
  1 | aa   |   5.5 | red
  4 | ff   |     5 | green
  6 | hh   |   4.7 | green
  5 | gg   |   4.6 | red
  3 | dd   |   2.2 | blue
(6 rows)
```

`$ select * from users order by team;`
※ **チームごと並び替え(アルファベット順)**
```
postgres=# select * from users order by team
postgres-# ;
 id | name | score | team
----+------+-------+-------
  2 | ss   |   8.3 | blue
  3 | dd   |   2.2 | blue
  4 | ff   |     5 | green
  6 | hh   |   4.7 | green
  1 | aa   |   5.5 | red
  5 | gg   |   4.6 | red
(6 rows)
```


`$ select * from users order by team, score desc;`
※ **チーム内でscoreが　大きい順に並べたい**
```
postgres=# select * from users order by team, score desc;
 id | name | score | team
----+------+-------+-------
  2 | ss   |   8.3 | blue
  3 | dd   |   2.2 | blue
  4 | ff   |     5 | green
  6 | hh   |   4.7 | green
  1 | aa   |   5.5 | red
  5 | gg   |   4.6 | red
(6 rows)
```

## 件数を制限したい場合,limit
`$ select * from users limit 3;`
※　**最初の三件だけを表示してくれる**
```
postgres=# select * from users limit 3;
 id | name | score | team
----+------+-------+------
  1 | aa   |   5.5 | red
  2 | ss   |   8.3 | blue
  3 | dd   |   2.2 | blue
(3 rows)
```

`$ select * from users limit 3 offset 3;`
※　**項目の4から表示させる場合**、
```
postgres=# select * from users limit 3 offset 3;
 id | name | score | team
----+------+-------+-------
  4 | ff   |     5 | green
  5 | gg   |   4.6 | red
  6 | hh   |   4.7 | green
(3 rows)
```

`$ select * from users order by score desc limit 3;`
※ **ハイスコアランキングで3人だけ表示させたい**
```
postgres=# select * from users order by score desc limit 3;
 id | name | score | team
----+------+-------+-------
  2 | ss   |   8.3 | blue
  1 | aa   |   5.5 | red
  4 | ff   |     5 | green
(3 rows)
```

# レコードを集計してみよう
`$ select * from users; `
※全てのフィールドを表示する
```
postgres=# select * from users;
 id | name | score | team
----+------+-------+-------
  1 | aa   |   5.5 | red
  2 | ss   |   8.3 | blue
  3 | dd   |   2.2 | blue
  4 | ff   |     5 | green
  5 | gg   |   4.6 | red
  6 | hh   |   4.7 | green
(6 rows)
```

`$ select count(*) from users;`
※ **レコード件数が何件あるか知りたい場合は**
```
postgres=# select count(*) from users;
 count
-------
     6
(1 row)
```

`$ select distinct team from users;`
※ **team内で何色があるか知りたい場合は**
```
postgres=# select distinct team from users;
 team
-------
 blue
 red
 green
(3 rows)
```

`$ select sum(score) from users;`
※ **全体の合計を引っ張ってくる**
```
postgres=# select sum(score) from users;
 sum
------
 30.3
(1 row)
```

`$ select max(score) from users;`
※ **最大値を引っ張ってくる**
```
postgres=# select max(score) from users;
 max
-----
 8.3
(1 row)
```

`$ select avg(score) from users;`
※ **平均値を引っ張ってくる**
```
postgres=# select avg(score) from users;
        avg
-------------------
 5.049999992052714
(1 row)
```

`$ select team, sum(score) from users group by team;`
※ **スコアの合計値を出したいし、チームごとに出したい場合は**、
```
postgres=# select team, sum(score) from users group by team;
 team  | sum
-------+------
 blue  | 10.5
 red   | 10.1
 green |  9.7
(3 rows)
```

`$ select team, sum(score) from users group by team having sum(score) > 10.0;`
※ **集計した後のもに対してさらに条件をつけることができる、(having)**
  チームスコアの合計値が10より多いものだけ知りたい場合、
```
postgres=# select team, sum(score) from users group by team having sum(score) > 10.0;
 team | sum
------+------
 blue | 10.5
 red  | 10.1
(2 rows)
```
# 便利な関数を使ってみよう
`$ select * from users; `
※全てのフィールドを表示する
```
postgres=# select * from users;
 id | name | score | team
----+------+-------+-------
  1 | aa   |   5.5 | red
  2 | ss   |   8.3 | blue
  3 | dd   |   2.2 | blue
  4 | ff   |     5 | green
  5 | gg   |   4.6 | red
  6 | hh   |   4.7 | green
(6 rows)
```

`$ select name, length(name) from users;`
※ **名前の文字数を調べたい場合**、
```
postgres=# select name, length(name) from users;
 name | length
------+--------
 aa   |      2
 ss   |      2
 dd   |      2
 ff   |      2
 gg   |      2
 hh   |      2
(6 rows)
```

`$ select concat(name, ' (', team, ')') from users;`
※ **文字列の連結**、
  名前の後に、チームの名前を入れたいという場合、
```
postgres=# select concat(name, ' (', team, ')') from users;
 aa (red)
 ss (blue)
 dd (blue)
 ff (green)
 gg (red)
 hh (green)
```


`$ select concat(name, ' (', team, ')') as namelabel from users;`
※ **ラベルを変える方法**、
```
postgres=# select concat(name, ' (', team, ')') as namelabel from users;
 aa (red)
 ss (blue)
 dd (blue)
 ff (green)
 gg (red)
 hh (green)
```

`$ select substring(team, 1, 1) from users;`
※ **チームの1文字目しか必要なかった場合**、
```
postgres=# select substring(team, 1, 1) from users;
 r
 b
 b
 g
 r
 g
```


`$ select *from users order by random() limit 1;`
※ **ランダムに1人抽出してくれる**
```
postgres=# select *from users order by random() limit 1;
  4 | ff   |     5 | green

postgres=# select *from users order by random() limit 1;
  5 | gg   |   4.6 | red

postgres=# select *from users order by random() limit 1;
  4 | ff   |     5 | green
```


# updete、deleteを使ってみよう
`$ select * from users; `
※全てのフィールドを表示する
```
postgres=# select * from users;
 id | name | score | team
----+------+-------+-------
  1 | aa   |   5.5 | red
  2 | ss   |   8.3 | blue
  3 | dd   |   2.2 | blue
  4 | ff   |     5 | green
  5 | gg   |   4.6 | red
  6 | hh   |   4.7 | green
(6 rows)
```

`$ update users set score = 5.8 where name = 'aa';`
※ **scoreを変えたい場合**、
テーブル名を指定した後に、[set]として、変更したいフィールドを書いて、その後にに値を = で結びつける
```
postgres=# update users set score = 5.8 where name = 'aa';
UPDATE 1
postgres=# select * from users;
 id | name | score | team
----+------+-------+-------
  2 | ss   |   8.3 | blue
  3 | dd   |   2.2 | blue
  4 | ff   |     5 | green
  5 | gg   |   4.6 | red
  6 | hh   |   4.7 | green
  1 | aa   |   5.8 | red
(6 rows)
```

`$ update users set score = score + 1 where team = 'red';`
※ **スコアを１増やして、ただしチームがredのもに限る場合**、
```
postgres=# update users set score = score + 1 where team = 'red';
UPDATE 2
postgres=# select * from users;
 id | name | score | team
----+------+-------+-------
  2 | ss   |   8.3 | blue
  3 | dd   |   2.2 | blue
  4 | ff   |     5 | green
  6 | hh   |   4.7 | green
  5 | gg   |   5.6 | red
  1 | aa   |   6.8 | red
(6 rows)
```


`$ update users set score = score + 1 where team = 'red' or team = 'green';`
※ **where句はandなどで条件をつなげることもできるので**、
　チームがredもしくはgreenの場合はスコアが1ずつあげる
```
postgres=# update users set score = score + 1 where team = 'red' or team = 'green';
UPDATE 4
postgres=# select * from users;
 id | name | score | team
----+------+-------+-------
  2 | ss   |   8.3 | blue
  3 | dd   |   2.2 | blue
  4 | ff   |     6 | green
  6 | hh   |   5.7 | green
  5 | gg   |   6.6 | red
  1 | aa   |   7.8 | red
(6 rows)
```

`$ delete from users where score < 3.0;`
※ **スコアが3より低い人を削除したい場合**、
```
postgres=# delete from users where score < 3.0;
DELETE 1
postgres=# select * from users;
 id | name | score | team
----+------+-------+-------
  2 | ss   |   8.3 | blue
  4 | ff   |     6 | green
  6 | hh   |   5.7 | green
  5 | gg   |   6.6 | red
  1 | aa   |   7.8 | red
(5 rows)
```
# テーブルの構造を変更してみよう
- まずはこういった型で用意されていることを確認
```
postgres=# \d users;
                                    Table "public.users"
 Column |          Type          | Collation | Nullable |              Default
--------+------------------------+-----------+----------+-----------------------------------
 id     | integer                |           | not null | nextval('users_id_seq'::regclass)
 name   | character varying(255) |           |          |
 score  | real                   |           |          |
 team   | character varying(255) |           |          |
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
```

`$ alter table users add fullname varchar(255);`
※ **フィールドを追加する場合**、
```
postgres=# alter table users add fullname varchar(255);
ALTER TABLE
postgres=# \d users;
                                     Table "public.users"
  Column  |          Type          | Collation | Nullable |              Default
----------+------------------------+-----------+----------+-----------------------------------
 id       | integer                |           | not null | nextval('users_id_seq'::regclass)
 name     | character varying(255) |           |          |
 score    | real                   |           |          |
 team     | character varying(255) |           |          |
 fullname | character varying(255) |           |          |
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
```


`$ alter table users drop fullname;`
※ **逆にフィールドを削除する場合**、
```
postgres=# alter table users drop fullname;
ALTER TABLE
postgres=# \d users;
                                    Table "public.users"
 Column |          Type          | Collation | Nullable |              Default
--------+------------------------+-----------+----------+-----------------------------------
 id     | integer                |           | not null | nextval('users_id_seq'::regclass)
 name   | character varying(255) |           |          |
 score  | real                   |           |          |
 team   | character varying(255) |           |          |
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
```


`$ alter table users rename name to myname;`
※ **名前をnameからmynameに変更した場合**、
```
postgres=# alter table users rename name to myname;
ALTER TABLE
postgres=# \d users;
                                    Table "public.users"
 Column |          Type          | Collation | Nullable |              Default
--------+------------------------+-----------+----------+-----------------------------------
 id     | integer                |           | not null | nextval('users_id_seq'::regclass)
 myname | character varying(255) |           |          |
 score  | real                   |           |          |
 team   | character varying(255) |           |          |
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
```




`$ alter table users alter myname type varchar(32);`
※ **型す、文字数を変更したい場合**、
```
postgres=# alter table users alter myname type varchar(32);
ALTER TABLE
postgres=# \d users;
                                    Table "public.users"
 Column |          Type          | Collation | Nullable |              Default
--------+------------------------+-----------+----------+-----------------------------------
 id     | integer                |           | not null | nextval('users_id_seq'::regclass)
 myname | character varying(32)  |           |          |
 score  | real                   |           |          |
 team   | character varying(255) |           |          |
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
```



`$ create index team_index on users(team);`
- **teamにindexをつける方法**、
  * インデックスという、**テーブルについている索引**なのですがこれの追加、削除方法、
  * primary keyには最初からついているのですが、これがついていると**検索が早くなります**。
  * 運用していったらteamで検索されることが多かったので、**teamにインデックスをつけてみよう**

```
postgres=# create index team_index on users(team);
CREATE INDEX
postgres=# \d users;
                                    Table "public.users"
 Column |          Type          | Collation | Nullable |              Default
--------+------------------------+-----------+----------+-----------------------------------
 id     | integer                |           | not null | nextval('users_id_seq'::regclass)
 myname | character varying(32)  |           |          |
 score  | real                   |           |          |
 team   | character varying(255) |           |          |
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
    "team_index" btree (team)
```




`$ alter table users alter myname type varchar(32);`
※ **indexを削除する場合**、
```
postgres=# drop index team_index;
DROP INDEX
postgres=# \d users;
                                    Table "public.users"
 Column |          Type          | Collation | Nullable |              Default
--------+------------------------+-----------+----------+-----------------------------------
 id     | integer                |           | not null | nextval('users_id_seq'::regclass)
 myname | character varying(32)  |           |          |
 score  | real                   |           |          |
 team   | character varying(255) |           |          |
Indexes:
    "users_pkey" PRIMARY KEY, btree (id)
```



# 複数のテーブルを扱ってみよう
※ **複数テーブル作成**、
```
postgres=# create table users (
    id serial primary key,
    name varchar(255),
    score real,
    team varchar(255)
);
insert into users (name, score, team) values
('aa', 5.5, 'red'),
('ss', 8.3, 'blue'),
('dd', 2.2, 'blue'),
('ff', 5.0, 'green'),
('gg', 4.6, 'red'),
('hh', 4.7, 'green');

create table posts (
    id serial primary key,
    user_id int not null,
    title varchar(255) not null,
    body text not null
);
insert into posts (user_id, title, body) values
('1', 'title1', 'body1'),
('2', 'title2', 'body2'),
('3', 'title3', 'body3'),
('4', 'title4', 'body4'),
('5', 'title5', 'body5'),
('6', 'title6', 'body6');
```

`$ \d`
※ **作成されたことを確認**、
```
postgres=# \d
              List of relations
 Schema |     Name     |   Type   |  Owner
--------+--------------+----------+----------
 public | posts        | table    | postgres
 public | posts_id_seq | sequence | postgres
 public | users        | table    | postgres
 public | users_id_seq | sequence | postgres
(4 rows)

postgres=# select * from users;
 id | name | score | team
----+------+-------+-------
  1 | aa   |   5.5 | red
  2 | ss   |   8.3 | blue
  3 | dd   |   2.2 | blue
  4 | ff   |     5 | green
  5 | gg   |   4.6 | red
  6 | hh   |   4.7 | green
(6 rows)

postgres=# select * from posts;
 id | user_id | title  | body
----+---------+--------+-------
  1 |       1 | title1 | body1
  2 |       2 | title2 | body2
  3 |       3 | title3 | body3
  4 |       4 | title4 | body4
  5 |       5 | title5 | body5
  6 |       6 | title6 | body6
(6 rows)
```


`$ select users.name, posts.title from users, posts where users.id = posts.user_id;`
- **誰がどの記事を書いたか引っ張ってくる**、
  * 複数のテーブルから引っ張ってくるには、テーブル名とフィールド名を .(ドット)で繋いであげればOKです。
  * 結び付きを指定してあげないといけないので,whereをつけてuser.idとposts.user_idが一緒

```
postgres=# select users.name, posts.title from users, posts where users.id = posts.user_id;
 name | title
------+--------
 aa   | title1
 ss   | title2
 dd   | title3
 ff   | title4
 gg   | title5
 hh   | title6
(6 rows)
```



`$ select u.name, p.title from users u, posts p where u.id = p.user_id;`
※ **user = u, posts = p,省力する書き方**、
```
postgres=# select u.name, p.title from users u, posts p where u.id = p.user_id;
 name | title
------+--------
 aa   | title1
 ss   | title2
 dd   | title3
 ff   | title4
 gg   | title5
 hh   | title6
(6 rows)
```


`$ select u.name, p.title from users u, posts p where u.id = p.user_id and u.id=1`
- **ユーザーごとの記事一覧ページ作成**、
  * andでuserのidが1,つまり{aa}君のものしか知りたくないという場合は、このような条件句を与えること
```
postgres=# select u.name, p.title from users u, posts p where u.id = p.user_id and u.id=1;
 name | title
------+--------
 aa   | title1
(1 row)
```


# viewを使ってみよう
`$ create view aa_posts as (さっきのの長い文)`
- **長文をviewとして、簡単に出せるようにする**、
```
postgres=# create view aa_posts as
postgres-# select u.name, p.title from users u, posts p where u.id = p.user_id and u.id=1;
CREATE VIEW
postgres=# \dv
          List of relations
 Schema |   Name   | Type |  Owner
--------+----------+------+----------
 public | aa_posts | view | postgres
(1 row)
```


`$ select * from aa_posts;`
- **viewで作成したものを出す方法**、
```
postgres=# select * from aa_posts;
 name | title
------+--------
 aa   | title1
(1 row)
```

`$ drop view aa_post;`
- **viewを削除する場合**、
```
postgres=# drop view aa_posts;
DROP VIEW
postgres=# \dv
Did not find any relations.
```

# トランザクジョンを使ってみよう
- 複数の処理を必ずまとめて行う処理のこと

`$ begin;`
- **途中に変な処理がいってこない、不整合が起きないための仕組み**、
  * トランザクショの開始には[begin]として、その後に処理をいくつか書いていく
```
postgres=# begin;
BEGIN
postgres=*# update users set score = score -1.0 where name = 'aa';
UPDATE 1
postgres=*# update users set score = score +1.0 where name = 'ss';
UPDATE 1
postgres=*# commit;
COMMIT
```

`$ rollback;`
- **今までの変更をまとめて取り消される**、
```
postgres=# begin;
BEGIN
postgres=*# update users set score = score -1.0 where name = 'aa';
UPDATE 1
postgres=*# update users set score = score +1.0 where name = 'ss';
UPDATE 1
postgres=*# rollback;
ROLLBACK
```



---
---
---




# 1からnpmで立ち上げ
```
・npm init -y
パッケージ.jsを初期化して使用していく

・npm i express nodemon pg

・npm start
```
### server.jsファイル作成

```
const express = require("express");
const app = express();
const PORT = 5000;

app.listen(PORT, () => {
    console.log("server is runing on PORT" + PORT);
});
```
### API作成
```
const express = require("express");
const app = express();
const PORT = 5000;

app.get("/", (req, res) => {
    res.send("Hello Express");
});

app.listen(PORT, () => {
    console.log("server is runing on PORT" + PORT);
});

※reg=リクエスト
※res=レスポンス
```

> http://localhost:5000/
に接続できか確認

# PostgreSQLインストール

https://qiita.com/yuta-pharmacy2359/items/23325064a26e3e6a84c1

https://awesomecatsis.com/postgresql-mac-psql-relation/


# データベース作成
```
postgres=# CREATE DATABASE users;
※作成したら　/lでデータベース一覧表示、2個目の記事参照

## テーブルクリア
postgres=# ¥l cls

## テーブル作成
postgres=# ¥c users

### usersテーブル作成
users=# CREATE TABLE users (

##　フィールド作成
users(# ID serial primary key,
users(# name varchar(255),
users(# email varchar(255),
users(# age int);
※serial=連番
※primary key=主キー(ユーザーを代表する番号)
※varchar(255)=255文字以内(文字列)
※int=整数値

# テーブル確認
users(# ¥dt
```
<img width="100" alt="スクリーンショット 2022-08-26 17 33 48" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495496/54a1ad53-937a-dd61-5165-a413d7b6d7bd.jpeg">

# Mysqlを使用してデータ挿入(SQL文)
```
### usersテーブル中身作成
users=#　insert into users (name, email, age)
※insert=挿入

users-# values ('shincode', 'shinncode@gmail.com', 25), ('testUser', 'test@gmail.com', 34);

## 作成した情報を出力する方法
users=#　select * from users;
※ *=全て
```
<img width="100" alt="スクリーンショット 2022-08-26 17 33 48" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495496/628557a1-951d-0e5a-a956-407a22c05d60.jpeg">

>VScodeから作成したデータを取り出す、サーバと連携してどのように出力するのか

### db.js作成
```
const Pool = require("pg").Pool;

const pool = new Pool({
    user: "postgres",
    host: "localhost",
    database: "users",
    password: "password",
    port: 5432,
});

module.exports = pool;
```

### server.js追加
```
const express = require("express");
const app = express();
const PORT = 5000;

//jsonを使用する場合は、ミドルウェアの設定を行う必要がある
app.use(express.json());

app.get("/", (req, res) => {
    res.send("Hello Express");
});

//ユーザー情報を全て取得する
app.get("/users", (req, res) => {
    pool.query("SELECT * FROM users", (error, results) => {
        if (error) throw error;
        return res.status(200).json(results.rows);
    });
});

app.listen(PORT, () => {
    console.log("server is runing on PORT" + PORT);
});
```